bfd: strip symbols not representable in COFF/PE symbol table

The offset-within-section field in the symbol table entry is only 32
bits wide, so rather than emitting bogus entries omit them, and issue
a diagnostic identifying the issue.

This requires adjusting the PR/22267 test to no longer produce symbols
with out of range values on 64-bit BFD. This also depends on
adjustments to testsuite/ld-scripts/map-address.* made by an earlier
patch. The purpose of the test can very well be achieved nevertheless.
This commit is contained in:
Jan Beulich 2021-03-10 08:12:37 +01:00
parent 3044062c34
commit 67b0f68480
6 changed files with 27 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2021-03-10 Jan Beulich <jbeulich@suse.com>
* cofflink.c (_bfd_coff_write_global_sym): Range-check symbol
offset.
2021-03-10 Alan Modra <amodra@gmail.com>
Jan Beulich <jbeulich@suse.com>

View File

@ -2602,6 +2602,17 @@ _bfd_coff_write_global_sym (struct bfd_hash_entry *bh, void *data)
+ h->root.u.def.section->output_offset);
if (! obj_pe (flaginfo->output_bfd))
isym.n_value += sec->vma;
#ifdef BFD64
if (isym.n_value > (bfd_vma) 0xffffffff)
{
if (! h->root.linker_def)
_bfd_error_handler
(_("%pB: stripping non-representable symbol '%s' (value "
"%" BFD_VMA_FMT "x)"),
output_bfd, h->root.root.string, isym.n_value);
return TRUE;
}
#endif
}
break;

View File

@ -1,3 +1,11 @@
2021-03-10 Jan Beulich <jbeulich@suse.com>
* testsuite/ld-scripts/pr22267.t: Avoid symbol value with more
than 32 set bits.
* testsuite/ld-scripts/pr22267.d: Adjust expectation and drop
comment.
* scripttempl/mcorepe.sc: Use PROVIDE() for _stack.
2021-03-09 Jan Beulich <jbeulich@suse.com>
* testsuite/ld-pe/reloc.s: Add entry point symbols. Increase

View File

@ -168,7 +168,7 @@ SECTIONS
.stack 0x80000 :
{
_stack = .;
PROVIDE(_stack = .);
*(.stack)
}
}

View File

@ -2,7 +2,6 @@
#nm: -n
#xfail: bfin-*-linux* frv-*-linux*
# Some targets may zero-extend 32-bit address to 64 bits.
#...
0*f+00 A foo
0*ff A foo
#pass

View File

@ -1,4 +1,4 @@
SECTIONS
{
foo = ~0xFF;
foo = ~~0xFF;
}