[PATCH] PR gas/21661: Check unsupported .symver with common symbol
Renlin Li
renlin.li@foss.arm.com
Tue Jun 27 16:03:00 GMT 2017
Hi H.J.,
This patch breaks aarch64/arm linux toolchain in cross build environment.
I have got the following error message:
/tmpdir/ccQfHyoF.s: Assembler messages:
/tmpdir/ccQfHyoF.s: Error: `loc1@GLIBC_2.4' can't be versioned to common symbol 'loc1'
/tmpdir/ccQfHyoF.s: Error: `loc2@GLIBC_2.4' can't be versioned to common symbol 'loc2'
/tmpdir/ccQfHyoF.s: Error: `locs@GLIBC_2.4' can't be versioned to common symbol 'locs'
make[2]: *** [/tmpdir/build-arm-none-linux-gnueabi/obj/glibc/misc/regexp.os] Error 1
in glibc, I saw the following code in glibc/misc/regexp.c which generate .symver directive
for each variable.
compat_symbol (libc, loc1, loc1, GLIBC_2_0);
compat_symbol (libc, loc2, loc2, GLIBC_2_0);
compat_symbol (libc, locs, locs, GLIBC_2_0);
Regards,
Renlin
On 26/06/17 13:09, H.J. Lu wrote:
> On Fri, Jun 23, 2017 at 06:52:01AM -0700, H.J. Lu wrote:
>> 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'
>> $
>>
>> OK for master?
>>
>> H.J.
>> ---
>> 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 is what I checked in.
>
>
> H.J.
> ---
> 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/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 ++++
> 5 files changed, 25 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/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
>
More information about the Binutils
mailing list