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 | |
parent | 7463d5cb4d42ffa944f05415f9d320b1b64d2bcf (diff) | |
download | glibc-93b53ca279865363a3352017c1d4456cc58e7de4.zip glibc-93b53ca279865363a3352017c1d4456cc58e7de4.tar.gz glibc-93b53ca279865363a3352017c1d4456cc58e7de4.tar.bz2 |
[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.
-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
@@ -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 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 <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 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 |