This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Check unsupported .symver with common symbol


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a3aea05a66ec325ddd19b0c8dbe504958a295cd3

commit a3aea05a66ec325ddd19b0c8dbe504958a295cd3
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Mon Jun 26 05:11:07 2017 -0700

    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.

Diff:
---
 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(+)

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  <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.
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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]