From aba8c3de87953e47e5ab45f63789363a22aa0841 Mon Sep 17 00:00:00 2001 From: Will Newton Date: Mon, 29 Apr 2013 09:48:32 +0000 Subject: [PATCH] bfd/efl32-arm.c: Fix handling of IRELATIVE relocs. bfd/ChangeLog: 2013-04-24 Will Newton * elf32-arm.c (elf32_arm_populate_plt_entry): Call elf32_arm_add_dynreloc when emitting R_ARM_IRELATIVE relocs. ld/testsuite/ChangeLog: 2013-04-24 Will Newton * ld-arm/arm-elf.exp: Add IFUNC test 17. * ld-arm/ifunc-17.dd: New file. * ld-arm/ifunc-17.gd: Likewise. * ld-arm/ifunc-17.rd: Likewise. * ld-arm/ifunc-17.s: Likweise. * ld-arm/ifunc-1.rd: Reorder relocs to match linker output. * ld-arm/ifunc-2.rd: Likewise. * ld-arm/ifunc-5.rd: Likewise. * ld-arm/ifunc-6.rd: Likewise. --- bfd/ChangeLog | 5 +++++ bfd/elf32-arm.c | 9 +++++++-- ld/testsuite/ChangeLog | 12 ++++++++++++ ld/testsuite/ld-arm/arm-elf.exp | 5 +++++ ld/testsuite/ld-arm/ifunc-1.rd | 2 +- ld/testsuite/ld-arm/ifunc-17.dd | 25 +++++++++++++++++++++++++ ld/testsuite/ld-arm/ifunc-17.gd | 10 ++++++++++ ld/testsuite/ld-arm/ifunc-17.rd | 5 +++++ ld/testsuite/ld-arm/ifunc-17.s | 24 ++++++++++++++++++++++++ ld/testsuite/ld-arm/ifunc-2.rd | 4 ++-- ld/testsuite/ld-arm/ifunc-5.rd | 2 +- ld/testsuite/ld-arm/ifunc-6.rd | 4 ++-- 12 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 ld/testsuite/ld-arm/ifunc-17.dd create mode 100644 ld/testsuite/ld-arm/ifunc-17.gd create mode 100644 ld/testsuite/ld-arm/ifunc-17.rd create mode 100644 ld/testsuite/ld-arm/ifunc-17.s diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 14abe010a8f..6c5739a7fa8 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2013-04-29 Will Newton + + * elf32-arm.c (elf32_arm_populate_plt_entry): Call + elf32_arm_add_dynreloc when emitting R_ARM_IRELATIVE relocs. + 2013-04-29 Will Newton * elf64-aarch64.c (elf64_aarch64_check_relocs): Move relocation diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 6201e60735c..2ed4741b985 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -7699,8 +7699,13 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info, sgot->contents + got_offset); } - loc = srel->contents + plt_index * RELOC_SIZE (htab); - SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc); + if (dynindx == -1) + elf32_arm_add_dynreloc (output_bfd, info, srel, &rel); + else + { + loc = srel->contents + plt_index * RELOC_SIZE (htab); + SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc); + } } /* Some relocations map to different relocations depending on the diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 0d1e999e45d..27dae44d1cb 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2013-04-29 Will Newton + + * ld-arm/arm-elf.exp: Add IFUNC test 17. + * ld-arm/ifunc-17.dd: New file. + * ld-arm/ifunc-17.gd: Likewise. + * ld-arm/ifunc-17.rd: Likewise. + * ld-arm/ifunc-17.s: Likweise. + * ld-arm/ifunc-1.rd: Reorder relocs to match linker output. + * ld-arm/ifunc-2.rd: Likewise. + * ld-arm/ifunc-5.rd: Likewise. + * ld-arm/ifunc-6.rd: Likewise. + 2013-04-29 Will Newton * ld-plugin/lto.exp: Disable ld/12942 test for gcc < 4.7.0. diff --git a/ld/testsuite/ld-arm/arm-elf.exp b/ld/testsuite/ld-arm/arm-elf.exp index f13fae57e4e..c488e3cba81 100644 --- a/ld/testsuite/ld-arm/arm-elf.exp +++ b/ld/testsuite/ld-arm/arm-elf.exp @@ -451,6 +451,11 @@ set armelftests_nonacl { {objdump {-s -j.data -j.got} ifunc-16.gd} {readelf -r ifunc-16.rd}} "ifunc-16"} + {"IFUNC test 17" "" "" "" {ifunc-17.s} + {{objdump -d ifunc-17.dd} + {objdump {-s -j.data -j.got} ifunc-17.gd} + {readelf -r ifunc-17.rd}} + "ifunc-17"} } run_ld_link_tests $armelftests_common diff --git a/ld/testsuite/ld-arm/ifunc-1.rd b/ld/testsuite/ld-arm/ifunc-1.rd index 75e6d700bc0..264412312f6 100644 --- a/ld/testsuite/ld-arm/ifunc-1.rd +++ b/ld/testsuite/ld-arm/ifunc-1.rd @@ -4,5 +4,5 @@ There is no dynamic section in this file\. Relocation section '\.rel\.dyn' at offset 0x8000 contains 3 entries: Offset Info Type Sym\.Value Sym\. Name 0001100c ......a0 R_ARM_IRELATIVE -00011010 ......a0 R_ARM_IRELATIVE 00011014 ......a0 R_ARM_IRELATIVE +00011010 ......a0 R_ARM_IRELATIVE diff --git a/ld/testsuite/ld-arm/ifunc-17.dd b/ld/testsuite/ld-arm/ifunc-17.dd new file mode 100644 index 00000000000..f23a2490c22 --- /dev/null +++ b/ld/testsuite/ld-arm/ifunc-17.dd @@ -0,0 +1,25 @@ + +.* + + +Disassembly of section \.iplt: + +00008084 <.iplt>: +#------------------------------------------------------------------------------ +#------ appfunc1's .iplt entry +#------------------------------------------------------------------------------ + 8084: e28fc600 add ip, pc, #0, 12 + 8088: e28cca08 add ip, ip, #8, 20 ; 0x8000 + 808c: e5bcf01c ldr pc, \[ip, #28\]! + +Disassembly of section \.text: + +00008090 : + 8090: 46f7 mov pc, lr + +00008092 : + 8092: 46f7 mov pc, lr + +00008094 <_start>: + 8094: f7ff eff6 blx 8084 + 8098: 00000010 \.word 0x00000010 diff --git a/ld/testsuite/ld-arm/ifunc-17.gd b/ld/testsuite/ld-arm/ifunc-17.gd new file mode 100644 index 00000000000..4a12eb87f65 --- /dev/null +++ b/ld/testsuite/ld-arm/ifunc-17.gd @@ -0,0 +1,10 @@ + +.* + +Contents of section \.got: +#------------------------------------------------------------------------------ +#------ 000100a8: 0x8091 (appfunc1) +#------ 000100ac: 0x8093 (appfunc2) +#------------------------------------------------------------------------------ + 1009c 00000000 00000000 00000000 91800000 .* + 100ac 93800000 .* diff --git a/ld/testsuite/ld-arm/ifunc-17.rd b/ld/testsuite/ld-arm/ifunc-17.rd new file mode 100644 index 00000000000..a93fd64a9b6 --- /dev/null +++ b/ld/testsuite/ld-arm/ifunc-17.rd @@ -0,0 +1,5 @@ + +Relocation section '\.rel\.dyn' at offset 0x74 contains 2 entries: + Offset Info Type Sym\.Value Sym\. Name +000100a8 ......a0 R_ARM_IRELATIVE +000100ac ......a0 R_ARM_IRELATIVE diff --git a/ld/testsuite/ld-arm/ifunc-17.s b/ld/testsuite/ld-arm/ifunc-17.s new file mode 100644 index 00000000000..75c4c568448 --- /dev/null +++ b/ld/testsuite/ld-arm/ifunc-17.s @@ -0,0 +1,24 @@ + .syntax unified + .arch armv6t2 + + .global appfunc1 + .type appfunc1,%gnu_indirect_function + .thumb +appfunc1: + mov pc,lr + .size appfunc1,.-appfunc1 + + .global appfunc2 + .type appfunc2,%gnu_indirect_function + .thumb +appfunc2: + mov pc,lr + .size appfunc2,.-appfunc2 + + .global _start + .type _start,%function + .thumb +_start: + bl appfunc1(PLT) + .word appfunc2(GOT) + .size _start,.-_start diff --git a/ld/testsuite/ld-arm/ifunc-2.rd b/ld/testsuite/ld-arm/ifunc-2.rd index 92b000a86f5..7bbabf421f3 100644 --- a/ld/testsuite/ld-arm/ifunc-2.rd +++ b/ld/testsuite/ld-arm/ifunc-2.rd @@ -5,9 +5,9 @@ Relocation section '\.rel\.dyn' at offset 0x8000 contains 8 entries: Offset Info Type Sym\.Value Sym\. Name 0001100c ......a0 R_ARM_IRELATIVE 00011010 ......a0 R_ARM_IRELATIVE +00011020 ......a0 R_ARM_IRELATIVE +00011028 ......a0 R_ARM_IRELATIVE 00011014 ......a0 R_ARM_IRELATIVE 00011018 ......a0 R_ARM_IRELATIVE 0001101c ......a0 R_ARM_IRELATIVE -00011020 ......a0 R_ARM_IRELATIVE 00011024 ......a0 R_ARM_IRELATIVE -00011028 ......a0 R_ARM_IRELATIVE diff --git a/ld/testsuite/ld-arm/ifunc-5.rd b/ld/testsuite/ld-arm/ifunc-5.rd index 75e6d700bc0..264412312f6 100644 --- a/ld/testsuite/ld-arm/ifunc-5.rd +++ b/ld/testsuite/ld-arm/ifunc-5.rd @@ -4,5 +4,5 @@ There is no dynamic section in this file\. Relocation section '\.rel\.dyn' at offset 0x8000 contains 3 entries: Offset Info Type Sym\.Value Sym\. Name 0001100c ......a0 R_ARM_IRELATIVE -00011010 ......a0 R_ARM_IRELATIVE 00011014 ......a0 R_ARM_IRELATIVE +00011010 ......a0 R_ARM_IRELATIVE diff --git a/ld/testsuite/ld-arm/ifunc-6.rd b/ld/testsuite/ld-arm/ifunc-6.rd index 0fbfec5905d..04c18a926f6 100644 --- a/ld/testsuite/ld-arm/ifunc-6.rd +++ b/ld/testsuite/ld-arm/ifunc-6.rd @@ -3,7 +3,7 @@ There is no dynamic section in this file\. Relocation section '\.rel\.dyn' at offset 0x8000 contains 4 entries: Offset Info Type Sym\.Value Sym\. Name -0001100c ......a0 R_ARM_IRELATIVE +00011018 ......a0 R_ARM_IRELATIVE 00011010 ......a0 R_ARM_IRELATIVE +0001100c ......a0 R_ARM_IRELATIVE 00011014 ......a0 R_ARM_IRELATIVE -00011018 ......a0 R_ARM_IRELATIVE -- 2.30.2