diff options
author | Julian Brown <julian@codesourcery.com> | 2014-04-30 16:17:59 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2014-04-30 16:17:59 +0000 |
commit | 60c8f1f60b45fb5ba02a0f76ff4b9fda203935e5 (patch) | |
tree | a2a09590b09d8d191392b1a9bc958167c321cbce | |
parent | d0f5b3f851cfced84e3228977eb8dfdc9c607231 (diff) | |
download | glibc-60c8f1f60b45fb5ba02a0f76ff4b9fda203935e5.tar.gz glibc-60c8f1f60b45fb5ba02a0f76ff4b9fda203935e5.tar.xz glibc-60c8f1f60b45fb5ba02a0f76ff4b9fda203935e5.zip |
ARM: Fix R_ARM_IRELATIVE RELA relocations.
This patch fixes what I believe to be a bug in the handling of R_ARM_IRELATIVE RELA relocations. At present, these are handled the same as REL relocations: i.e. the addend is loaded from the relocation address. Most of the time this isn't a problem because RELA relocations aren't used on ARM (GNU/Linux at least) anyway, but it causes problems with prelink, which uses RELA on all targets for its conflict table. (Support for ifunc prelinking requires a prelink patch, not yet posted.) Anyway, this patch works, though I'm not 100% sure if it is correct: I notice that this code path received attention last year: https://sourceware.org/ml/libc-ports/2013-07/msg00000.html I'm not sure under what circumstances that patch would have had an effect, nor if my patch conflicts with that case. No regressions using Mentor's usual glibc cross-testing infrastructure. [BZ #16888] * sysdeps/arm/dl-machine.h (elf_machine_rela): Fix R_ARM_IRELATIVE handling.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | sysdeps/arm/dl-machine.h | 2 |
3 files changed, 8 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index e0d131d9ca..1e6dda8586 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-04-30 Julian Brown <julian@codesourcery.com> + + [BZ #16888] + * sysdeps/arm/dl-machine.h (elf_machine_rela): Fix R_ARM_IRELATIVE + handling. + 2014-04-30 Joseph Myers <joseph@codesourcery.com> [BZ #9894] diff --git a/NEWS b/NEWS index 9d4db05d42..445acab17d 100644 --- a/NEWS +++ b/NEWS @@ -15,7 +15,7 @@ Version 2.20 16632, 16634, 16639, 16642, 16648, 16649, 16670, 16674, 16677, 16680, 16683, 16689, 16695, 16701, 16706, 16707, 16712, 16713, 16714, 16731, 16739, 16740, 16743, 16754, 16758, 16759, 16760, 16770, 16786, 16789, - 16791, 16799, 16800, 16815, 16823, 16824, 16831, 16838, 16854. + 16791, 16799, 16800, 16815, 16823, 16824, 16831, 16838, 16854, 16888. * The minimum Linux kernel version that this version of the GNU C Library can be used with is 2.6.32. diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index 02d1a5ebdf..899b2568f3 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -594,7 +594,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, } break; case R_ARM_IRELATIVE: - value = map->l_addr + *reloc_addr; + value = map->l_addr + reloc->r_addend; value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap)); *reloc_addr = value; break; |