diff options
author | Filippo Arcidiacono <filippo.arcidiacono@st.com> | 2012-04-06 11:18:35 +0200 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2012-04-08 00:49:16 -0400 |
commit | 2e9c1dc78eedd055b5db779aadf0d09cf70c6710 (patch) | |
tree | 00e4c18b83175da48847eb47820ac20b202ab3c5 /ldso/ldso/ldso.c | |
parent | dd109669be4b2f5ac69cf38ee1b67d6be74b620d (diff) |
ldso: fix fdpic support broken from prelink patch
The fdpic support has been broken since the prelink support was added,
because it didn't take into account DL_LOADADDR_TYPE could be a different
type of ElfW(Addr).
Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'ldso/ldso/ldso.c')
-rw-r--r-- | ldso/ldso/ldso.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 014bbf5a9..85d27a3d1 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -351,12 +351,14 @@ static void trace_objects(struct elf_resolve *tpnt, char *str_name) static struct elf_resolve * add_ldso(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, + ElfW(Addr) ldso_mapaddr, ElfW(auxv_t) auxvt[AT_EGID + 1], struct dyn_elf *rpnt) { ElfW(Ehdr) *epnt = (ElfW(Ehdr) *) auxvt[AT_BASE].a_un.a_val; ElfW(Phdr) *myppnt = (ElfW(Phdr) *) - DL_RELOC_ADDR(load_addr, epnt->e_phoff); + DL_RELOC_ADDR(DL_GET_RUN_ADDR(load_addr, ldso_mapaddr), + epnt->e_phoff); int j; struct stat st; @@ -364,7 +366,7 @@ static struct elf_resolve * add_ldso(struct elf_resolve *tpnt, tpnt->dynamic_info, (unsigned long)tpnt->dynamic_addr, 0); - tpnt->mapaddr = load_addr; + tpnt->mapaddr = ldso_mapaddr; if (_dl_stat(tpnt->libname, &st) >= 0) { tpnt->st_dev = st.st_dev; tpnt->st_ino = st.st_ino; @@ -411,7 +413,7 @@ void *_dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv DL_GET_READY_TO_RUN_EXTRA_PARMS) { - ElfW(Addr) app_mapaddr = 0; + ElfW(Addr) app_mapaddr = 0, ldso_mapaddr = 0; ElfW(Phdr) *ppnt; ElfW(Dyn) *dpnt; char *lpntstr; @@ -826,6 +828,7 @@ of this helper program; chances are you did not intend to run this program.\n\ } #endif + ldso_mapaddr = (ElfW(Addr)) auxvt[AT_BASE].a_un.a_val; /* * OK, fix one more thing - set up debug_addr so it will point * to our chain. Later we may need to fill in more fields, but this @@ -833,7 +836,8 @@ of this helper program; chances are you did not intend to run this program.\n\ */ 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 = (ElfW(Addr)) + DL_LOADADDR_BASE(DL_GET_RUN_ADDR(load_addr, ldso_mapaddr)); debug_addr->r_brk = (unsigned long) &_dl_debug_state; _dl_debug_addr = debug_addr; @@ -1012,7 +1016,8 @@ of this helper program; chances are you did not intend to run this program.\n\ if (_dl_strcmp(name, UCLIBC_LDSO) == 0) { if (!ldso_tpnt) { /* Insert the ld.so only once */ - ldso_tpnt = add_ldso(tpnt, load_addr, auxvt, rpnt); + ldso_tpnt = add_ldso(tpnt, load_addr, + ldso_mapaddr, auxvt, rpnt); } ldso_tpnt->usage_count++; tpnt1 = ldso_tpnt; @@ -1112,7 +1117,7 @@ of this helper program; chances are you did not intend to run this program.\n\ * again once all libs are loaded. */ if (!ldso_tpnt) { - tpnt = add_ldso(tpnt, load_addr, auxvt, rpnt); + tpnt = add_ldso(tpnt, load_addr, ldso_mapaddr, auxvt, rpnt); tpnt->usage_count++; nscope_elem++; } else |