diff options
-rw-r--r-- | bfd/elfnn-aarch64.c | 21 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/aarch64-elf.exp | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/morello-large-function.d | 23 | ||||
-rw-r--r-- | ld/testsuite/ld-aarch64/morello-large-function.s | 9 |
4 files changed, 44 insertions, 11 deletions
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index be4c735753d..d32b0740184 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -7131,17 +7131,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 @@ -7160,6 +7149,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 73c414ad7b4..b32cb235ead 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -392,6 +392,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 00000000000..dc0af92e12f --- /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 00000000000..46cb51e0c68 --- /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 |