[PATCH] Change dladdr to return same thing as dlsym/dlvsym in dli_saddr
Jakub Jelinek
jakub@redhat.com
Tue Oct 19 16:20:00 GMT 2004
Hi!
On most arches this means no change (well, the first hunk means that
STT_TLS symbols will not be looked at, as they don't represent addresses
in the shared library or binary), but on IA-64/HPPA this matters.
2004-10-19 Jakub Jelinek <jakub@redhat.com>
* elf/dl-addr.c (_dl_addr): Don't look at STT_TLS symbols.
Use DL_SYMBOL_ADDRESS to set dli_saddr.
--- libc/elf/dl-addr.c.jj 2004-10-15 23:08:33.000000000 +0200
+++ libc/elf/dl-addr.c 2004-10-19 10:10:31.000000000 +0200
@@ -92,6 +92,9 @@ _dl_addr (const void *address, Dl_info *
dynamic symbol table!! */
for (matchsym = NULL; (void *) symtab < (void *) symtabend; ++symtab)
if (addr >= match->l_addr + symtab->st_value
+#if defined USE_TLS
+ && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS
+#endif
&& ((symtab->st_size == 0
&& addr == match->l_addr + symtab->st_value)
|| addr < match->l_addr + symtab->st_value + symtab->st_size)
@@ -110,8 +113,10 @@ _dl_addr (const void *address, Dl_info *
{
/* We found a symbol close by. Fill in its name and exact
address. */
+ lookup_t matchl = LOOKUP_VALUE (match);
+
info->dli_sname = strtab + matchsym->st_name;
- info->dli_saddr = (void *) (match->l_addr + matchsym->st_value);
+ info->dli_saddr = DL_SYMBOL_ADDRESS (matchl, matchsym);
}
else
{
Jakub
More information about the Libc-hacker
mailing list