From 67b0f684803f5bec9b801c43fe1559bc88c15bb6 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 10 Mar 2021 08:12:37 +0100 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 +++++ bfd/cofflink.c | 11 +++++++++++ ld/ChangeLog | 8 ++++++++ ld/scripttempl/mcorepe.sc | 2 +- ld/testsuite/ld-scripts/pr22267.d | 3 +-- ld/testsuite/ld-scripts/pr22267.t | 2 +- 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index fe3808596bb..d3c1d403529 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2021-03-10 Jan Beulich + + * cofflink.c (_bfd_coff_write_global_sym): Range-check symbol + offset. + 2021-03-10 Alan Modra Jan Beulich diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 4b0aab2a4ce..874354a70d0 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -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; diff --git a/ld/ChangeLog b/ld/ChangeLog index c51332ad5c6..ec7854163fa 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2021-03-10 Jan Beulich + + * 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 * testsuite/ld-pe/reloc.s: Add entry point symbols. Increase diff --git a/ld/scripttempl/mcorepe.sc b/ld/scripttempl/mcorepe.sc index 1cdbac282cc..20fa6f95465 100644 --- a/ld/scripttempl/mcorepe.sc +++ b/ld/scripttempl/mcorepe.sc @@ -168,7 +168,7 @@ SECTIONS .stack 0x80000 : { - _stack = .; + PROVIDE(_stack = .); *(.stack) } } diff --git a/ld/testsuite/ld-scripts/pr22267.d b/ld/testsuite/ld-scripts/pr22267.d index b0bd18ed564..b46fec3ee73 100644 --- a/ld/testsuite/ld-scripts/pr22267.d +++ b/ld/testsuite/ld-scripts/pr22267.d @@ -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 diff --git a/ld/testsuite/ld-scripts/pr22267.t b/ld/testsuite/ld-scripts/pr22267.t index a0754058e59..004934594d5 100644 --- a/ld/testsuite/ld-scripts/pr22267.t +++ b/ld/testsuite/ld-scripts/pr22267.t @@ -1,4 +1,4 @@ SECTIONS { - foo = ~0xFF; + foo = ~~0xFF; } -- 2.30.2