Bug 25227 - "eu-nm --extern" skips first symbol
Summary: "eu-nm --extern" skips first symbol
Status: RESOLVED FIXED
Alias: None
Product: elfutils
Classification: Unclassified
Component: general (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-11-27 15:01 UTC by Enzo Matsumiya
Modified: 2020-06-10 10:17 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed: 2019-11-27 00:00:00


Attachments
test file with symbols for objects/functions global/local TLS/UNIQUE debug, weak, etc. (193 bytes, text/plain)
2019-12-09 16:48 UTC, Mark Wielaard
Details
C source code file defining various different symbol types (193 bytes, text/plain)
2020-01-16 22:52 UTC, Mark Wielaard
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Enzo Matsumiya 2019-11-27 15:01:10 UTC
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)
Comment 1 Mark Wielaard 2019-11-27 21:25:54 UTC
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.
Comment 2 Enzo Matsumiya 2019-12-09 16:01:10 UTC
Hi Mark, do you have any updates here? Will you revert that specific part in commit 66f4c37d497b? Thanks.
Comment 3 Mark Wielaard 2019-12-09 16:48:24 UTC
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.
Comment 4 Enzo Matsumiya 2020-01-16 18:21:57 UTC
Ping?

We're looking to roll out this fix internally, but we need upstream to acknowledge/release it first.
Comment 5 Mark Wielaard 2020-01-16 22:47:31 UTC
(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.
Comment 6 Mark Wielaard 2020-01-16 22:52:02 UTC
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
Comment 7 Enzo Matsumiya 2020-01-17 03:12:57 UTC
(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.
Comment 8 Martin Liška 2020-03-02 13:57:23 UTC
Can the bug be closed?
Comment 9 Mark Wielaard 2020-03-02 14:03:00 UTC
(In reply to Martin Liška from comment #8)
> Can the bug be closed?

No sorry, see comment #3 and comment #5
Comment 10 Mark Wielaard 2020-06-06 23:17:27 UTC
Proposed patch: https://sourceware.org/pipermail/elfutils-devel/2020q2/002713.html
Comment 11 Mark Wielaard 2020-06-10 10:17:46 UTC
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>