From: Ulrich Drepper Date: Thu, 24 Aug 2006 20:21:08 +0000 (+0000) Subject: [BZ #2683] X-Git-Tag: upstream/2.30~15387 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=93b53ca279865363a3352017c1d4456cc58e7de4;p=external%2Fglibc.git [BZ #2683] 2006-08-24 Ulrich Drepper [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. --- diff --git a/ChangeLog b/ChangeLog index 0c975e8..ec00150 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-08-24 Ulrich Drepper + + [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 * malloc/malloc.c (sYSMALLOc): Avoid infinite loop if MMAP diff --git a/elf/Makefile b/elf/Makefile index 402fc18..6f4b026 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 5d3719a..720b24d 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 0000000..3a2cbb6 --- /dev/null +++ b/elf/tst-addr1.c @@ -0,0 +1,19 @@ +#include +#include +#include + +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 ef2b685..2c3ce81 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