Do not remove the symbol's value from the addend for fixups against local
symbols in SEC_MERGE sections - it was not added in, in the first place.
This commit is contained in:
parent
58a3581362
commit
42ebd756d5
2 changed files with 28 additions and 15 deletions
|
@ -1,3 +1,9 @@
|
|||
2001-11-14 Nick Clifton <nickc@cambridge.redhat.com>
|
||||
|
||||
* config/tc-sparc.c (md_apply_fix3): Do not remove the symbol's
|
||||
value from the addend for fixups against local symbols in
|
||||
SEC_MERGE sections - it was not added in, in the first place.
|
||||
|
||||
2001-11-11 Timothy Wall <twall@alum.mit.edu>
|
||||
|
||||
* write.c (relax_segment): Convert symbol address into an octet
|
||||
|
|
|
@ -2905,22 +2905,29 @@ md_apply_fix3 (fixP, value, segment)
|
|||
don't want to include the value of an externally visible symbol. */
|
||||
if (fixP->fx_addsy != NULL)
|
||||
{
|
||||
if (symbol_used_in_reloc_p (fixP->fx_addsy)
|
||||
&& (S_IS_EXTERNAL (fixP->fx_addsy)
|
||||
|| S_IS_WEAK (fixP->fx_addsy)
|
||||
|| (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE)
|
||||
symbolS * sym = fixP->fx_addsy;
|
||||
segT seg = S_GET_SEGMENT (sym);
|
||||
|
||||
if (symbol_used_in_reloc_p (sym)
|
||||
&& (S_IS_EXTERNAL (sym)
|
||||
|| S_IS_WEAK (sym)
|
||||
#if 0 /* Although fixups against local symbols in SEC_MERGE sections
|
||||
should be treated as if they were against external symbols
|
||||
write.c:fixup_segment() will not have included the value of
|
||||
the symbol under these particular cicumstances. */
|
||||
|| (seg->flags & SEC_MERGE)
|
||||
#endif
|
||||
|| (sparc_pic_code && ! fixP->fx_pcrel)
|
||||
|| (S_GET_SEGMENT (fixP->fx_addsy) != segment
|
||||
&& ((bfd_get_section_flags (stdoutput,
|
||||
S_GET_SEGMENT (fixP->fx_addsy))
|
||||
& SEC_LINK_ONCE) != 0
|
||||
|| strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
|
||||
".gnu.linkonce",
|
||||
sizeof ".gnu.linkonce" - 1) == 0)))
|
||||
&& S_GET_SEGMENT (fixP->fx_addsy) != absolute_section
|
||||
&& S_GET_SEGMENT (fixP->fx_addsy) != undefined_section
|
||||
&& ! bfd_is_com_section (S_GET_SEGMENT (fixP->fx_addsy)))
|
||||
fixP->fx_addnumber -= S_GET_VALUE (fixP->fx_addsy);
|
||||
|| (seg != segment
|
||||
&& (((bfd_get_section_flags (stdoutput, seg) & SEC_LINK_ONCE) != 0)
|
||||
|| (strncmp (segment_name (seg),
|
||||
".gnu.linkonce",
|
||||
sizeof ".gnu.linkonce" - 1) == 0))))
|
||||
&& seg != absolute_section
|
||||
&& seg != undefined_section
|
||||
&& ! bfd_is_com_section (seg))
|
||||
fixP->fx_addnumber -= S_GET_VALUE (sym);
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue