Commit: Fix spurious relocation truncated to fit errors for 64-bit PE targets.

Nick Clifton nickc@redhat.com
Wed Mar 26 16:29:00 GMT 2014


Hi Guys,

  I am applying the patch below to fix a problem for 64-bit PE targets
  (specifically Cygwin), whereby the linker can issue spurious
  complaints about truncated relocations.  What is happening is that the
  linker is attempting to resolve a 32-bit relocation against a symbol
  in a section that is going to be discarded.  So the output section's
  address is set to 0, but since we are using 64-bit addresses and the
  base address can be above 4Gb, we can end up with an invalid 32-bit
  offset.

  The fix is simple - ignore relocations against discarded sections.

  Tested without regressions on an x86_64-pc-cygwin toolchain.

Cheers
  Nick

bfd/ChangeLog
2014-03-26  Nick Clifton  <nickc@redhat.com>

	* cofflink.c (_bfd_coff_generic_relocate_section): Skip
	relocations in discarded sections.

Index: bfd/cofflink.c
===================================================================
RCS file: /cvs/src/src/bfd/cofflink.c,v
retrieving revision 1.84
diff -c -p -r1.84 cofflink.c
*** bfd/cofflink.c      10 Jan 2013 20:03:52 -0000      1.84
--- bfd/cofflink.c      4 Jun 2013 12:03:23 -0000
*************** _bfd_coff_generic_relocate_section (bfd 
*** 3060,3065 ****
--- 3060,3070 ----
          else
            {
              sec = sections[symndx];
+ 
+             /* If the output section has been discarded then ignore this reloc.  */
+             if (sec->output_section->vma == 0)
+               continue;
+ 
                val = (sec->output_section->vma
                     + sec->output_offset
                     + sym->n_value);



More information about the Binutils mailing list