[PATCH 6/6] bfd: strip symbols not representable in COFF/PE symbol table

Jan Beulich jbeulich@suse.com
Tue Mar 2 09:50:59 GMT 2021


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/
2021-02-XX  Jan Beulich  <jbeulich@suse.com>

	* cofflink.c (_bfd_coff_write_global_sym): Range-check symbol
	offset.

ld/
2021-02-XX  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.
---
RFC: There are likely more (target specific) testsuite changes needed,
     as I've only run Cygwin and MingW target tests so far.

--- a/bfd/cofflink.c
+++ b/bfd/cofflink.c
@@ -2602,6 +2602,16 @@ _bfd_coff_write_global_sym (struct bfd_h
 			+ 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;
 
--- 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
--- a/ld/testsuite/ld-scripts/pr22267.t
+++ b/ld/testsuite/ld-scripts/pr22267.t
@@ -1,4 +1,4 @@
 SECTIONS
 {
-  foo = ~0xFF;
+  foo = ~~0xFF;
 }



More information about the Binutils mailing list