]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix ld.so regression.
authorDavid S. Miller <davem@davemloft.net>
Tue, 10 Apr 2012 19:57:48 +0000 (12:57 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Apr 2012 00:47:59 +0000 (17:47 -0700)
[BZ #13967]
* elf/dynamic-link.h (_ELF_DYNAMIC_DO_RELOC): Handle the case
where the is a gap between DT_REL(A) and DT_JMPREL.

ChangeLog
NEWS
elf/dynamic-link.h

index d6c9964bebbc0461d93b31242a8406eb71ce331c..0bd15aac5c34c1981cda0e187c20d147502ce745 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-04-10  David S. Miller  <davem@davemloft.net>
+
+       [BZ #13967]
+       * elf/dynamic-link.h (_ELF_DYNAMIC_DO_RELOC): Handle the case
+       where the is a gap between DT_REL(A) and DT_JMPREL.
+
 2012-04-10  H.J. Lu  <hongjiu.lu@intel.com>
 
        * sysdeps/x86_64/bits/byteswap.h: Include <features.h>.
diff --git a/NEWS b/NEWS
index 357f3b4e697ca1793171f1449525720fa54464cd..fb5fd4ce7aa00204028a1871bd20e454f323bf93 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -21,7 +21,7 @@ Version 2.16
   13824, 13840, 13841, 13844, 13846, 13851, 13852, 13854, 13871, 13872,
   13873, 13879, 13883, 13892, 13895, 13908, 13910, 13911, 13912, 13913,
   13915, 13916, 13917, 13918, 13919, 13920, 13921, 13926, 13928, 13938,
-  13963
+  13963, 13967
 
 * ISO C11 support:
 
index ef01c61f3e653d055e1d64928ab553995cdf6bfa..44f53b3c709aa17ff13c125bdd5ee70872efaf28 100644 (file)
@@ -252,9 +252,10 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
 /* On some machines, notably SPARC, DT_REL* includes DT_JMPREL in its
    range.  Note that according to the ELF spec, this is completely legal!
 
-   We are guarenteed that we have one of two situations.  Either DT_JMPREL
+   We are guarenteed that we have one of three situations.  Either DT_JMPREL
    comes immediately after DT_REL*, or there is overlap and DT_JMPREL
-   consumes precisely the very end of the DT_REL*.  */
+   consumes precisely the very end of the DT_REL*, or DT_JMPREL and DT_REL*
+   are completely separate and there is a gap between them.  */
 
 # define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, skip_ifunc, test_rel) \
   do {                                                                       \
@@ -275,19 +276,20 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
        && (!test_rel || (map)->l_info[DT_PLTREL]->d_un.d_val == DT_##RELOC)) \
       {                                                                              \
        ElfW(Addr) start = D_PTR ((map), l_info[DT_JMPREL]);                  \
+       ElfW(Addr) size = (map)->l_info[DT_PLTRELSZ]->d_un.d_val;             \
                                                                              \
-       if (__builtin_expect (ranges[0].size, 1))                             \
-         ranges[0].size = (start - ranges[0].start);                         \
+       if (ranges[0].start + ranges[0].size == (start + size))               \
+         ranges[0].size -= size;                                             \
        if (! ELF_DURING_STARTUP && ((do_lazy) || ranges[0].size == 0))       \
          {                                                                   \
            ranges[1].start = start;                                          \
-           ranges[1].size = (map)->l_info[DT_PLTRELSZ]->d_un.d_val;          \
+           ranges[1].size = size;                                            \
            ranges[1].lazy = (do_lazy);                                       \
          }                                                                   \
        else                                                                  \
          {                                                                   \
            /* Combine processing the sections.  */                           \
-           ranges[0].size += (map)->l_info[DT_PLTRELSZ]->d_un.d_val;         \
+           ranges[0].size += size;                                           \
          }                                                                   \
       }                                                                              \
                                                                              \