support PIE executable for PVAS
This commit is contained in:
@@ -83,6 +83,7 @@ struct program_load_desc {
|
|||||||
int stack_prot;
|
int stack_prot;
|
||||||
int pgid;
|
int pgid;
|
||||||
int cred[8];
|
int cred[8];
|
||||||
|
int reloc;
|
||||||
unsigned long entry;
|
unsigned long entry;
|
||||||
unsigned long user_start;
|
unsigned long user_start;
|
||||||
unsigned long user_end;
|
unsigned long user_end;
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
|
|||||||
|
|
||||||
desc = malloc(sizeof(struct program_load_desc)
|
desc = malloc(sizeof(struct program_load_desc)
|
||||||
+ sizeof(struct program_image_section) * nhdrs);
|
+ sizeof(struct program_image_section) * nhdrs);
|
||||||
|
memset(desc, '\0', sizeof(struct program_load_desc));
|
||||||
desc->shell_path[0] = '\0';
|
desc->shell_path[0] = '\0';
|
||||||
fseek(fp, hdr.e_phoff, SEEK_SET);
|
fseek(fp, hdr.e_phoff, SEEK_SET);
|
||||||
j = 0;
|
j = 0;
|
||||||
@@ -243,6 +244,8 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
|
|||||||
}
|
}
|
||||||
desc->pid = getpid();
|
desc->pid = getpid();
|
||||||
desc->pgid = getpgid(0);
|
desc->pgid = getpgid(0);
|
||||||
|
if(*interp_pathp)
|
||||||
|
desc->reloc = hdr.e_type == ET_DYN;
|
||||||
desc->entry = hdr.e_entry;
|
desc->entry = hdr.e_entry;
|
||||||
ioctl(fd, MCEXEC_UP_GET_CREDV, desc->cred);
|
ioctl(fd, MCEXEC_UP_GET_CREDV, desc->cred);
|
||||||
desc->at_phdr = load_addr + hdr.e_phoff;
|
desc->at_phdr = load_addr + hdr.e_phoff;
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ int prepare_process_ranges_args_envs(struct thread *thread,
|
|||||||
struct process *proc = thread->proc;
|
struct process *proc = thread->proc;
|
||||||
struct process_vm *vm = proc->vm;
|
struct process_vm *vm = proc->vm;
|
||||||
struct address_space *as = vm->address_space;
|
struct address_space *as = vm->address_space;
|
||||||
|
long delta = -1;
|
||||||
|
|
||||||
n = p->num_sections;
|
n = p->num_sections;
|
||||||
|
|
||||||
@@ -102,6 +103,19 @@ int prepare_process_ranges_args_envs(struct thread *thread,
|
|||||||
pn->sections[i].vaddr += interp_nbase;
|
pn->sections[i].vaddr += interp_nbase;
|
||||||
p->sections[i].vaddr = pn->sections[i].vaddr;
|
p->sections[i].vaddr = pn->sections[i].vaddr;
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
if(delta == -1){
|
||||||
|
if(pn->reloc){
|
||||||
|
delta = vm->region.user_start;
|
||||||
|
pn->at_phdr += delta;
|
||||||
|
pn->at_entry += delta;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
delta = 0;
|
||||||
|
}
|
||||||
|
pn->sections[i].vaddr += delta;
|
||||||
|
p->sections[i].vaddr = pn->sections[i].vaddr;
|
||||||
|
}
|
||||||
s = (pn->sections[i].vaddr) & PAGE_MASK;
|
s = (pn->sections[i].vaddr) & PAGE_MASK;
|
||||||
e = (pn->sections[i].vaddr + pn->sections[i].len
|
e = (pn->sections[i].vaddr + pn->sections[i].len
|
||||||
+ PAGE_SIZE - 1) & PAGE_MASK;
|
+ PAGE_SIZE - 1) & PAGE_MASK;
|
||||||
@@ -382,6 +396,14 @@ static int process_msg_prepare_process(unsigned long rphys)
|
|||||||
|
|
||||||
vm->region.user_start = pn->user_start;
|
vm->region.user_start = pn->user_start;
|
||||||
vm->region.user_end = pn->user_end;
|
vm->region.user_end = pn->user_end;
|
||||||
|
/* TODO: review this code
|
||||||
|
if(vm->region.user_end > USER_END)
|
||||||
|
vm->region.user_end = USER_END;
|
||||||
|
vm->region.map_start =
|
||||||
|
(vm->region.user_start +
|
||||||
|
(vm->region.user_end - vm->region.user_start) / 3) &
|
||||||
|
LARGE_PAGE_MASK;
|
||||||
|
*/
|
||||||
vm->region.map_start = (USER_END / 3) & LARGE_PAGE_MASK;
|
vm->region.map_start = (USER_END / 3) & LARGE_PAGE_MASK;
|
||||||
vm->region.map_end = proc->vm->region.map_start;
|
vm->region.map_end = proc->vm->region.map_start;
|
||||||
memcpy(proc->rlimit, pn->rlimit, sizeof(struct rlimit) * MCK_RLIM_MAX);
|
memcpy(proc->rlimit, pn->rlimit, sizeof(struct rlimit) * MCK_RLIM_MAX);
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ struct program_load_desc {
|
|||||||
int stack_prot;
|
int stack_prot;
|
||||||
int pgid;
|
int pgid;
|
||||||
int cred[8];
|
int cred[8];
|
||||||
|
int reloc;
|
||||||
unsigned long entry;
|
unsigned long entry;
|
||||||
unsigned long user_start;
|
unsigned long user_start;
|
||||||
unsigned long user_end;
|
unsigned long user_end;
|
||||||
|
|||||||
Reference in New Issue
Block a user