aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2002-08-10 14:49:48 +0000
committerAlan Modra <amodra@gmail.com>2002-08-10 14:49:48 +0000
commit31312f958ee26b1d39e65ff18e63466bb552107e (patch)
treef09a5d2077c939dbeb8e92c16c2420a1d7f02dd9 /gas
parent2548cbcc14abe396cdb4aa2258d075d0bee86c74 (diff)
downloadgdb-31312f958ee26b1d39e65ff18e63466bb552107e.zip
gdb-31312f958ee26b1d39e65ff18e63466bb552107e.tar.gz
gdb-31312f958ee26b1d39e65ff18e63466bb552107e.tar.bz2
* config/tc-i386.c (tc_i386_fix_adjustable): Test OUTPUT_FLAVOR
for ELF, and don't bother checking ELF relocs when non-ELF. (i386_immediate): Allow absolute_section expressions for aout. (i386_displacement): Likewise. Also test bfd_is_com_section. (md_estimate_size_before_relax): Test OUTPUT_FLAVOR for ELF. (md_apply_fix3): Hack for bfd_install_relocation when fx_pcrel, not when fx_addsy. Remove dead code.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/config/tc-i386.c42
2 files changed, 36 insertions, 16 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 8edb8a0..acce571 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2002-08-10 Alan Modra <amodra@bigpond.net.au>
+
+ * config/tc-i386.c (tc_i386_fix_adjustable): Test OUTPUT_FLAVOR
+ for ELF, and don't bother checking ELF relocs when non-ELF.
+ (i386_immediate): Allow absolute_section expressions for aout.
+ (i386_displacement): Likewise. Also test bfd_is_com_section.
+ (md_estimate_size_before_relax): Test OUTPUT_FLAVOR for ELF.
+ (md_apply_fix3): Hack for bfd_install_relocation when fx_pcrel,
+ not when fx_addsy. Remove dead code.
+
2002-08-09 Graeme Peterson <gp@qnx.com>
* configure.in: Add support for ppc-*-nto* target.
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index aa820ec..59e19dd 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -1207,9 +1207,12 @@ reloc (size, pcrel, sign, other)
int
tc_i386_fix_adjustable (fixP)
- fixS *fixP;
+ fixS *fixP ATTRIBUTE_UNUSED;
{
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
+ if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
+ return 1;
+
/* Prevent all adjustments to global symbols, or else dynamic
linking will not work correctly. */
if (S_IS_EXTERNAL (fixP->fx_addsy)
@@ -1220,7 +1223,7 @@ tc_i386_fix_adjustable (fixP)
&& (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
&& fixP->fx_pcrel))
return 0;
-#endif
+
/* adjust_reloc_syms doesn't know about the GOT. */
if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
|| fixP->fx_r_type == BFD_RELOC_386_PLT32
@@ -1237,6 +1240,7 @@ tc_i386_fix_adjustable (fixP)
|| fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
|| fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
return 0;
+#endif
return 1;
}
#else
@@ -3668,6 +3672,7 @@ i386_immediate (imm_start)
#ifdef BFD_ASSEMBLER
&& OUTPUT_FLAVOR == bfd_target_aout_flavour
#endif
+ && exp_seg != absolute_section
&& exp_seg != text_section
&& exp_seg != data_section
&& exp_seg != bss_section
@@ -3882,10 +3887,15 @@ i386_displacement (disp_start, disp_end)
#ifdef BFD_ASSEMBLER
&& OUTPUT_FLAVOR == bfd_target_aout_flavour
#endif
+ && exp_seg != absolute_section
&& exp_seg != text_section
&& exp_seg != data_section
&& exp_seg != bss_section
- && exp_seg != undefined_section)
+ && exp_seg != undefined_section
+#ifdef BFD_ASSEMBLER
+ && !bfd_is_com_section (exp_seg)
+#endif
+ )
{
#ifdef BFD_ASSEMBLER
as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
@@ -4311,8 +4321,9 @@ md_estimate_size_before_relax (fragP, segment)
shared library. */
if (S_GET_SEGMENT (fragP->fr_symbol) != segment
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
- || S_IS_EXTERNAL (fragP->fr_symbol)
- || S_IS_WEAK (fragP->fr_symbol)
+ || (OUTPUT_FLAVOR == bfd_target_elf_flavour
+ && (S_IS_EXTERNAL (fragP->fr_symbol)
+ || S_IS_WEAK (fragP->fr_symbol)))
#endif
)
{
@@ -4586,15 +4597,16 @@ md_apply_fix3 (fixP, valP, seg)
}
}
- /* This is a hack. There should be a better way to handle this.
- This covers for the fact that bfd_install_relocation will
- subtract the current location (for partial_inplace, PC relative
- relocations); see more below. */
- if ((fixP->fx_r_type == BFD_RELOC_32_PCREL
- || fixP->fx_r_type == BFD_RELOC_16_PCREL
- || fixP->fx_r_type == BFD_RELOC_8_PCREL)
- && fixP->fx_addsy && !use_rela_relocations)
+ if (fixP->fx_pcrel
+ && (fixP->fx_r_type == BFD_RELOC_32_PCREL
+ || fixP->fx_r_type == BFD_RELOC_16_PCREL
+ || fixP->fx_r_type == BFD_RELOC_8_PCREL)
+ && !use_rela_relocations)
{
+ /* This is a hack. There should be a better way to handle this.
+ This covers for the fact that bfd_install_relocation will
+ subtract the current location (for partial_inplace, PC relative
+ relocations); see more below. */
#ifndef OBJ_AOUT
if (OUTPUT_FLAVOR == bfd_target_elf_flavour
#ifdef TE_PE
@@ -4645,6 +4657,7 @@ md_apply_fix3 (fixP, valP, seg)
runtime we merely add the offset to the actual PLT entry. */
value = -4;
break;
+
case BFD_RELOC_386_GOT32:
case BFD_RELOC_386_TLS_GD:
case BFD_RELOC_386_TLS_LDM:
@@ -4655,9 +4668,6 @@ md_apply_fix3 (fixP, valP, seg)
case BFD_RELOC_X86_64_GOT32:
value = 0; /* Fully resolved at runtime. No addend. */
break;
- case BFD_RELOC_386_GOTOFF:
- case BFD_RELOC_X86_64_GOTPCREL:
- break;
case BFD_RELOC_VTABLE_INHERIT:
case BFD_RELOC_VTABLE_ENTRY: