diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 3e0562b72bc69a9c43f01c80c604b85c582f4f7b..da3c629fcdbfbceed633d9af7c5751dd358492fc 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -6965,17 +6965,6 @@ c64_fixup_frag (bfd *input_bfd, struct bfd_link_info *info, bfd_vma base = value, limit = value + size; unsigned align = 0; - if (!bounds_ok && !c64_valid_cap_range (&base, &limit, &align)) - { - /* Just warn about this. It's not a requirement that bounds on - objects should be precise, so there's no reason to error out on - such an object. */ - /* xgettext:c-format */ - _bfd_error_handler - (_("%pB: capability range for '%s' may exceed object bounds"), - input_bfd, sym_name); - } - if (perm_sec && perm_sec->flags & SEC_CODE) { /* Any symbol pointing into an executable section gets bounds according @@ -6994,6 +6983,16 @@ c64_fixup_frag (bfd *input_bfd, struct bfd_link_info *info, data or jump to other functions. */ size = pcc_high - pcc_low; } + else if (!bounds_ok && !c64_valid_cap_range (&base, &limit, &align)) + { + /* Just warn about this. It's not a requirement that bounds on + objects should be precise, so there's no reason to error out on + such an object. */ + /* xgettext:c-format */ + _bfd_error_handler + (_("%pB: capability range for '%s' may exceed object bounds"), + input_bfd, sym_name); + } if (perm_sec != NULL) { diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index 4200c1d17e97ac9b54f2a0a051f15f0d51d47c06..a07a6c50bb8b601761cf38607afbc0a4dcc9ef0c 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -390,6 +390,8 @@ run_dump_test_lp64 "morello-illegal-tls" run_dump_test_lp64 "morello-illegal-tls-pie" run_dump_test_lp64 "morello-illegal-tls-shared" +run_dump_test_lp64 "morello-large-function" + run_dump_test "no-morello-syms-static" run_dump_test "reloc-overflow-bad" diff --git a/ld/testsuite/ld-aarch64/morello-large-function.d b/ld/testsuite/ld-aarch64/morello-large-function.d new file mode 100644 index 0000000000000000000000000000000000000000..dc0af92e12f9ab7203a400997ded14c8bdf4172c --- /dev/null +++ b/ld/testsuite/ld-aarch64/morello-large-function.d @@ -0,0 +1,23 @@ +# Mainly here to check that this actually links. +# This testcase used to complain that the function capability may have +# imprecise bounds, but since such capabilities are given PCC bounds that error +# was invalid. +# +# Even though the only point is to check that the testcase links, we still +# ensure that the dump of the .data section contains a relocation with the +# correct permissions. +#as: -march=morello+c64 +#ld: -pie -static +#objdump: -DR -j .data + +.*: file format .* + + +Disassembly of section \.data: + +[0-9a-f]+ <__data_start>: + *[0-9a-f]+: .* + .*: R_MORELLO_RELATIVE \*ABS\*\+.* + *[0-9a-f]+: .* udf #0 + *[0-9a-f]+: .* + *[0-9a-f]+: 04000000 .* diff --git a/ld/testsuite/ld-aarch64/morello-large-function.s b/ld/testsuite/ld-aarch64/morello-large-function.s new file mode 100644 index 0000000000000000000000000000000000000000..46cb51e0c68cba982e8bf2b83b696399a6225f21 --- /dev/null +++ b/ld/testsuite/ld-aarch64/morello-large-function.s @@ -0,0 +1,9 @@ +.data + .chericap _start +.text + .globl _start + .type _start,@function +_start: + ret + .zero 0x8000 + .size _start, .-_start