* sysdeps/generic/ldsodefs.h (DL_ADDR_SYM_MATCH): For undefined
authorUlrich Drepper <drepper@redhat.com>
Thu, 24 Aug 2006 20:29:43 +0000 (20:29 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 24 Aug 2006 20:29:43 +0000 (20:29 +0000)
symbol require exact match (these are PLTs).
* sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h
(_dl_ppc64_addr_sym_match): Likewise.

ChangeLog
sysdeps/generic/ldsodefs.h
sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h

index ec0015065af78f787787fd10f64b6ca2809e440f..483f5ac256649abf0784d1e4bd7f5e2a0b563d67 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2006-08-24  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/generic/ldsodefs.h (DL_ADDR_SYM_MATCH): For undefined
+       symbol require exact match (these are PLTs).
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/ldsodefs.h
+       (_dl_ppc64_addr_sym_match): Likewise.
+
        [BZ #2683]
        * elf/dl-addr.c (_dl_addr): Don't ignore all undefined symbols.
        If symbol has a value use it.
index 2c3ce81dd0b1bce3071e7d9a02a5510f37001bb4..b7d0f9b7e7d7b2cfd3a276f3c05b9469627f2984 100644 (file)
@@ -76,7 +76,7 @@ typedef struct link_map *lookup_t;
 /* On some architectures dladdr can't use st_size of all symbols this way.  */
 #define DL_ADDR_SYM_MATCH(L, SYM, MATCHSYM, ADDR) \
   ((ADDR) >= (L)->l_addr + (SYM)->st_value                             \
-   && (((SYM)->st_size == 0                                            \
+   && ((((SYM)->st_shndx == SHN_UNDEF || (SYM)->st_size == 0)          \
        && (ADDR) == (L)->l_addr + (SYM)->st_value)                     \
        || (ADDR) < (L)->l_addr + (SYM)->st_value + (SYM)->st_size)     \
    && ((MATCHSYM) == NULL || (MATCHSYM)->st_value < (SYM)->st_value))
index 1ead3dd63df04923f07851dc91bbdd36354cb10b..ac4a0d5aa9edc0b164be7c924a03ce75fc45caa5 100644 (file)
@@ -1,5 +1,5 @@
 /* Run-time dynamic linker data structures for loaded ELF shared objects.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -47,7 +47,7 @@ _dl_ppc64_addr_sym_match (const struct link_map *l, const ElfW(Sym) *sym,
            return false;
        }
     }
-  else if (sym->st_size == 0)
+  else if (sym->st_shndx == SHN_UNDEF || sym->st_size == 0)
     {
       if (addr != value)
        return false;