Also disallow global alias of common symbol

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.
This commit is contained in:
H.J. Lu 2017-08-11 07:41:51 -07:00
parent de7985c3cc
commit 76db0a2e17
14 changed files with 61 additions and 4 deletions

View 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

View 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);

View File

@ -0,0 +1,5 @@
#source: common5a.s
#as:
#error-output: common5a.l
#not-target: alpha-*-*
# The Alpha target uses its own .set pseudo-insn.

View File

@ -0,0 +1,2 @@
[^:]*: Assembler messages:
[^:]*: Error: `foo1' can't be equated to common symbol `foo'

View File

@ -0,0 +1,3 @@
.set foo1,foo
.globl foo1
.comm foo,8,8

View File

@ -0,0 +1,5 @@
#source: common5b.s
#as:
#error-output: common5b.l
#not-target: alpha-*-*
# The Alpha target uses its own .set pseudo-insn.

View File

@ -0,0 +1,2 @@
[^:]*: Assembler messages:
[^:]*:2: Error: `foo1' can't be equated to common symbol `foo'

View File

@ -0,0 +1,3 @@
.comm foo,8,8
.set foo1,foo
.globl foo1

View File

@ -0,0 +1,5 @@
#source: common5c.s
#as:
#error-output: common5a.l
#not-target: alpha-*-*
# The Alpha target uses its own .set pseudo-insn.

View File

@ -0,0 +1,2 @@
.set foo1,foo
.comm foo,8,8

View File

@ -0,0 +1,5 @@
#source: common5d.s
#as:
#error-output: common5b.l
#not-target: alpha-*-*
# The Alpha target uses its own .set pseudo-insn.

View File

@ -0,0 +1,2 @@
.comm foo,8,8
.set foo1,foo

View 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"

View 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)