diff options
author | Mike Frysinger <vapier@gentoo.org> | 2006-06-30 02:55:57 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2006-06-30 02:55:57 +0000 |
commit | 1ba3a7b727b49d61b4868a06f1258a54db4dc9e0 (patch) | |
tree | 3958d8fe8647427ecaacf38922a128d8d5c51c1a /ldso/ldso/dl-startup.c | |
parent | 1d6903684a1f73d72fb913c62491693f35f02d62 (diff) |
Bernd Schmidt writes: abstract away addresses so we can support FDPIC ELFs
Diffstat (limited to 'ldso/ldso/dl-startup.c')
-rw-r--r-- | ldso/ldso/dl-startup.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/ldso/ldso/dl-startup.c b/ldso/ldso/dl-startup.c index 96a736448..908ba7cb3 100644 --- a/ldso/ldso/dl-startup.c +++ b/ldso/ldso/dl-startup.c @@ -114,7 +114,7 @@ static void * __attribute_used__ _dl_start(unsigned long args) { unsigned int argc; char **argv, **envp; - unsigned long load_addr; + DL_LOADADDR_TYPE load_addr; ElfW(Addr) got; unsigned long *aux_dat; ElfW(Ehdr) *header; @@ -168,7 +168,7 @@ static void * __attribute_used__ _dl_start(unsigned long args) * (esp since SEND_STDERR() needs this on some platforms... */ if (!auxvt[AT_BASE].a_un.a_val) auxvt[AT_BASE].a_un.a_val = elf_machine_load_address(); - load_addr = auxvt[AT_BASE].a_un.a_val; + DL_INIT_LOADADDR_BOOT(load_addr, auxvt[AT_BASE].a_un.a_val); header = (ElfW(Ehdr) *) auxvt[AT_BASE].a_un.a_val; /* Check the ELF header to make sure everything looks ok. */ @@ -186,14 +186,14 @@ static void * __attribute_used__ _dl_start(unsigned long args) _dl_exit(0); } SEND_STDERR_DEBUG("ELF header="); - SEND_ADDRESS_STDERR_DEBUG(load_addr, 1); + SEND_ADDRESS_STDERR_DEBUG(DL_LOADADDR_BASE (load_addr), 1); /* Locate the global offset table. Since this code must be PIC * we can take advantage of the magic offset register, if we * happen to know what that is for this architecture. If not, * we can always read stuff out of the ELF file to find it... */ got = elf_machine_dynamic(); - dpnt = (ElfW(Dyn) *) (got + load_addr); + dpnt = (ElfW(Dyn) *) DL_RELOC_ADDR (got, load_addr); SEND_STDERR_DEBUG("First Dynamic section entry="); SEND_ADDRESS_STDERR_DEBUG(dpnt, 1); _dl_memset(tpnt, 0, sizeof(struct elf_resolve)); @@ -259,9 +259,10 @@ static void * __attribute_used__ _dl_start(unsigned long args) rel_addr += relative_count * sizeof(ELF_RELOC); } - rpnt = (ELF_RELOC *) (rel_addr + load_addr); + rpnt = (ELF_RELOC *) DL_RELOC_ADDR (rel_addr, load_addr); for (i = 0; i < rel_size; i += sizeof(ELF_RELOC), rpnt++) { - reloc_addr = (unsigned long *) (load_addr + (unsigned long) rpnt->r_offset); + reloc_addr = (unsigned long *) DL_RELOC_ADDR ((unsigned long) rpnt->r_offset, + load_addr); symtab_index = ELF_R_SYM(rpnt->r_info); symbol_addr = 0; sym = NULL; @@ -272,7 +273,7 @@ static void * __attribute_used__ _dl_start(unsigned long args) symtab = (ElfW(Sym) *) tpnt->dynamic_info[DT_SYMTAB]; strtab = (char *) tpnt->dynamic_info[DT_STRTAB]; sym = &symtab[symtab_index]; - symbol_addr = load_addr + sym->st_value; + symbol_addr = (unsigned long) DL_RELOC_ADDR (sym->st_value, load_addr); SEND_STDERR_DEBUG("relocating symbol: "); SEND_STDERR_DEBUG(strtab + sym->st_name); |