Reproduction steps: > # cat example.c > void *SYM1; > void *SYM2; > void *SYM3; > # gcc -c -std=gnu89 -fstack-protector-all -funsigned-char -fPIC -Wall -Wconversion -Wextra -g -O0 example.c > # eu-nm --extern example.o > > > Symbols from /home/enzo/tmp/eu-nm-bug/example.o: > > Name Value Class Type Size Line Section > > SYM2|0000000000000008|GLOBAL|OBJECT |0000000000000008| |COMMON > SYM3|0000000000000008|GLOBAL|OBJECT |0000000000000008| |COMMON Expected result: > Name Value Class Type Size Line Section > > SYM1|0000000000000008|GLOBAL|OBJECT |0000000000000008| |COMMON > SYM2|0000000000000008|GLOBAL|OBJECT |0000000000000008| |COMMON > SYM3|0000000000000008|GLOBAL|OBJECT |0000000000000008| |COMMON i.e. "SYM1" line is not present. Reverting this change fixes the problem: commit 66f4c37d497bdde040a33f299b12163f044b1bf2 Author: Ulrich Drepper <drepper@gmail.com> Date: Mon Oct 3 15:53:12 2011 -0400 Fix nm output for sysv format Undefined symbols need no address and siz printed. Avoid the initial entry which is no real symbol. Avoid section symbols. @@ -808,8 +808,12 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx, const char *fullname, #endif /* Iterate over all symbols. */ - for (cnt = 0; cnt < nsyms; ++cnt) + for (cnt = 1; cnt < nsyms; ++cnt)
Yes, that is odd. Thank for the reproducer. I think that must be a typo in the patch. The other formats show_symbols_bsd and show_symbols_posix do start at zero. And they are all three called with the same nsyms and syms array.
Hi Mark, do you have any updates here? Will you revert that specific part in commit 66f4c37d497b? Thanks.
Created attachment 12113 [details] test file with symbols for objects/functions global/local TLS/UNIQUE debug, weak, etc. > Hi Mark, do you have any updates here? > Will you revert that specific part in commit 66f4c37d497b? Thanks. Sorry I got distracted by other things. Yes, I believe that line should indeed read cnt = 0. I was just extending your testcase as attached (gcc -g -m32 -c symbols.c) and noticed some other small issues compared to binutils nm that I wanted to look at.
Ping? We're looking to roll out this fix internally, but we need upstream to acknowledge/release it first.
(In reply to Enzo Matsumiya from comment #4) > Ping? > > We're looking to roll out this fix internally, but we need upstream to > acknowledge/release it first. Sorry, I forgot. Like I said in comment #3 I created some testcases and noticed the output of eu-nm didn't always match binutils nm. I wanted to look deeper into that but then other stuff came up. I have pushed the patch to simply fix this issue now: commit 62e3c37afd5828466f9192bd19217de835a3620f (HEAD -> master) Author: Mark Wielaard <mark@klomp.org> Date: Thu Jan 16 23:33:52 2020 +0100 nm: Fix nm --external sysv format output. Partial revert of commit 66f4c37d497bdde040a33f299b12163f044b1bf2. If index zero wasn't a real symbol it has already been filtered out in show_symbols so don't skip it in show_symbols_sysv. https://sourceware.org/bugzilla/show_bug.cgi?id=25227 Reported-by: Enzo Matsumiya <ematsumiya@suse.com> Signed-off-by: Mark Wielaard <mark@klomp.org> But if you don't mind I'll keep this bug open to remind myself I need to checkout the other discrepancies with binutils nm.
Created attachment 12215 [details] C source code file defining various different symbol types Test source file with more symbol types. Compile with gcc -g -c symbols.c
(In reply to Mark Wielaard from comment #5) > I have pushed the patch to simply fix this issue now: > > commit 62e3c37afd5828466f9192bd19217de835a3620f (HEAD -> master) Ok, great. Thanks a lot. > But if you don't mind I'll keep this bug open to remind myself I need to > checkout the other discrepancies with binutils nm. Sure, no problem at all.
Can the bug be closed?
(In reply to Martin Liška from comment #8) > Can the bug be closed? No sorry, see comment #3 and comment #5
Proposed patch: https://sourceware.org/pipermail/elfutils-devel/2020q2/002713.html
commit 76ff94dce7ee8dd88c502bc0bbfc8dea15efea5b Author: Mark Wielaard <mark@klomp.org> Date: Sun Jun 7 01:02:52 2020 +0200 nm: Explicitly print weak 'V' or 'T' and common 'C' symbols. Mimic binutils nm for bsd and posix formats which uses 'V' for weak symbols, 'C' for common symbols and 'T' for weak functions. Also fix some formatting issues. Don't print undefined addresses as zeros, but make sure there is enough padding instead. Just print UNIQUE for GNU_UNIQUE to make it fit 6 chars, like other binding names in sysv format. https://sourceware.org/bugzilla/show_bug.cgi?id=25227 Signed-off-by: Mark Wielaard <mark@klomp.org>