diff options
author | Mike Frysinger <vapier@gentoo.org> | 2006-07-05 23:21:22 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2006-07-05 23:21:22 +0000 |
commit | 47319595bdfdc0dfc8eb5f51bc8bd055a6ea0a7f (patch) | |
tree | 2ba1a4c78410fcb692dad3b6ce01ca1bf3cbb2a4 /ldso/ldso/dl-elf.c | |
parent | 9aa22cc9745be04035873b26f82adc4581e602b4 (diff) |
patch from Bernd Schmidt to abstract away initializing of relocation addresses
Diffstat (limited to 'ldso/ldso/dl-elf.c')
-rw-r--r-- | ldso/ldso/dl-elf.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c index 923e0cfe7..443b0802e 100644 --- a/ldso/ldso/dl-elf.c +++ b/ldso/ldso/dl-elf.c @@ -118,9 +118,9 @@ int _dl_unmap_cache(void) void _dl_protect_relro (struct elf_resolve *l) { - ElfW(Addr) start = ((l->loadaddr + l->relro_addr) + ElfW(Addr) start = (DL_RELOC_ADDR(l->loadaddr, l->relro_addr) & ~(_dl_pagesize - 1)); - ElfW(Addr) end = ((l->loadaddr + l->relro_addr + l->relro_size) + ElfW(Addr) end = ((DL_RELOC_ADDR(l->loadaddr, l->relro_addr) + l->relro_size) & ~(_dl_pagesize - 1)); _dl_if_debug_dprint("RELRO protecting %s: start:%x, end:%x\n", l->libname, start, end); if (start != end && @@ -352,8 +352,9 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, ElfW(Addr) relro_addr = 0; size_t relro_size = 0; struct stat st; + DL_LOADADDR_TYPE lib_loadaddr; + DL_INIT_LOADADDR_EXTRA_DECLS - libaddr = 0; infile = _dl_open(libname, O_RDONLY, 0); if (infile < 0) { _dl_internal_error_number = LD_ERROR_NOFILE; @@ -471,6 +472,8 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, /* Get the memory to store the library */ ppnt = (ElfW(Phdr) *)(intptr_t) & header[epnt->e_phoff]; + DL_INIT_LOADADDR(lib_loadaddr, libaddr, ppnt, epnt->e_phnum); + for (i = 0; i < epnt->e_phnum; i++) { if (ppnt->p_type == PT_GNU_RELRO) { relro_addr = ppnt->p_vaddr; @@ -547,7 +550,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, /* For a non-PIC library, the addresses are all absolute */ if (piclib) { - dynamic_addr += (unsigned long) libaddr; + dynamic_addr = (unsigned long) DL_RELOC_ADDR(lib_loadaddr, dynamic_addr); } /* @@ -567,7 +570,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, dpnt = (ElfW(Dyn) *) dynamic_addr; _dl_memset(dynamic_info, 0, sizeof(dynamic_info)); - _dl_parse_dynamic_info(dpnt, dynamic_info, NULL, libaddr); + _dl_parse_dynamic_info(dpnt, dynamic_info, NULL, lib_loadaddr); /* If the TEXTREL is set, this means that we need to make the pages writable before we perform relocations. Do this now. They get set back again later. */ @@ -588,13 +591,13 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, #endif } - tpnt = _dl_add_elf_hash_table(libname, libaddr, dynamic_info, + tpnt = _dl_add_elf_hash_table(libname, lib_loadaddr, dynamic_info, dynamic_addr, 0); tpnt->relro_addr = relro_addr; tpnt->relro_size = relro_size; tpnt->st_dev = st.st_dev; tpnt->st_ino = st.st_ino; - tpnt->ppnt = (ElfW(Phdr) *)(intptr_t) (tpnt->loadaddr + epnt->e_phoff); + tpnt->ppnt = (ElfW(Phdr) *) DL_RELOC_ADDR(tpnt->loadaddr, epnt->e_phoff); tpnt->n_phent = epnt->e_phnum; /* @@ -625,9 +628,9 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, } _dl_if_debug_dprint("\n\tfile='%s'; generating link map\n", libname); - _dl_if_debug_dprint("\t\tdynamic: %x base: %x\n", dynamic_addr, libaddr); + _dl_if_debug_dprint("\t\tdynamic: %x base: %x\n", dynamic_addr, DL_LOADADDR_BASE(libaddr)); _dl_if_debug_dprint("\t\t entry: %x phdr: %x phnum: %x\n\n", - epnt->e_entry + libaddr, tpnt->ppnt, tpnt->n_phent); + DL_RELOC_ADDR(lib_loadaddr, epnt->e_entry), tpnt->ppnt, tpnt->n_phent); _dl_munmap(header, _dl_pagesize); @@ -819,7 +822,7 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, size_t size, void int ret = 0; for (l = _dl_loaded_modules; l != NULL; l = l->next) { - info.dlpi_addr = l->loadaddr; + info.dlpi_addr = DL_LOADADDR_BASE(l->loadaddr); info.dlpi_name = l->libname; info.dlpi_phdr = l->ppnt; info.dlpi_phnum = l->n_phent; |