summaryrefslogtreecommitdiff
path: root/ldso/ldso
diff options
context:
space:
mode:
authorCarmelo Amoroso <carmelo.amoroso@st.com>2008-01-18 13:14:19 +0000
committerCarmelo Amoroso <carmelo.amoroso@st.com>2008-01-18 13:14:19 +0000
commit341b678f45c22cdc60b1312416ad0440aae6685a (patch)
treee1838c397a8b04951b9d00ef5c0a920813f0c830 /ldso/ldso
parent1030faf587a2f4bea255bfd2db28b59e196493aa (diff)
This patch solves a problem in dladdr caused by the wrong value
of elf_resolve's loadaddr field for the main application. Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com> Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
Diffstat (limited to 'ldso/ldso')
-rw-r--r--ldso/ldso/dl-hash.c2
-rw-r--r--ldso/ldso/ldso.c5
2 files changed, 6 insertions, 1 deletions
diff --git a/ldso/ldso/dl-hash.c b/ldso/ldso/dl-hash.c
index 8d2ae3e38..559996289 100644
--- a/ldso/ldso/dl-hash.c
+++ b/ldso/ldso/dl-hash.c
@@ -152,7 +152,7 @@ struct elf_resolve *_dl_add_elf_hash_table(const char *libname,
hash_addr += tpnt->nbucket;
tpnt->chains = hash_addr;
}
- tpnt->loadaddr = loadaddr;
+ tpnt->loadaddr = tpnt->mapaddr = loadaddr;
for (i = 0; i < DYNAMIC_SIZE; i++)
tpnt->dynamic_info[i] = dynamic_info[i];
return tpnt;
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
index d6aa0b17e..15e03f560 100644
--- a/ldso/ldso/ldso.c
+++ b/ldso/ldso/ldso.c
@@ -135,6 +135,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
char **argv
DL_GET_READY_TO_RUN_EXTRA_PARMS)
{
+ DL_LOADADDR_TYPE app_loadaddr = NULL;
ElfW(Phdr) *ppnt;
ElfW(Dyn) *dpnt;
char *lpntstr;
@@ -276,6 +277,9 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
relro_addr = ppnt->p_vaddr;
relro_size = ppnt->p_memsz;
}
+ if (!app_loadaddr && (ppnt->p_type == PT_LOAD)) {
+ app_loadaddr = ppnt->p_vaddr;
+ }
if (ppnt->p_type == PT_DYNAMIC) {
dpnt = (ElfW(Dyn) *) DL_RELOC_ADDR(app_tpnt->loadaddr, ppnt->p_vaddr);
_dl_parse_dynamic_info(dpnt, app_tpnt->dynamic_info, debug_addr, app_tpnt->loadaddr);
@@ -322,6 +326,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
_dl_symbol_tables = rpnt = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf));
_dl_memset(rpnt, 0, sizeof(struct dyn_elf));
rpnt->dyn = _dl_loaded_modules;
+ app_tpnt->mapaddr = app_loadaddr;
app_tpnt->rtld_flags = unlazy | RTLD_GLOBAL;
app_tpnt->usage_count++;
app_tpnt->symbol_scope = _dl_symbol_tables;