From 656554001c3b532f42a7d0c733b91c785615eec4 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 5 Jul 2006 06:27:44 +0000 Subject: revert fdpic patch so we can merge it in bit by bit --- ldso/ldso/ldso.c | 73 +++++++++++++++++++++++++------------------------------- 1 file changed, 32 insertions(+), 41 deletions(-) (limited to 'ldso/ldso/ldso.c') diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 2afd97797..2234623e3 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -102,18 +102,17 @@ uintptr_t __guard attribute_relro; #endif static void _dl_run_array_forward(unsigned long array, unsigned long size, - DL_LOADADDR_TYPE loadaddr) + ElfW(Addr) loadaddr) { if (array != 0) { unsigned int j; unsigned int jm; ElfW(Addr) *addrs; jm = size / sizeof (ElfW(Addr)); - addrs = (ElfW(Addr) *) DL_RELOC_ADDR (array, loadaddr); + addrs = (ElfW(Addr) *) (array + loadaddr); for (j = 0; j < jm; ++j) { void (*dl_elf_func) (void); - dl_elf_func = (void (*)(void)) DL_RELOC_ADDR (addrs[j], - loadaddr); + dl_elf_func = (void (*)(void)) (intptr_t) addrs[j]; (*dl_elf_func) (); } } @@ -137,13 +136,11 @@ void _dl_run_fini_array(struct elf_resolve *tpnt); void _dl_run_fini_array(struct elf_resolve *tpnt) { if (tpnt->dynamic_info[DT_FINI_ARRAY]) { - ElfW(Addr) *array = (ElfW(Addr) *) DL_RELOC_ADDR (tpnt->dynamic_info[DT_FINI_ARRAY], - tpnt->loadaddr); + ElfW(Addr) *array = (ElfW(Addr) *) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI_ARRAY]); unsigned int i = (tpnt->dynamic_info[DT_FINI_ARRAYSZ] / sizeof(ElfW(Addr))); while (i-- > 0) { void (*dl_elf_func) (void); - dl_elf_func = (void (*)(void)) DL_RELOC_ADDR (array[i], - tpnt->loadaddr); + dl_elf_func = (void (*)(void)) (intptr_t) array[i]; (*dl_elf_func) (); } } @@ -169,15 +166,14 @@ static void __attribute__ ((destructor)) __attribute_used__ _dl_fini(void) if (tpnt->dynamic_info[DT_FINI]) { void (*dl_elf_func) (void); - dl_elf_func = (void (*)(void)) DL_RELOC_ADDR (tpnt->dynamic_info[DT_FINI], - tpnt->loadaddr); + dl_elf_func = (void (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]); _dl_if_debug_dprint("\ncalling FINI: %s\n\n", tpnt->libname); (*dl_elf_func) (); } } } -void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, +void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr, ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv) { @@ -299,13 +295,13 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, for (idx = 0; idx < auxvt[AT_PHNUM].a_un.a_val; idx++, phdr++) if (phdr->p_type == PT_PHDR) { - DL_INIT_LOADADDR_PROG (app_tpnt->loadaddr, (ElfW(Addr)) (auxvt[AT_PHDR].a_un.a_val - ppnt->p_vaddr)); + app_tpnt->loadaddr = (ElfW(Addr)) (auxvt[AT_PHDR].a_un.a_val - phdr->p_vaddr); break; } - if (DL_LOADADDR_BASE (app_tpnt->loadaddr)) + if (app_tpnt->loadaddr) _dl_debug_early("Position Independent Executable: " - "app_tpnt->loadaddr=%x\n", DL_LOADADDR_BASE (app_tpnt->loadaddr)); + "app_tpnt->loadaddr=%x\n", app_tpnt->loadaddr); } /* @@ -322,7 +318,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, relro_size = ppnt->p_memsz; } if (ppnt->p_type == PT_DYNAMIC) { - dpnt = (ElfW(Dyn) *) DL_RELOC_ADDR (ppnt->p_vaddr, app_tpnt->loadaddr); + dpnt = (ElfW(Dyn) *) (ppnt->p_vaddr + app_tpnt->loadaddr); _dl_parse_dynamic_info(dpnt, app_tpnt->dynamic_info, debug_addr, app_tpnt->loadaddr); #ifndef __FORCE_SHAREABLE_TEXT_SEGMENTS__ /* Ugly, ugly. We need to call mprotect to change the @@ -335,11 +331,11 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, if (app_tpnt->dynamic_info[DT_TEXTREL]) { ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_val; for (i = 0; i < auxvt[AT_PHNUM].a_un.a_val; i++, ppnt++) { - if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W)) { - void *base = DL_RELOC_ADDR (ppnt->p_vaddr & PAGE_ALIGN, app_tpnt->loadaddr); - _dl_mprotect(base, (ppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) ppnt->p_filesz, + if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W)) + _dl_mprotect((void *) ((ppnt->p_vaddr + app_tpnt->loadaddr) & PAGE_ALIGN), + ((ppnt->p_vaddr + app_tpnt->loadaddr) & ADDR_ALIGN) + + (unsigned long) ppnt->p_filesz, PROT_READ | PROT_WRITE | PROT_EXEC); - } } } #endif @@ -350,10 +346,8 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, continue; #endif /* OK, we have what we need - slip this one into the list. */ - app_tpnt = _dl_add_elf_hash_table(_dl_progname, app_tpnt->loadaddr, - app_tpnt->dynamic_info, - (unsigned long) DL_RELOC_ADDR (ppnt->p_vaddr, app_tpnt->loadaddr), - ppnt->p_filesz); + app_tpnt = _dl_add_elf_hash_table(_dl_progname, (char *)app_tpnt->loadaddr, + app_tpnt->dynamic_info, ppnt->p_vaddr + app_tpnt->loadaddr, ppnt->p_filesz); _dl_loaded_modules->libtype = elf_executable; _dl_loaded_modules->ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_val; _dl_loaded_modules->n_phent = auxvt[AT_PHNUM].a_un.a_val; @@ -374,7 +368,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, if (ppnt->p_type == PT_INTERP) { char *ptmp; - tpnt->libname = (char *) DL_RELOC_ADDR (ppnt->p_vaddr, app_tpnt->loadaddr); + tpnt->libname = (char *) ppnt->p_vaddr + app_tpnt->loadaddr; /* Store the path where the shared lib loader was found * for later use @@ -384,8 +378,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, if (ptmp != _dl_ldsopath) *ptmp = '\0'; - _dl_debug_early("Lib Loader: (%x) %s\n", (unsigned) DL_LOADADDR_BASE (tpnt->loadaddr), - tpnt->libname); + _dl_debug_early("Lib Loader: (%x) %s\n", tpnt->loadaddr, tpnt->libname); } } app_tpnt->relro_addr = relro_addr; @@ -457,7 +450,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, */ debug_addr->r_map = (struct link_map *) _dl_loaded_modules; debug_addr->r_version = 1; - debug_addr->r_ldbase = (ElfW(Addr)) DL_LOADADDR_BASE (load_addr); + debug_addr->r_ldbase = load_addr; debug_addr->r_brk = (unsigned long) &_dl_debug_state; _dl_debug_addr = debug_addr; @@ -504,7 +497,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, } else { tpnt1->rtld_flags = unlazy | RTLD_GLOBAL; - _dl_debug_early("Loading: (%x) %s\n", (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr), tpnt1->libname); + _dl_debug_early("Loading: (%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #ifdef __LDSO_LDD_SUPPORT__ if (trace_loaded_objects && @@ -516,7 +509,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, */ if (_dl_strcmp(_dl_progname, str) != 0) _dl_dprintf(1, "\t%s => %s (%x)\n", str, tpnt1->libname, - (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr)); + tpnt1->loadaddr); } #endif } @@ -595,14 +588,14 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, } else { tpnt1->rtld_flags = unlazy | RTLD_GLOBAL; - _dl_debug_early("Loading: (%x) %s\n", (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr), tpnt1->libname); + _dl_debug_early("Loading: (%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #ifdef __LDSO_LDD_SUPPORT__ if (trace_loaded_objects && tpnt1->usage_count == 1) { _dl_dprintf(1, "\t%s => %s (%x)\n", cp2, tpnt1->libname, - (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr)); + (unsigned)tpnt1->loadaddr); } #endif } @@ -654,14 +647,14 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, tpnt1->rtld_flags = unlazy | RTLD_GLOBAL; - _dl_debug_early("Loading: (%x) %s\n", (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr), tpnt1->libname); + _dl_debug_early("Loading: (%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #ifdef __LDSO_LDD_SUPPORT__ if (trace_loaded_objects && tpnt1->usage_count == 1) { _dl_dprintf(1, "\t%s => %s (%x)\n", lpntstr, tpnt1->libname, - (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr)); + (unsigned)tpnt1->loadaddr); } #endif } @@ -722,10 +715,10 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, */ if (tpnt) { ElfW(Ehdr) *epnt = (ElfW(Ehdr) *) auxvt[AT_BASE].a_un.a_val; - ElfW(Phdr) *myppnt = (ElfW(Phdr) *) DL_RELOC_ADDR (epnt->e_phoff, load_addr); + ElfW(Phdr) *myppnt = (ElfW(Phdr) *) (load_addr + epnt->e_phoff); int j; - tpnt = _dl_add_elf_hash_table(tpnt->libname, load_addr, + tpnt = _dl_add_elf_hash_table(tpnt->libname, (char *)load_addr, tpnt->dynamic_info, (unsigned long)tpnt->dynamic_addr, 0); @@ -772,7 +765,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, if (trace_loaded_objects) { _dl_dprintf(1, "\t%s => %s (%x)\n", rpnt->dyn->libname + _dl_strlen(_dl_ldsopath) + 1, - rpnt->dyn->libname, (unsigned) DL_LOADADDR_BASE (rpnt->dyn->loadaddr)); + rpnt->dyn->libname, rpnt->dyn->loadaddr); _dl_exit(0); } #endif @@ -824,10 +817,8 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) { for (myppnt = tpnt->ppnt, j = 0; j < tpnt->n_phent; j++, myppnt++) { if (myppnt->p_type == PT_LOAD && !(myppnt->p_flags & PF_W) && tpnt->dynamic_info[DT_TEXTREL]) { - void *base = DL_RELOC_ADDR (myppnt->p_vaddr & PAGE_ALIGN, tpnt->loadaddr); - _dl_mprotect(base, - (myppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) myppnt->p_filesz, - LXFLAGS(myppnt->p_flags)); + _dl_mprotect((void *) (tpnt->loadaddr + (myppnt->p_vaddr & PAGE_ALIGN)), + (myppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) myppnt->p_filesz, LXFLAGS(myppnt->p_flags)); } } } @@ -855,7 +846,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, if (tpnt->dynamic_info[DT_INIT]) { void (*dl_elf_func) (void); - dl_elf_func = (void (*)(void)) DL_RELOC_ADDR (tpnt->dynamic_info[DT_INIT], tpnt->loadaddr); + dl_elf_func = (void (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]); _dl_if_debug_dprint("calling INIT: %s\n\n", tpnt->libname); -- cgit v1.2.3