diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-08-24 20:21:08 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-08-24 20:21:08 +0000 |
commit | 93b53ca279865363a3352017c1d4456cc58e7de4 (patch) | |
tree | 24bb024fc5c1d21ec0ed470d17d912eca47f100c /elf | |
parent | * malloc/malloc.c (sYSMALLOc): Avoid infinite loop if MMAP (diff) | |
download | glibc-93b53ca279865363a3352017c1d4456cc58e7de4.tar.gz glibc-93b53ca279865363a3352017c1d4456cc58e7de4.tar.bz2 glibc-93b53ca279865363a3352017c1d4456cc58e7de4.zip |
[BZ #2683]
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.
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 4 | ||||
-rw-r--r-- | elf/dl-addr.c | 6 | ||||
-rw-r--r-- | elf/tst-addr1.c | 19 |
3 files changed, 26 insertions, 3 deletions
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" |