[hjl@gnu-cfl-2 pr13195]$ cat x.s .section .text.new_foo,"ax",%progbits .globl new_foo .type new_foo, %function new_foo: call foo call bar .symver new_foo,foo@@VERS_2.0 [hjl@gnu-cfl-2 pr13195]$ cat x.t VERS_2.0 { global: foo; local: *; }; [hjl@gnu-cfl-2 pr13195]$ make x.so ld -shared --gc-sections -shared -version-script x.t --hash-style=gnu -o x.so x.o [hjl@gnu-cfl-2 pr13195]$ /export/build/gnu/tools-build/binutils/build-x86_64-linux/binutils/nm-new -D x.so U bar 0000000000001030 T foo 0000000000000000 A VERS_2.0 [hjl@gnu-cfl-2 pr13195]$ /export/build/gnu/tools-build/binutils/build-x86_64-linux/binutils/objdump --dynamic-syms x.so x.so: file format elf64-x86-64 DYNAMIC SYMBOL TABLE: 0000000000000000 D *UND* 0000000000000000 bar 0000000000000000 g DO *ABS* 0000000000000000 VERS_2.0 VERS_2.0 0000000000001030 g DF .text 0000000000000000 VERS_2.0 foo [hjl@gnu-cfl-2 pr13195]$
A patch is posted at https://sourceware.org/pipermail/binutils/2020-March/110333.html
The master branch has been updated by H.J. Lu <hjl@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7e6e972f74aeac0ebdbd95a7f905d871cd2581de commit 7e6e972f74aeac0ebdbd95a7f905d871cd2581de Author: H.J. Lu <hjl.tools@gmail.com> Date: Tue Mar 24 04:23:11 2020 -0700 bfd: Display symbol version for nm -D Extend _bfd_elf_get_symbol_version_string for nm -D to display symbol version. _bfd_elf_get_symbol_version_name is added to avoid updating all XXX_get_symbol_version_string functions. bfd/ PR binutils/25708 * elf-bfd.h (_bfd_elf_get_symbol_version_name): New. * elf.c (_bfd_elf_get_symbol_version_name): New function. Based on the previous _bfd_elf_get_symbol_version_string. (_bfd_elf_get_symbol_version_string): Use it. binutils/ PR binutils/25708 * nm.c (SYM_NAME): Removed. (print_symname): Add a pointer to struct extended_symbol_info argument. Call _bfd_elf_get_symbol_version_name to get symbol version. (print_symdef_entry): Pass NULL to print_symname. (print_symbol_info_bsd): Update call to print_symname. (print_symbol_info_sysv): Likewise. (print_symbol_info_posix): Likewise. ld/ PR binutils/25708 * testsuite/ld-elf/pr25708.d: New file.
Fixed for 2.35.
Hi H.J. Oops - I have just noticed some build failures from non-ELF based targets, eg alpha-dec-vms and i386=pc-go32: /bin/ld: nm.o: in function `print_symname': binutils/nm.c:420: undefined reference to `_bfd_elf_get_symbol_version_name' Please could you have a look into this. Cheers Nick
(In reply to Nick Clifton from comment #4) > Hi H.J. > > Oops - I have just noticed some build failures from non-ELF based > targets, eg alpha-dec-vms and i386=pc-go32: > > /bin/ld: nm.o: in function `print_symname': > binutils/nm.c:420: undefined reference to > `_bfd_elf_get_symbol_version_name' > > Please could you have a look into this. Here is the patch: https://sourceware.org/pipermail/binutils/2020-March/110366.html
The master branch has been updated by H.J. Lu <hjl@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1081065c519d1bfc3847bf4b0a0ce4bc3224bcd3 commit 1081065c519d1bfc3847bf4b0a0ce4bc3224bcd3 Author: H.J. Lu <hjl.tools@gmail.com> Date: Tue Mar 24 15:37:14 2020 -0700 bfd: Add a bfd_boolean argument to bfd_get_symbol_version_string We can't call _bfd_elf_get_symbol_version_name from nm.c since it isn't available for all target configurations. This patch add a bfd_boolean argument to bfd_get_symbol_version_string instead. bfd/ PR binutils/25708 * elf-bfd.h (_bfd_elf_get_symbol_version_name): Renamed to ... (_bfd_elf_get_symbol_version_string): This. * elf.c (_bfd_elf_get_symbol_version_name): Renamed to ... (_bfd_elf_get_symbol_version_string): This. (bfd_elf_print_symbol): Pass TRUE to _bfd_elf_get_symbol_version_string. * libbfd-in.h (_bfd_nosymbols_get_symbol_version_string): Add a bfd_boolean argument. * syms.c (_bfd_nosymbols_get_symbol_version_string): Likewise. * targets.c (_bfd_get_symbol_version_string): Likewise. (bfd_get_symbol_version_string): Likewise. * bfd-in2.h: Regenerated. binutils/ PR binutils/25708 * nm.c (print_symname): Replace _bfd_elf_get_symbol_version_name with bfd_get_symbol_version_string. (print_symbo): Pass TRUE to bfd_get_symbol_version_string. * objdump.c (objdump_print_symname): Likewise.
Fixed
This breaks at least the perf build from linux kernel 5.7 as nm is used to construct a symbol list for feeding into ld, which now contains '@' characters which aren't liked by ld (of course). See e.g. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1887397 Is it really a good idea to change the output format of basic tools that might be used in machine processing context? (And I note there doesn't seem to be an cmdline option to get the old behaviour back, so fixing the problem now entails further massaging of nm output to cut off /@.*/ )
(In reply to Michael Matz from comment #8) > This breaks at least the perf build from linux kernel 5.7 as nm is used to > construct a symbol list for feeding into ld, which now contains '@' > characters > which aren't liked by ld (of course). See e.g. > > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1887397 > > Is it really a good idea to change the output format of basic tools that > might be > used in machine processing context? (And I note there doesn't seem to be an > cmdline option to get the old behaviour back, so fixing the problem now > entails > further massaging of nm output to cut off /@.*/ ) Is this PR 26302? A patch is at https://sourceware.org/pipermail/binutils/2020-July/112556.html
(In reply to H.J. Lu from comment #9) > > > > Is it really a good idea to change the output format of basic tools that > > might be > > used in machine processing context? (And I note there doesn't seem to be an > > cmdline option to get the old behaviour back, so fixing the problem now > > entails > > further massaging of nm output to cut off /@.*/ ) > > Is this PR 26302? A patch is at No. perf does the moral equivalent of: % ( echo "{"; nm -D input.so | awk '{print $1";"}'; echo "}" ) > thelist % ld ... --dynamic-list=thelist Of course 'thelist' now contains @ characters, because nm -D shows symversions, and that's what ld is complaining about: thelist:2: ignoring invalid character `@' in script thelist:2: syntax error in dynamic list collect2: error: ld returned 1 exit status The build system of simply isn't prepared to deal with these symversions. So one of several things need to happen: a) nm -D doesn't print symversions, unless explicitely requested b) nm -D continues to print them, but with an option to disable them c) perf Makefile is changed to filter out any /@.*/ in the nm output I'm not sure how widespread such usage of nm is, and hence how often fix (c) would have to be applied in the wild. Fixing such packages would at least be easier if nm had an option to disable printing them (i.e. (b)). But maybe it's best to not change traditional behaviour of nm at all, i.e. change (a), and revert to not printing symversions by default. I don't know what's best.
(In reply to Michael Matz from comment #10) > (In reply to H.J. Lu from comment #9) > > > > > > Is it really a good idea to change the output format of basic tools that > > > might be > > > used in machine processing context? (And I note there doesn't seem to be an > > > cmdline option to get the old behaviour back, so fixing the problem now > > > entails > > > further massaging of nm output to cut off /@.*/ ) > > > > Is this PR 26302? A patch is at > > No. perf does the moral equivalent of: > > % ( echo "{"; nm -D input.so | awk '{print $1";"}'; echo "}" ) > thelist > % ld ... --dynamic-list=thelist > Please a new bug report with a small testcase.