From 689be7170418e0cf6400f76f3a00a111925a3f3d Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 18 Jun 2000 23:48:21 +0000 Subject: [PATCH] 2000-06-18 H.J. Lu * 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 | 7 +++++++ bfd/coff-i386.c | 23 ++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e50360cdb23..92b23a22ccd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2000-06-18 H.J. Lu + + * 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 * elf32-mips.c (mips_elf_calculate_relocation): Explicitly write diff --git a/bfd/coff-i386.c b/bfd/coff-i386.c index 84d4d145c7b..c7aa659c0e0 100644 --- a/bfd/coff-i386.c +++ b/bfd/coff-i386.c @@ -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 -- 2.30.2