MFC r197931:
Apply relocations for PIE binary ELF data structures pointers in rtld. Approved by: re (kensmith)
This commit is contained in:
parent
b40a504727
commit
b6124fac40
@ -474,6 +474,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
|
||||
/* Initialize a fake symbol for resolving undefined weak references. */
|
||||
sym_zero.st_info = ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE);
|
||||
sym_zero.st_shndx = SHN_UNDEF;
|
||||
sym_zero.st_value = -(uintptr_t)obj_main->relocbase;
|
||||
|
||||
if (!libmap_disable)
|
||||
libmap_disable = (bool)lm_init(libmap_override);
|
||||
@ -990,27 +991,27 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
|
||||
int nsegs = 0;
|
||||
|
||||
obj = obj_new();
|
||||
for (ph = phdr; ph < phlimit; ph++) {
|
||||
if (ph->p_type != PT_PHDR)
|
||||
continue;
|
||||
|
||||
obj->phdr = phdr;
|
||||
obj->phsize = ph->p_memsz;
|
||||
obj->relocbase = (caddr_t)phdr - ph->p_vaddr;
|
||||
break;
|
||||
}
|
||||
|
||||
for (ph = phdr; ph < phlimit; ph++) {
|
||||
switch (ph->p_type) {
|
||||
|
||||
case PT_PHDR:
|
||||
if ((const Elf_Phdr *)ph->p_vaddr != phdr) {
|
||||
_rtld_error("%s: invalid PT_PHDR", path);
|
||||
return NULL;
|
||||
}
|
||||
obj->phdr = (const Elf_Phdr *) ph->p_vaddr;
|
||||
obj->phsize = ph->p_memsz;
|
||||
break;
|
||||
|
||||
case PT_INTERP:
|
||||
obj->interp = (const char *) ph->p_vaddr;
|
||||
obj->interp = (const char *)(ph->p_vaddr + obj->relocbase);
|
||||
break;
|
||||
|
||||
case PT_LOAD:
|
||||
if (nsegs == 0) { /* First load segment */
|
||||
obj->vaddrbase = trunc_page(ph->p_vaddr);
|
||||
obj->mapbase = (caddr_t) obj->vaddrbase;
|
||||
obj->relocbase = obj->mapbase - obj->vaddrbase;
|
||||
obj->mapbase = obj->vaddrbase + obj->relocbase;
|
||||
obj->textsize = round_page(ph->p_vaddr + ph->p_memsz) -
|
||||
obj->vaddrbase;
|
||||
} else { /* Last load segment */
|
||||
@ -1021,7 +1022,7 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
|
||||
break;
|
||||
|
||||
case PT_DYNAMIC:
|
||||
obj->dynamic = (const Elf_Dyn *) ph->p_vaddr;
|
||||
obj->dynamic = (const Elf_Dyn *)(ph->p_vaddr + obj->relocbase);
|
||||
break;
|
||||
|
||||
case PT_TLS:
|
||||
@ -1029,7 +1030,7 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
|
||||
obj->tlssize = ph->p_memsz;
|
||||
obj->tlsalign = ph->p_align;
|
||||
obj->tlsinitsize = ph->p_filesz;
|
||||
obj->tlsinit = (void*) ph->p_vaddr;
|
||||
obj->tlsinit = (void*)(ph->p_vaddr + obj->relocbase);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user