Also disallow global alias of common symbol
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 11 Aug 2017 14:41:51 +0000 (07:41 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 11 Aug 2017 14:42:02 +0000 (07:42 -0700)
We can't create alias of common symbol.  Local alias of common symbol has
been disallowed.  But global alias of common symbol is disallowed when the
common symbol is seen first and silently dropped otherwise.  This patch
disallows alias of common symbol in all cases.

gas/

PR gas/21667
* read.c (pseudo_set): Update error message for alias of common
symbol.
* write.c (write_object_file): Disallow both local and global
aliases of common symbol.
* testsuite/gas/elf/common5a.d: New file.
* testsuite/gas/elf/common5a.l: Likewise.
* testsuite/gas/elf/common5a.s: Likewise.
* testsuite/gas/elf/common5b.d: Likewise.
* testsuite/gas/elf/common5b.l: Likewise.
* testsuite/gas/elf/common5b.s: Likewise.
* testsuite/gas/elf/common5c.d: Likewise.
* testsuite/gas/elf/common5c.s: Likewise.
* testsuite/gas/elf/common5d.d: Likewise.
* testsuite/gas/elf/common5d.s: Likewise.
* testsuite/gas/elf/elf.exp: Run common5a, common5b, common5c
and common5d.

14 files changed:
gas/ChangeLog
gas/read.c
gas/testsuite/gas/elf/common5a.d [new file with mode: 0644]
gas/testsuite/gas/elf/common5a.l [new file with mode: 0644]
gas/testsuite/gas/elf/common5a.s [new file with mode: 0644]
gas/testsuite/gas/elf/common5b.d [new file with mode: 0644]
gas/testsuite/gas/elf/common5b.l [new file with mode: 0644]
gas/testsuite/gas/elf/common5b.s [new file with mode: 0644]
gas/testsuite/gas/elf/common5c.d [new file with mode: 0644]
gas/testsuite/gas/elf/common5c.s [new file with mode: 0644]
gas/testsuite/gas/elf/common5d.d [new file with mode: 0644]
gas/testsuite/gas/elf/common5d.s [new file with mode: 0644]
gas/testsuite/gas/elf/elf.exp
gas/write.c

index adeb38bb27abd06cd1301354daf42216ba080a92..dd611422313f6dd541cc785a3ed4015ae7b77d6d 100644 (file)
@@ -1,3 +1,23 @@
+2017-08-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gas/21667
+       * read.c (pseudo_set): Update error message for alias of common
+       symbol.
+       * write.c (write_object_file): Disallow both local and global
+       aliases of common symbol.
+       * testsuite/gas/elf/common5a.d: New file.
+       * testsuite/gas/elf/common5a.l: Likewise.
+       * testsuite/gas/elf/common5a.s: Likewise.
+       * testsuite/gas/elf/common5b.d: Likewise.
+       * testsuite/gas/elf/common5b.l: Likewise.
+       * testsuite/gas/elf/common5b.s: Likewise.
+       * testsuite/gas/elf/common5c.d: Likewise.
+       * testsuite/gas/elf/common5c.s: Likewise.
+       * testsuite/gas/elf/common5d.d: Likewise.
+       * testsuite/gas/elf/common5d.s: Likewise.
+       * testsuite/gas/elf/elf.exp: Run common5a, common5b, common5c
+       and common5d.
+
 2017-08-10  Nick Clifton  <nickc@redhat.com>
 
        PR gas/21939
index 9627ef513bf37b6ee20b98a7e3ac61b2f2991245..0b0b05803c07f516ac986f97d83cc871c0fc4676 100644 (file)
@@ -3870,7 +3870,7 @@ 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'"),
+           as_bad (_("`%s' can't be equated to common symbol `%s'"),
                    S_GET_NAME (symbolP), S_GET_NAME (s));
 
          S_SET_SEGMENT (symbolP, seg);
diff --git a/gas/testsuite/gas/elf/common5a.d b/gas/testsuite/gas/elf/common5a.d
new file mode 100644 (file)
index 0000000..9c790e6
--- /dev/null
@@ -0,0 +1,5 @@
+#source: common5a.s
+#as: 
+#error-output: common5a.l
+#not-target: alpha-*-*
+# The Alpha target uses its own .set pseudo-insn.
diff --git a/gas/testsuite/gas/elf/common5a.l b/gas/testsuite/gas/elf/common5a.l
new file mode 100644 (file)
index 0000000..7574dc6
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*: Error: `foo1' can't be equated to common symbol `foo'
diff --git a/gas/testsuite/gas/elf/common5a.s b/gas/testsuite/gas/elf/common5a.s
new file mode 100644 (file)
index 0000000..d4b0acf
--- /dev/null
@@ -0,0 +1,3 @@
+       .set    foo1,foo
+       .globl  foo1
+       .comm   foo,8,8
diff --git a/gas/testsuite/gas/elf/common5b.d b/gas/testsuite/gas/elf/common5b.d
new file mode 100644 (file)
index 0000000..b1dabdc
--- /dev/null
@@ -0,0 +1,5 @@
+#source: common5b.s
+#as: 
+#error-output: common5b.l
+#not-target: alpha-*-*
+# The Alpha target uses its own .set pseudo-insn.
diff --git a/gas/testsuite/gas/elf/common5b.l b/gas/testsuite/gas/elf/common5b.l
new file mode 100644 (file)
index 0000000..171bed0
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*:2: Error: `foo1' can't be equated to common symbol `foo'
diff --git a/gas/testsuite/gas/elf/common5b.s b/gas/testsuite/gas/elf/common5b.s
new file mode 100644 (file)
index 0000000..df79fcb
--- /dev/null
@@ -0,0 +1,3 @@
+       .comm   foo,8,8
+       .set    foo1,foo
+       .globl  foo1
diff --git a/gas/testsuite/gas/elf/common5c.d b/gas/testsuite/gas/elf/common5c.d
new file mode 100644 (file)
index 0000000..1e106ad
--- /dev/null
@@ -0,0 +1,5 @@
+#source: common5c.s
+#as: 
+#error-output: common5a.l
+#not-target: alpha-*-*
+# The Alpha target uses its own .set pseudo-insn.
diff --git a/gas/testsuite/gas/elf/common5c.s b/gas/testsuite/gas/elf/common5c.s
new file mode 100644 (file)
index 0000000..fa9db8d
--- /dev/null
@@ -0,0 +1,2 @@
+       .set    foo1,foo
+       .comm   foo,8,8
diff --git a/gas/testsuite/gas/elf/common5d.d b/gas/testsuite/gas/elf/common5d.d
new file mode 100644 (file)
index 0000000..9f51636
--- /dev/null
@@ -0,0 +1,5 @@
+#source: common5d.s
+#as: 
+#error-output: common5b.l
+#not-target: alpha-*-*
+# The Alpha target uses its own .set pseudo-insn.
diff --git a/gas/testsuite/gas/elf/common5d.s b/gas/testsuite/gas/elf/common5d.s
new file mode 100644 (file)
index 0000000..6da5cb3
--- /dev/null
@@ -0,0 +1,2 @@
+       .comm   foo,8,8
+       .set    foo1,foo
index 1284619dc2ed591a9e8b5e83f5f6d04dabbf8532..67374862965ccafd5706b6b82f6f03d1698fe7d8 100644 (file)
@@ -252,6 +252,10 @@ if { [is_elf_format] } then {
        run_dump_test "common3b"
        run_dump_test "common4a"
        run_dump_test "common4b"
+       run_dump_test "common5a"
+       run_dump_test "common5b"
+       run_dump_test "common5c"
+       run_dump_test "common5d"
     }
 
     run_dump_test "strtab"
index 8efdbc506f411d9fb3b5278cf2ef894ec0f965ba..4f6547dfb85bb0a15d63c58c5372453cdb960cc3 100644 (file)
@@ -2107,12 +2107,11 @@ write_object_file (void)
 
              if (S_IS_COMMON (symp)
                  && !TC_FAKE_LABEL (sname)
-                 && !S_IS_WEAKREFR (symp)
-                 && (!S_IS_EXTERNAL (symp) || S_IS_LOCAL (symp)))
+                 && !S_IS_WEAKREFR (symp))
                {
                  expressionS *e = symbol_get_value_expression (symp);
 
-                 as_bad (_("Local symbol `%s' can't be equated to common symbol `%s'"),
+                 as_bad (_("`%s' can't be equated to common symbol `%s'"),
                          sname, S_GET_NAME (e->X_add_symbol));
                }
              if (S_GET_SEGMENT (symp) == reg_section)