* 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
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
sym = fixp->fx_addsy;
symsec = sym->bsym->section;
/* All symbols should have already been resolved at this
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)
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)
{
/* These symbols are handled specially in fixup_segment. */
@ -781,27 +792,6 @@ adjust_reloc_syms (abfd, sec, xxx)
}
#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
at least should still work. If not, figure out what to do
when we run into that case.