summaryrefslogtreecommitdiff
path: root/gas/config/tc-mmix.c
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2002-02-04 04:03:15 +0000
committerHans-Peter Nilsson <hp@axis.com>2002-02-04 04:03:15 +0000
commitc296034e1e81e52e3d3069ca811fe259dec1cab7 (patch)
treea4e2cb371192e847ac40e1d6dcf25a99a39ee0f9 /gas/config/tc-mmix.c
parentac46bb56e7f002da0d7784a9d5bdb6bb468b9beb (diff)
downloadbinutils-redhat-c296034e1e81e52e3d3069ca811fe259dec1cab7.tar.gz
* 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.
Diffstat (limited to 'gas/config/tc-mmix.c')
-rw-r--r--gas/config/tc-mmix.c18
1 files changed, 14 insertions, 4 deletions
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)))