diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-06-23 06:26:19 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-06-23 06:46:32 -0700 |
commit | bf2cd8bd1bf0ce196a2e22bafa83eb5a2e918e68 (patch) | |
tree | 196170ee4370517398c1d201777b26c969beeb39 | |
parent | 7ee7ff7015840f2d0156bf386a050bd728d22fc4 (diff) | |
download | binutils-gdb-users/hjl/pr21661.tar.gz |
Check unsupported .symver with common symbolusers/hjl/pr21661
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.
-rw-r--r-- | gas/config/obj-elf.c | 18 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/elf.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/pr21661.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/pr21661.l | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/pr21661.s | 4 |
5 files changed, 28 insertions, 0 deletions
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 3696d5ea5e2..94ffb31d1bf 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -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); @@ -2301,6 +2309,16 @@ elf_frob_symbol (symbolS *symp, int *puntp) } } } + else if (S_IS_COMMON (symp)) + { + const char *sname = S_GET_NAME (symp); + if (strchr (sname, ELF_VER_CHR)) + { + as_bad (_("symbol `%s' can't be versioned to common symbol"), + sname); + return; + } + } /* Double check weak symbols. */ if (S_IS_WEAK (symp)) diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index ad38d6655e7..6b2b31a04ef 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -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. diff --git a/gas/testsuite/gas/elf/pr21661.d b/gas/testsuite/gas/elf/pr21661.d new file mode 100644 index 00000000000..a16e4108104 --- /dev/null +++ b/gas/testsuite/gas/elf/pr21661.d @@ -0,0 +1,2 @@ +#name: unsupported .symver with common symbol +#error-output: pr21661.l diff --git a/gas/testsuite/gas/elf/pr21661.l b/gas/testsuite/gas/elf/pr21661.l new file mode 100644 index 00000000000..daf0d36552c --- /dev/null +++ b/gas/testsuite/gas/elf/pr21661.l @@ -0,0 +1,3 @@ +[^:]*: Assembler messages: +[^:]*:2: Error: `foo@VERS.1' can't be versioned to common symbol 'foo' +[^:]*: Error: symbol `bar@VERS.1' can't be versioned to common symbol diff --git a/gas/testsuite/gas/elf/pr21661.s b/gas/testsuite/gas/elf/pr21661.s new file mode 100644 index 00000000000..5586bfd93c3 --- /dev/null +++ b/gas/testsuite/gas/elf/pr21661.s @@ -0,0 +1,4 @@ + .comm foo,8,8 + .symver foo,foo@VERS.1 + .symver bar,bar@VERS.1 + .comm bar,8,8 |