2000-06-18 H.J. Lu <hjl@gnu.org>
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 18 Jun 2000 23:48:21 +0000 (23:48 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 18 Jun 2000 23:48:21 +0000 (23:48 +0000)
* coff-i386.c (coff_i386_reloc): Don't return in case of
output_bfd == (bfd *) NULL if COFF_WITH_PE is defined.
Compensate PE relocations when linking with non-PE object
files to generate a non-PE executable.

bfd/ChangeLog
bfd/coff-i386.c

index e50360cdb2376d6a0cc841cd96f8e06b9a8bc81f..92b23a22ccdfdf1295d42d056451097c62154c36 100644 (file)
@@ -1,3 +1,10 @@
+2000-06-18  H.J. Lu  <hjl@gnu.org>
+
+       * coff-i386.c (coff_i386_reloc): Don't return in case of
+       output_bfd == (bfd *) NULL if COFF_WITH_PE is defined.
+       Compensate PE relocations when linking with non-PE object
+       files to generate a non-PE executable.
+
 2000-06-17  Ulf Carlsson  <ulfc@engr.sgi.com>
 
        * elf32-mips.c (mips_elf_calculate_relocation): Explicitly write
index 84d4d145c7b6f269acb708e40a8d95f1448b8678..c7aa659c0e021ba9a3faa2f26bf889e6dbf17d19 100644 (file)
@@ -73,8 +73,10 @@ coff_i386_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
 {
   symvalue diff;
 
+#ifndef COFF_WITH_PE
   if (output_bfd == (bfd *) NULL)
     return bfd_reloc_continue;
+#endif
 
   if (bfd_is_com_section (symbol->section))
     {
@@ -102,7 +104,26 @@ coff_i386_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
         ignores the addend for a COFF target when producing
         relocateable output.  This seems to be always wrong for 386
         COFF, so we handle the addend here instead.  */
-      diff = reloc_entry->addend;
+#ifdef COFF_WITH_PE
+      if (output_bfd == (bfd *) NULL)
+       {
+         reloc_howto_type *howto = reloc_entry->howto;
+
+         /* Although PC relative relocations are very similar between
+            PE and non-PE formats, but they are off by 1 << howto->size
+            bytes. For the external relocation, PE is very different
+            from others. See md_apply_fix3 () in gas/config/tc-i386.c.
+            When we link PE and non-PE object files together to
+            generate a non-PE executable, we have to compensate it
+            here.  */
+         if (howto->pc_relative == true && howto->pcrel_offset == true)
+           diff = -(1 << howto->size);
+         else
+           diff = -reloc_entry->addend;
+       }
+      else
+#endif
+       diff = reloc_entry->addend;
     }
 
 #ifdef COFF_WITH_PE