Check unsupported .symver with common symbol

The .symver directive on common symbol creates a new common symbol,
which shouldn't be allowed, similar to alias on common symbol:

$ cat y.S
	.comm	bar,8,8
	 .set bar1,bar
$ as -o y.o y.S
y.S: Assembler messages:
y.S:2: Error: `bar1' can't be equated to common symbol 'bar'
$

	PR gas/21661
	* config/obj-elf.c (obj_elf_symver): Don't allow .symver with
	common symbol.
	(elf_frob_symbol): Likewise.
	* testsuite/gas/elf/elf.exp: Run pr21661.
	* testsuite/gas/elf/pr21661.d: New file.
	* testsuite/gas/elf/pr21661.s: Likewise.
This commit is contained in:
H.J. Lu 2017-06-26 05:11:07 -07:00
parent fd52715cfa
commit a3aea05a66
6 changed files with 35 additions and 0 deletions

View File

@ -1,3 +1,13 @@
2017-06-26 H.J. Lu <hongjiu.lu@intel.com>
PR gas/21661
* config/obj-elf.c (obj_elf_symver): Don't allow .symver with
common symbol.
(elf_frob_symbol): Likewise.
* testsuite/gas/elf/elf.exp: Run pr21661.
* testsuite/gas/elf/pr21661.d: New file.
* testsuite/gas/elf/pr21661.s: Likewise.
2017-06-26 Nick Clifton <nickc@redhat.com>
* config/tc-arm.c (fpu_any): Only define for ELF based targets.

View File

@ -1414,6 +1414,14 @@ obj_elf_symver (int ignore ATTRIBUTE_UNUSED)
c = get_symbol_name (& name);
lex_type[(unsigned char) '@'] = old_lexat;
if (S_IS_COMMON (sym))
{
as_bad (_("`%s' can't be versioned to common symbol '%s'"),
name, S_GET_NAME (sym));
ignore_rest_of_line ();
return;
}
if (symbol_get_obj (sym)->versioned_name == NULL)
{
symbol_get_obj (sym)->versioned_name = xstrdup (name);
@ -2277,6 +2285,13 @@ elf_frob_symbol (symbolS *symp, int *puntp)
symp2 = symbol_find_or_make (sy_obj->versioned_name);
/* Now we act as though we saw symp2 = sym. */
if (S_IS_COMMON (symp))
{
as_bad (_("`%s' can't be versioned to common symbol '%s'"),
sy_obj->versioned_name, S_GET_NAME (symp));
*puntp = TRUE;
return;
}
S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp));

View File

@ -184,6 +184,7 @@ if { [is_elf_format] } then {
run_dump_test "symtab"
}
run_dump_test "symver"
run_dump_test "pr21661"
# No indirect functions on non-GNU targets.
# The Visium and MSP set the ELF header's OSABI field to ELFOSABI_STANDALONE.

View File

@ -0,0 +1,2 @@
#name: unsupported .symver with common symbol
#error-output: pr21661.l

View File

@ -0,0 +1,3 @@
[^:]*: Assembler messages:
[^:]*:2: Error: `foo@VERS.1' can't be versioned to common symbol 'foo'
[^:]*: Error: `bar@VERS.1' can't be versioned to common symbol 'bar'

View File

@ -0,0 +1,4 @@
.comm foo,8,8
.symver foo,foo@VERS.1
.symver bar,bar@VERS.1
.comm bar,8,8