From: David S. Miller Date: Tue, 10 Apr 2012 19:57:48 +0000 (-0700) Subject: Fix ld.so regression. X-Git-Tag: upstream/2.20~4261 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d7dd44133f53e8bcc81e18c11694bee985cd86d0;p=platform%2Fupstream%2Flinaro-glibc.git Fix ld.so regression. [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. --- diff --git a/ChangeLog b/ChangeLog index d6c9964..0bd15aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-04-10 David S. Miller + + [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 * sysdeps/x86_64/bits/byteswap.h: Include . diff --git a/NEWS b/NEWS index 357f3b4..fb5fd4c 100644 --- 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: diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index ef01c61..44f53b3 100644 --- a/elf/dynamic-link.h +++ b/elf/dynamic-link.h @@ -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; \ } \ } \ \