aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/tc-alpha.c3
-rw-r--r--gas/config/tc-sparc.c5
-rw-r--r--gas/write.c8
4 files changed, 17 insertions, 6 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 261ce4d..b07bb46 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2001-11-28 Jakub Jelinek <jakub@redhat.com>
+
+ * write.c (adjust_reloc_syms): Mark SEC_MERGE symbols as used
+ in reloc if it has non-zero addend.
+ * config/tc-alpha.c (tc_gen_reloc): Reinstall SEC_MERGE check.
+ * config/tc-sparc.c (md_apply_fix3): Likewise.
+
2001-11-28 Andreas Schwab <schwab@suse.de>
* as.c (parse_args): Call md_after_parse_args if defined.
diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c
index f9908e7..f73c862 100644
--- a/gas/config/tc-alpha.c
+++ b/gas/config/tc-alpha.c
@@ -1507,7 +1507,8 @@ tc_gen_reloc (sec, fixp)
* at assembly time. bfd_perform_reloc doesn't know about this sort
* of thing, and as a result we need to fake it out here.
*/
- if ((S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy))
+ if ((S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)
+ || (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE))
&& !S_IS_COMMON (fixp->fx_addsy))
reloc->addend -= symbol_get_bfdsym (fixp->fx_addsy)->value;
#endif
diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c
index f1639a3..2db2bac 100644
--- a/gas/config/tc-sparc.c
+++ b/gas/config/tc-sparc.c
@@ -2909,12 +2909,7 @@ md_apply_fix3 (fixP, valP, segment)
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)
|| (seg != segment
&& (((bfd_get_section_flags (stdoutput, seg) & SEC_LINK_ONCE) != 0)
diff --git a/gas/write.c b/gas/write.c
index 5397aa0..55db85a 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -873,6 +873,14 @@ adjust_reloc_syms (abfd, sec, xxx)
symbol_mark_used_in_reloc (fixp->fx_addsy);
goto done;
}
+
+ /* Never adjust a reloc against local symbol in a merge section
+ with non-zero addend. */
+ if ((symsec->flags & SEC_MERGE) && fixp->fx_offset)
+ {
+ symbol_mark_used_in_reloc (fixp->fx_addsy);
+ goto done;
+ }
#endif
/* Is there some other reason we can't adjust this one? (E.g.,