support PIE executable for PVAS
This commit is contained in:
@ -83,6 +83,7 @@ struct program_load_desc {
|
||||
int stack_prot;
|
||||
int pgid;
|
||||
int cred[8];
|
||||
int reloc;
|
||||
unsigned long entry;
|
||||
unsigned long user_start;
|
||||
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)
|
||||
+ sizeof(struct program_image_section) * nhdrs);
|
||||
memset(desc, '\0', sizeof(struct program_load_desc));
|
||||
desc->shell_path[0] = '\0';
|
||||
fseek(fp, hdr.e_phoff, SEEK_SET);
|
||||
j = 0;
|
||||
@ -243,6 +244,8 @@ struct program_load_desc *load_elf(FILE *fp, char **interp_pathp)
|
||||
}
|
||||
desc->pid = getpid();
|
||||
desc->pgid = getpgid(0);
|
||||
if(*interp_pathp)
|
||||
desc->reloc = hdr.e_type == ET_DYN;
|
||||
desc->entry = hdr.e_entry;
|
||||
ioctl(fd, MCEXEC_UP_GET_CREDV, desc->cred);
|
||||
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_vm *vm = proc->vm;
|
||||
struct address_space *as = vm->address_space;
|
||||
long delta = -1;
|
||||
|
||||
n = p->num_sections;
|
||||
|
||||
@ -102,6 +103,19 @@ int prepare_process_ranges_args_envs(struct thread *thread,
|
||||
pn->sections[i].vaddr += interp_nbase;
|
||||
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;
|
||||
e = (pn->sections[i].vaddr + pn->sections[i].len
|
||||
+ 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_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_end = proc->vm->region.map_start;
|
||||
memcpy(proc->rlimit, pn->rlimit, sizeof(struct rlimit) * MCK_RLIM_MAX);
|
||||
|
||||
@ -143,6 +143,7 @@ struct program_load_desc {
|
||||
int stack_prot;
|
||||
int pgid;
|
||||
int cred[8];
|
||||
int reloc;
|
||||
unsigned long entry;
|
||||
unsigned long user_start;
|
||||
unsigned long user_end;
|
||||
|
||||
Reference in New Issue
Block a user