summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/tc-mmix.c18
2 files changed, 21 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 82b452125c..968ce1727d 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2002-02-04 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/tc-mmix.c (tc_gen_reloc): Don't try and take the value of
+ common and weak symbols. Handle common and weak symbols as
+ undefined symbols with regards to GREG handling and merging.
+ (mmix_frob_file): Ditto.
+
2002-02-02 Jason Thorpe <thorpej@wasabisystems.com>
* configure.in (hppa-*-netbsd*): New target.
diff --git a/gas/config/tc-mmix.c b/gas/config/tc-mmix.c
index e396027c70..a8c7e239c1 100644
--- a/gas/config/tc-mmix.c
+++ b/gas/config/tc-mmix.c
@@ -2587,14 +2587,20 @@ tc_gen_reloc (section, fixP)
fixS *fixP;
{
bfd_signed_vma val
- = fixP->fx_offset + (fixP->fx_addsy ? S_GET_VALUE (fixP->fx_addsy) : 0);
+ = fixP->fx_offset
+ + (fixP->fx_addsy != NULL
+ && !S_IS_WEAK (fixP->fx_addsy)
+ && !S_IS_COMMON (fixP->fx_addsy)
+ ? S_GET_VALUE (fixP->fx_addsy) : 0);
arelent *relP;
bfd_reloc_code_real_type code = BFD_RELOC_NONE;
char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
symbolS *addsy = fixP->fx_addsy;
asection *addsec = addsy == NULL ? NULL : S_GET_SEGMENT (addsy);
asymbol *baddsy = addsy != NULL ? symbol_get_bfdsym (addsy) : NULL;
- bfd_vma addend = val - (baddsy == NULL ? 0 : bfd_asymbol_value (baddsy));
+ bfd_vma addend
+ = val - (baddsy == NULL || S_IS_COMMON (addsy) || S_IS_WEAK (addsy)
+ ? 0 : bfd_asymbol_value (baddsy));
/* A single " LOCAL expression" in the wrong section will not work when
linking to MMO; relocations for zero-content sections are then
@@ -2720,7 +2726,9 @@ tc_gen_reloc (section, fixP)
struct mmix_symbol_gregs *gregs;
struct mmix_symbol_greg_fixes *fix;
- if (S_IS_DEFINED (addsy))
+ if (S_IS_DEFINED (addsy)
+ && !bfd_is_com_section (addsec)
+ && !S_IS_WEAK (addsy))
{
if (! symbol_section_p (addsy) && ! bfd_is_abs_section (addsec))
as_fatal (_("internal: BFD_RELOC_MMIX_BASE_PLUS_OFFSET not resolved to section"));
@@ -3592,7 +3600,9 @@ mmix_frob_file ()
/* If the symbol is defined, then it must be resolved to a section
symbol at this time, or else we don't know how to handle it. */
- if (S_IS_DEFINED (sym))
+ if (S_IS_DEFINED (sym)
+ && !bfd_is_com_section (S_GET_SEGMENT (sym))
+ && !S_IS_WEAK (sym))
{
if (! symbol_section_p (sym)
&& ! bfd_is_abs_section (S_GET_SEGMENT (sym)))