This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] ARM: Fix R_ARM_IRELATIVE RELA relocations
- From: Julian Brown <julian at codesourcery dot com>
- To: <libc-alpha at sourceware dot org>
- Cc: Jakub Jelinek <jakub at redhat dot com>, <will dot newton at linaro dot org>
- Date: Wed, 30 Apr 2014 16:25:20 +0100
- Subject: [PATCH] ARM: Fix R_ARM_IRELATIVE RELA relocations
- Authentication-results: sourceware.org; auth=none
Hi,
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.
OK to apply?
(Strangely, this appears to be my first glibc patch, so I'm not
entirely certain if I have write access!)
Thanks,
Julian
ChangeLog
* sysdeps/arm/dl-machine.h (elf_machine_rela): Fix R_ARM_IRELATIVE
handling.
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
index 02d1a5e..899b256 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;