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:
parent
119caedd35
commit
689be71704
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user