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.
This commit is contained in:
H.J. Lu 2000-06-18 23:48:21 +00:00
parent 119caedd35
commit 689be71704
2 changed files with 29 additions and 1 deletions

View 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> 2000-06-17 Ulf Carlsson <ulfc@engr.sgi.com>
* elf32-mips.c (mips_elf_calculate_relocation): Explicitly write * elf32-mips.c (mips_elf_calculate_relocation): Explicitly write

View File

@ -73,8 +73,10 @@ coff_i386_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd,
{ {
symvalue diff; symvalue diff;
#ifndef COFF_WITH_PE
if (output_bfd == (bfd *) NULL) if (output_bfd == (bfd *) NULL)
return bfd_reloc_continue; return bfd_reloc_continue;
#endif
if (bfd_is_com_section (symbol->section)) 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 ignores the addend for a COFF target when producing
relocateable output. This seems to be always wrong for 386 relocateable output. This seems to be always wrong for 386
COFF, so we handle the addend here instead. */ 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 #ifdef COFF_WITH_PE