From a3aea05a66ec325ddd19b0c8dbe504958a295cd3 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 26 Jun 2017 05:11:07 -0700 Subject: [PATCH] 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. --- gas/ChangeLog | 10 ++++++++++ gas/config/obj-elf.c | 15 +++++++++++++++ gas/testsuite/gas/elf/elf.exp | 1 + gas/testsuite/gas/elf/pr21661.d | 2 ++ gas/testsuite/gas/elf/pr21661.l | 3 +++ gas/testsuite/gas/elf/pr21661.s | 4 ++++ 6 files changed, 35 insertions(+) create mode 100644 gas/testsuite/gas/elf/pr21661.d create mode 100644 gas/testsuite/gas/elf/pr21661.l create mode 100644 gas/testsuite/gas/elf/pr21661.s diff --git a/gas/ChangeLog b/gas/ChangeLog index f48280d..6d3281d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2017-06-26 H.J. Lu + + 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 * config/tc-arm.c (fpu_any): Only define for ELF based targets. diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 3696d5e..49d99a4 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); @@ -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)); diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index ad38d66..6b2b31a 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 0000000..a16e410 --- /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 0000000..0565faa --- /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: `bar@VERS.1' can't be versioned to common symbol 'bar' diff --git a/gas/testsuite/gas/elf/pr21661.s b/gas/testsuite/gas/elf/pr21661.s new file mode 100644 index 0000000..5586bfd --- /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 -- 2.7.4