* 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:
parent
cb07aaeb2b
commit
9c199842e5
@ -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>
|
||||
|
||||
|
34
gas/write.c
34
gas/write.c
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user