mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-19 05:42:42 +08:00
* 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:
@ -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>
|
||||||
|
|
||||||
|
34
gas/write.c
34
gas/write.c
@ -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.
|
||||||
|
Reference in New Issue
Block a user