From 3e81f9ef52ce5c58635439078e4b4da6b0a1a0a9 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sun, 12 Sep 1999 05:06:09 +0000 Subject: [PATCH] * config/tc-i386.c (md_apply_fix3): Add horrible adjustments to the value if TE_PE and a global defined symbol. --- gas/ChangeLog | 5 +++++ gas/config/tc-i386.c | 30 ++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 8e114e1dab..565944d0f6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +1999-09-12 Ian Lance Taylor + + * config/tc-i386.c (md_apply_fix3): Add horrible adjustments to + the value if TE_PE and a global defined symbol. + 1999-09-11 Ian Lance Taylor * write.c (dump_section_relocs): Call print_symbol_value_1 to diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 0a6b1de651..8e3cae7008 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -938,8 +938,8 @@ reloc (size, pcrel, other) * some cases we force the original symbol to be used. */ int -tc_i386_fix_adjustable(fixP) - fixS * fixP; +tc_i386_fix_adjustable (fixP) + fixS *fixP; { #if defined (OBJ_ELF) || defined (TE_PE) /* Prevent all adjustments to global symbols, or else dynamic @@ -3908,8 +3908,34 @@ md_apply_fix3 (fixP, valp, seg) address offset for a PC relative symbol. */ if (S_GET_SEGMENT (fixP->fx_addsy) != seg) value += md_pcrel_from (fixP); + else if (S_IS_EXTERNAL (fixP->fx_addsy) + || S_IS_WEAK (fixP->fx_addsy)) + { + /* We are generating an external relocation for this defined + symbol. We add the address, because + bfd_install_relocation will subtract it. VALUE already + holds the symbol value, because fixup_segment added it + in. We subtract it out, and then we subtract it out + again because bfd_install_relocation will add it in + again. */ + value += md_pcrel_from (fixP); + value -= 2 * S_GET_VALUE (fixP->fx_addsy); + } #endif } +#ifdef TE_PE + else if (fixP->fx_addsy != NULL + && S_IS_DEFINED (fixP->fx_addsy) + && (S_IS_EXTERNAL (fixP->fx_addsy) + || S_IS_WEAK (fixP->fx_addsy))) + { + /* We are generating an external relocation for this defined + symbol. VALUE already holds the symbol value, and + bfd_install_relocation will add it in again. We don't want + either addition. */ + value -= 2 * S_GET_VALUE (fixP->fx_addsy); + } +#endif /* Fix a few things - the dynamic linker expects certain values here, and we must not dissappoint it. */ -- 2.11.0