svn commit: r198280 - stable/8/libexec/rtld-elf
Konstantin Belousov
kib at FreeBSD.org
Tue Oct 20 13:26:58 UTC 2009
Author: kib
Date: Tue Oct 20 13:26:58 2009
New Revision: 198280
URL: http://svn.freebsd.org/changeset/base/198280
Log:
MFC r197931:
Apply relocations for PIE binary ELF data structures pointers in rtld.
Approved by: re (kensmith)
Modified:
stable/8/libexec/rtld-elf/ (props changed)
stable/8/libexec/rtld-elf/rtld.c
Modified: stable/8/libexec/rtld-elf/rtld.c
==============================================================================
--- stable/8/libexec/rtld-elf/rtld.c Tue Oct 20 13:22:54 2009 (r198279)
+++ stable/8/libexec/rtld-elf/rtld.c Tue Oct 20 13:26:58 2009 (r198280)
@@ -474,6 +474,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_
/* 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);
@@ -991,26 +992,26 @@ digest_phdr(const Elf_Phdr *phdr, int ph
obj = obj_new();
for (ph = phdr; ph < phlimit; ph++) {
- switch (ph->p_type) {
+ if (ph->p_type != PT_PHDR)
+ continue;
- 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;
+ 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_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 ph
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 ph
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;
}
}
More information about the svn-src-stable-8
mailing list