diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-06-26 05:11:07 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-06-26 05:11:29 -0700 |
commit | a3aea05a66ec325ddd19b0c8dbe504958a295cd3 (patch) | |
tree | 48a9ccef7ac053c755efcce87e653942fa7a2525 /gas/config/obj-elf.c | |
parent | fd52715cfa77b7e06f4ab5eadfe7946d22180adc (diff) | |
download | gdb-a3aea05a66ec325ddd19b0c8dbe504958a295cd3.zip gdb-a3aea05a66ec325ddd19b0c8dbe504958a295cd3.tar.gz gdb-a3aea05a66ec325ddd19b0c8dbe504958a295cd3.tar.bz2 |
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.
Diffstat (limited to 'gas/config/obj-elf.c')
-rw-r--r-- | gas/config/obj-elf.c | 15 |
1 files changed, 15 insertions, 0 deletions
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)); |