From: Ian Lance Taylor Date: Thu, 19 Dec 1996 17:07:14 +0000 (+0000) Subject: * write.c (adjust_reloc_syms): If the fixup symbol has been X-Git-Tag: gdb-4_18~6885 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9c199842e54a91b59b2d319c1d53dc94464fa9f7;p=platform%2Fupstream%2Fbinutils.git * 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 79133f0..85776a0 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +Thu Dec 19 12:06:08 1996 Ian Lance Taylor + + * 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 diff --git a/gas/write.c b/gas/write.c index ab026f1..18ebc49 100644 --- a/gas/write.c +++ b/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.