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