From: Jiong Wang Date: Fri, 24 Apr 2015 21:35:04 +0000 (+0100) Subject: [AArch64] Improve PC-relative relocation check for shared library X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=dcbd20eb1499db937785881aca2f9584a330723c;p=deliverable%2Fbinutils-gdb.git [AArch64] Improve PC-relative relocation check for shared library 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 87e22c2d6e..3c33fadecb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2015-04-24 Jiong Wang + + * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Reject + PC-relative relocation for external symbol. + 2015-04-24 Nick Clifton PR 18313 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 85cf8560f3..c98987b0aa 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -4801,16 +4801,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: @@ -4826,9 +4846,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/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index 895b1b26bc..bfbbe2425a 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -105,6 +105,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 0000000000..df542ef5de --- /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 0000000000..832652fc9f --- /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 0000000000..de7f020eb4 --- /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.*