summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog12
-rw-r--r--gas/config/obj-multi.h2
-rw-r--r--gas/read.c4
-rw-r--r--gas/testsuite/ChangeLog4
-rw-r--r--gas/testsuite/gas/all/assign.s2
-rw-r--r--gas/write.c26
6 files changed, 44 insertions, 6 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 3f06e7a6c46..28cf35e7a8c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,15 @@
+2005-04-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * config/obj-multi.h (FAKE_LABEL_NAME): Defined.
+
+ * read.c (pseudo_set): Disallow symbol set to common symbol.
+
+ PR 857
+ * write.c (write_object_file): Report common symbol name when
+ disallowing local symbol set to common symbol.
+ (adjust_reloc_syms): Disallow local symbol set to undefined
+ symbol.
+
2005-04-25 Jan Beulich <jbeulich@novell.com>
* macro.c (macro_expand_body): Replace locals indicator parameters
diff --git a/gas/config/obj-multi.h b/gas/config/obj-multi.h
index 0e1190b87e5..2cca674e15b 100644
--- a/gas/config/obj-multi.h
+++ b/gas/config/obj-multi.h
@@ -146,6 +146,8 @@
#define EMIT_SECTION_SYMBOLS (this_format->emit_section_symbols)
+#define FAKE_LABEL_NAME (this_emulation->fake_label_name)
+
#ifdef OBJ_MAYBE_ELF
/* We need OBJ_SYMFIELD_TYPE so that symbol_get_obj is defined in symbol.c
We also need various STAB defines for stab.c */
diff --git a/gas/read.c b/gas/read.c
index b83f14017f5..54ac8448637 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -3301,6 +3301,10 @@ pseudo_set (symbolS *symbolP)
{
symbolS *s = exp.X_add_symbol;
+ if (S_IS_COMMON (s))
+ as_bad (_("`%s' can't be equated to common symbol '%s'"),
+ S_GET_NAME (symbolP), S_GET_NAME (s));
+
S_SET_SEGMENT (symbolP, seg);
S_SET_VALUE (symbolP, exp.X_add_number + S_GET_VALUE (s));
symbol_set_frag (symbolP, symbol_get_frag (s));
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 887cd03efc7..2504e0cad4e 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-04-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gas/all/assign.s: Make `x' and `y' global.
+
2005-04-25 Jan Beulich <jbeulich@novell.com>
* gas/macros/badarg.s: Add tests for collisions between/among macro
diff --git a/gas/testsuite/gas/all/assign.s b/gas/testsuite/gas/all/assign.s
index 1a414066f69..5f94392dc9a 100644
--- a/gas/testsuite/gas/all/assign.s
+++ b/gas/testsuite/gas/all/assign.s
@@ -1,7 +1,9 @@
+ .global x
x = zzz
x = x+1
.long x
+ .global y
y = 1
y = y+zzz
.long y
diff --git a/gas/write.c b/gas/write.c
index e154cda4277..417e0e971ea 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -787,12 +787,20 @@ adjust_reloc_syms (bfd *abfd ATTRIBUTE_UNUSED,
if (fixp->fx_subsy != NULL)
resolve_symbol_value (fixp->fx_subsy);
- /* If this symbol is equated to an undefined symbol, convert
- the fixup to being against that symbol. */
+ /* If this symbol is equated to an undefined or common symbol,
+ convert the fixup to being against that symbol. */
if (symbol_equated_reloc_p (sym))
{
+ symbolS *new_sym
+ = symbol_get_value_expression (sym)->X_add_symbol;
+ const char *name = S_GET_NAME (sym);
+ if (!S_IS_COMMON (new_sym)
+ && strcmp (name, FAKE_LABEL_NAME)
+ && (!S_IS_EXTERNAL (sym) || S_IS_LOCAL (sym)))
+ as_bad (_("Local symbol `%s' can't be equated to undefined symbol `%s'"),
+ name, S_GET_NAME (new_sym));
fixp->fx_offset += symbol_get_value_expression (sym)->X_add_number;
- sym = symbol_get_value_expression (sym)->X_add_symbol;
+ sym = new_sym;
fixp->fx_addsy = sym;
}
@@ -1927,9 +1935,15 @@ write_object_file (void)
symbols. */
if (symbol_equated_reloc_p (symp))
{
- if (S_IS_COMMON (symp))
- as_bad (_("`%s' can't be equated to common symbol"),
- S_GET_NAME (symp));
+ const char *name = S_GET_NAME (symp);
+ if (S_IS_COMMON (symp)
+ && strcmp (name, FAKE_LABEL_NAME)
+ && (!S_IS_EXTERNAL (symp) || S_IS_LOCAL (symp)))
+ {
+ expressionS *e = symbol_get_value_expression (symp);
+ as_bad (_("Local symbol `%s' can't be equated to common symbol `%s'"),
+ name, S_GET_NAME (e->X_add_symbol));
+ }
symbol_remove (symp, &symbol_rootP, &symbol_lastP);
continue;
}