Only check for valid Morello bounds on non-exec syms

Capabilities pointing to symbols in SEC_CODE sections are given the
bounds of the entire PCC.  We ensure that the PCC bounds are padded and
aligned as needed in the linker.

Capabilities pointing to other symbols (e.g. in data sections) are given
the bounds of the symbol that they point to.  It is the responsibility
of the assembly generator (i.e. usually the compiler) to ensure these
bounds are correctly aligned and padded as necessary.

We emit a warning for imprecise bounds in the second case, until this
patch that warning also looked at the first case.  This was a mistake
and is rectified in this commit.
This commit is contained in:
Matthew Malcomson
2022-10-13 11:20:16 +01:00
parent 36b6002396
commit eee3fada81
4 changed files with 44 additions and 11 deletions

View File

@@ -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)
{

View File

@@ -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"

View File

@@ -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 .*

View File

@@ -0,0 +1,9 @@
.data
.chericap _start
.text
.globl _start
.type _start,@function
_start:
ret
.zero 0x8000
.size _start, .-_start