support PIE executable for PVAS

This commit is contained in:
Tomoki Shirasawa
2015-12-14 11:05:28 +09:00
parent 5c1dad1660
commit bb81f84709
4 changed files with 27 additions and 0 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;