@ -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