diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | elf/Makefile | 4 | ||||
-rw-r--r-- | elf/dl-addr.c | 6 | ||||
-rw-r--r-- | elf/tst-addr1.c | 19 | ||||
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 4 |
5 files changed, 36 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 0c975e8dc4..ec0015065a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-08-24 Ulrich Drepper <drepper@redhat.com> + + [BZ #2683] + * elf/dl-addr.c (_dl_addr): Don't ignore all undefined symbols. + If symbol has a value use it. + * elf/tst-dladdr1.c: New file. + * elf/Makefile: Add rules to build and run tst-addr1. + 2006-08-24 Jakub Jelinek <jakub@redhat.com> * malloc/malloc.c (sYSMALLOc): Avoid infinite loop if MMAP diff --git a/elf/Makefile b/elf/Makefile index 402fc18636..6f4b0260c0 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -170,7 +170,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \ unload3 unload4 unload5 unload6 tst-global1 order2 \ tst-audit1 tst-audit2 \ - tst-stackguard1 + tst-stackguard1 tst-addr1 # reldep9 test-srcs = tst-pathopt tests-vis-yes = vismain @@ -906,3 +906,5 @@ $(objpfx)tst-leaks1-mem: $(objpfx)tst-leaks1.out $(common-objpfx)malloc/mtrace $(objpfx)tst-leaks1.mtrace > $@ tst-leaks1-ENV = MALLOC_TRACE=$(objpfx)tst-leaks1.mtrace + +$(objpfx)tst-addr1: $(libdl) diff --git a/elf/dl-addr.c b/elf/dl-addr.c index 5d3719adb2..720b24d04b 100644 --- a/elf/dl-addr.c +++ b/elf/dl-addr.c @@ -91,7 +91,8 @@ _dl_addr (const void *address, Dl_info *info, { /* The hash table never references local symbols so we can omit that test here. */ - if (symtab[symndx].st_shndx != SHN_UNDEF + if ((symtab[symndx].st_shndx != SHN_UNDEF + || symtab[symndx].st_value != 0) #ifdef USE_TLS && ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS #endif @@ -125,7 +126,8 @@ _dl_addr (const void *address, Dl_info *info, #ifdef USE_TLS && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS #endif - && symtab->st_shndx != SHN_UNDEF + && (symtab->st_shndx != SHN_UNDEF + || symtab->st_value != 0) && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr) && symtab->st_name < strtabsize) matchsym = (ElfW(Sym) *) symtab; diff --git a/elf/tst-addr1.c b/elf/tst-addr1.c new file mode 100644 index 0000000000..3a2cbb668f --- /dev/null +++ b/elf/tst-addr1.c @@ -0,0 +1,19 @@ +#include <dlfcn.h> +#include <stdio.h> +#include <string.h> + +static int +do_test (void) +{ + Dl_info i; + if (dladdr (&printf, &i) == 0) + { + puts ("not found"); + return 1; + } + printf ("found symbol %s in %s\n", i.dli_sname, i.dli_fname); + return i.dli_sname == NULL || strcmp (i.dli_sname, "printf") != 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index ef2b685393..2c3ce81dd0 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -59,8 +59,8 @@ __BEGIN_DECLS /* Result of the lookup functions and how to retrieve the base address. */ typedef struct link_map *lookup_t; -# define LOOKUP_VALUE(map) map -# define LOOKUP_VALUE_ADDRESS(map) ((map) ? (map)->l_addr : 0) +#define LOOKUP_VALUE(map) map +#define LOOKUP_VALUE_ADDRESS(map) ((map) ? (map)->l_addr : 0) /* On some architectures a pointer to a function is not just a pointer to the actual code of the function but rather an architecture |