From: Jiong Wang Date: Tue, 5 May 2015 19:55:20 +0000 (+0100) Subject: [AArch64][Backport]Improve PC-relative relocation check for shared library X-Git-Tag: binutils-2_25_1~110 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bb22a11646ead9e2d179d5a51ceeb4834dab9b10;p=thirdparty%2Fbinutils-gdb.git [AArch64][Backport]Improve PC-relative relocation check for shared library Apply from master: 2015-04-24 Jiong. Wang bfd/ * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Reject PC-relative relocation for external symbol. ld/testsuite/ * ld-aarch64/pcrel.s: New testcase. * ld-aarch64/pcrel_pic_defiend_local.d: New expect file. * ld-aarch64/pcrel_pic_undefined.d: Ditto. * ld-aarch64/aarch64-elf.exp: Run them. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2060e3c627f..989e4438bdc 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2015-05-05 Jiong Wang + + Apply from master: + + 2015-04-24 Jiong. Wang + + * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Reject + PC-relative relocation for external symbol. + 2015-04-10 Alan Modra PR ld/18222 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index f23afb5e60d..a04a5241d7c 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -4427,16 +4427,36 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, signed_addend, weak_undef_p); break; + case BFD_RELOC_AARCH64_ADR_LO21_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_PCREL: + case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: + case BFD_RELOC_AARCH64_LD_LO19_PCREL: + case BFD_RELOC_AARCH64_16_PCREL: + case BFD_RELOC_AARCH64_32_PCREL: + case BFD_RELOC_AARCH64_64_PCREL: + if (info->shared + && (input_section->flags & SEC_ALLOC) != 0 + && (input_section->flags & SEC_READONLY) != 0 + && h != NULL + && !h->def_regular) + { + int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START; + + (*_bfd_error_handler) + (_("%B: relocation %s against external symbol `%s' can not be used" + " when making a shared object; recompile with -fPIC"), + input_bfd, elfNN_aarch64_howto_table[howto_index].name, + h->root.root.string); + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + case BFD_RELOC_AARCH64_16: #if ARCH_SIZE == 64 case BFD_RELOC_AARCH64_32: #endif case BFD_RELOC_AARCH64_ADD_LO12: - case BFD_RELOC_AARCH64_ADR_LO21_PCREL: - case BFD_RELOC_AARCH64_ADR_HI21_PCREL: - case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL: case BFD_RELOC_AARCH64_BRANCH19: - case BFD_RELOC_AARCH64_LD_LO19_PCREL: case BFD_RELOC_AARCH64_LDST8_LO12: case BFD_RELOC_AARCH64_LDST16_LO12: case BFD_RELOC_AARCH64_LDST32_LO12: @@ -4452,9 +4472,6 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, case BFD_RELOC_AARCH64_MOVW_G2: case BFD_RELOC_AARCH64_MOVW_G2_NC: case BFD_RELOC_AARCH64_MOVW_G3: - case BFD_RELOC_AARCH64_16_PCREL: - case BFD_RELOC_AARCH64_32_PCREL: - case BFD_RELOC_AARCH64_64_PCREL: case BFD_RELOC_AARCH64_TSTBR14: value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, signed_addend, weak_undef_p); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 9aef68173f1..49842983e70 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2015-05-05 Jiong Wang + + Apply from master: + + 2015-04-24 Jiong. Wang + + * ld-aarch64/pcrel.s: New testcase. + * ld-aarch64/pcrel_pic_defiend_local.d: New expect file. + * ld-aarch64/pcrel_pic_undefined.d: Ditto. + * ld-aarch64/aarch64-elf.exp: Run them. + 2015-04-10 Alan Modra Revert 2015-03-06 H.J. Lu diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index c0bd39ae36a..7a24e52f2e1 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -104,6 +104,10 @@ run_dump_test "emit-relocs-local-addend" # test addend correctness when -r specified. run_dump_test "local-addend-r" +# test error handling on pcrel relocation for shared libraries. +run_dump_test "pcrel_pic_undefined" +run_dump_test "pcrel_pic_defined_local" + run_dump_test "limit-b" run_dump_test "limit-bl" run_dump_test "farcall-section" diff --git a/ld/testsuite/ld-aarch64/pcrel.s b/ld/testsuite/ld-aarch64/pcrel.s new file mode 100644 index 00000000000..df542ef5dee --- /dev/null +++ b/ld/testsuite/ld-aarch64/pcrel.s @@ -0,0 +1,20 @@ + .text + .align 2 +main: + # R_AARCH64_ADR_PREL_PG_HI21 + # R_AARCH64_ADR_PREL_PG_HI21_NC + # R_AARCH64_ADR_LO_21 + adrp x0, :pg_hi21:global_a + adrp x1, :pg_hi21_nc:global_a + adr x2, global_a + + #R_AARCH64_LD_PREL_LO19 + ldr x3, global_a + + # R_AARCH64_PREL16 + # R_AARCH64_PREL32 + # R_AARCH64_PREL64 + .hword global_a - . + .word global_a - . + .xword global_a - . + diff --git a/ld/testsuite/ld-aarch64/pcrel_pic_defined_local.d b/ld/testsuite/ld-aarch64/pcrel_pic_defined_local.d new file mode 100644 index 00000000000..832652fc9f6 --- /dev/null +++ b/ld/testsuite/ld-aarch64/pcrel_pic_defined_local.d @@ -0,0 +1,5 @@ +#name: PC-Rel relocation against defined +#source: pcrel.s +#objdump: -r +#ld: -shared -e0 -defsym global_a=0x1000 +#... diff --git a/ld/testsuite/ld-aarch64/pcrel_pic_undefined.d b/ld/testsuite/ld-aarch64/pcrel_pic_undefined.d new file mode 100644 index 00000000000..de7f020eb4c --- /dev/null +++ b/ld/testsuite/ld-aarch64/pcrel_pic_undefined.d @@ -0,0 +1,10 @@ +#name: PC-Rel relocation against undefined +#source: pcrel.s +#ld: -shared -e0 +#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21 against external symbol.*fPIC.* +#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21_NC against external symbol.*fPIC.* +#warning: .*: relocation R_AARCH64_ADR_PREL_LO21 against external symbol.*fPIC.* +#warning: .*: relocation R_AARCH64_LD_PREL_LO19 against external symbol.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL16 against external symbol.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL32 against external symbol.*fPIC.* +#warning: .*: relocation R_AARCH64_PREL64 against external symbol.*fPIC.*