* write.c (adjust_reloc_syms): If the fixup symbol has been

equated to an undefined symbol, convert the fixup to being against
	the target symbol.  Remove obsolete code handling a special case
	for i386 PIC.
This commit is contained in:
Ian Lance Taylor
1996-12-19 17:07:14 +00:00
parent cb07aaeb2b
commit 9c199842e5
2 changed files with 19 additions and 22 deletions

View File

@ -1,3 +1,10 @@
Thu Dec 19 12:06:08 1996 Ian Lance Taylor <ian@cygnus.com>
* write.c (adjust_reloc_syms): If the fixup symbol has been
equated to an undefined symbol, convert the fixup to being against
the target symbol. Remove obsolete code handling a special case
for i386 PIC.
start-sanitize-d10v start-sanitize-d10v
Wed Dec 18 16:00:42 1996 Martin M. Hunt <hunt@pizza.cygnus.com> Wed Dec 18 16:00:42 1996 Martin M. Hunt <hunt@pizza.cygnus.com>

View File

@ -667,7 +667,6 @@ adjust_reloc_syms (abfd, sec, xxx)
#endif #endif
sym = fixp->fx_addsy; sym = fixp->fx_addsy;
symsec = sym->bsym->section;
/* All symbols should have already been resolved at this /* All symbols should have already been resolved at this
point. It is possible to see unresolved expression point. It is possible to see unresolved expression
@ -678,6 +677,18 @@ adjust_reloc_syms (abfd, sec, xxx)
if (fixp->fx_subsy != NULL && ! fixp->fx_subsy->sy_resolved) if (fixp->fx_subsy != NULL && ! fixp->fx_subsy->sy_resolved)
resolve_symbol_value (fixp->fx_subsy); resolve_symbol_value (fixp->fx_subsy);
/* If this symbol is equated to an undefined symbol, convert
the fixup to being against that symbol. */
if (sym->sy_value.X_op == O_symbol
&& (! S_IS_DEFINED (sym) || S_IS_COMMON (sym)))
{
fixp->fx_offset += sym->sy_value.X_add_number;
sym = sym->sy_value.X_add_symbol;
fixp->fx_addsy = sym;
}
symsec = S_GET_SEGMENT (sym);
if (sym != NULL && sym->sy_mri_common) if (sym != NULL && sym->sy_mri_common)
{ {
/* These symbols are handled specially in fixup_segment. */ /* These symbols are handled specially in fixup_segment. */
@ -781,27 +792,6 @@ adjust_reloc_syms (abfd, sec, xxx)
} }
#endif #endif
/* For PIC support: We may get expressions like
"_GLOBAL_OFFSET_TABLE_+(.-L5)" where "." and "L5" may not
necessarily have had a fixed difference initially. But now
it should be a known constant, so we can reduce it. Since
we can't easily handle a symbol value that looks like
someUndefinedSymbol+const, though, we convert the fixup to
access the undefined symbol directly, and discard the
intermediate symbol. */
if (S_GET_SEGMENT (sym) == expr_section
&& sym->sy_value.X_op == O_add
&& (resolve_symbol_value (sym->sy_value.X_add_symbol),
S_GET_SEGMENT (sym->sy_value.X_add_symbol) == undefined_section)
&& (resolve_symbol_value (sym->sy_value.X_op_symbol),
S_GET_SEGMENT (sym->sy_value.X_op_symbol) == absolute_section))
{
fixp->fx_offset += S_GET_VALUE (sym->sy_value.X_op_symbol);
fixp->fx_offset += sym->sy_value.X_add_number;
fixp->fx_addsy = sym->sy_value.X_add_symbol;
goto reduce_fixup;
}
/* If the section symbol isn't going to be output, the relocs /* If the section symbol isn't going to be output, the relocs
at least should still work. If not, figure out what to do at least should still work. If not, figure out what to do
when we run into that case. when we run into that case.