diff options
author | Jan Beulich <jbeulich@suse.com> | 2021-03-10 08:12:37 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2021-03-10 08:12:37 +0100 |
commit | 67b0f684803f5bec9b801c43fe1559bc88c15bb6 (patch) | |
tree | 6430680e12759db6270ac8b4ffde38bab1756605 | |
parent | 3044062c34f2372f4ecf81b69d9e63685cd5e995 (diff) | |
download | binutils-67b0f684803f5bec9b801c43fe1559bc88c15bb6.zip binutils-67b0f684803f5bec9b801c43fe1559bc88c15bb6.tar.gz binutils-67b0f684803f5bec9b801c43fe1559bc88c15bb6.tar.bz2 |
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.
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/cofflink.c | 11 | ||||
-rw-r--r-- | ld/ChangeLog | 8 | ||||
-rw-r--r-- | ld/scripttempl/mcorepe.sc | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/pr22267.d | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/pr22267.t | 2 |
6 files changed, 27 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index fe38085..d3c1d40 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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> diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 4b0aab2..874354a 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 c51332a..ec78541 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -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 diff --git a/ld/scripttempl/mcorepe.sc b/ld/scripttempl/mcorepe.sc index 1cdbac2..20fa6f9 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 b0bd18e..b46fec3 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 a075405..0049345 100644 --- a/ld/testsuite/ld-scripts/pr22267.t +++ b/ld/testsuite/ld-scripts/pr22267.t @@ -1,4 +1,4 @@ SECTIONS { - foo = ~0xFF; + foo = ~~0xFF; } |