代码之家  ›  专栏  ›  技术社区  ›  lz96

如何列出Linux上静态库的所有外部未定义符号?

  •  3
  • lz96  · 技术社区  · 8 年前

    我有一个静态库 libfoo.a ,这只是倍数的压缩 .o 文件夹。我正在寻找一种方法列出所有符号

    • 在静态库中显示为und
    • 此静态库中没有定义

    这样我就可以找出这个库的所有外部符号依赖项。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Mike Kinghan Luchian Grigore    8 年前

    您可以使用此方法:

    ld -r -o deleteme.o --whole-archive libfoo.a
    nm -C --undefined-only deleteme.o       # `-C` if you might have C++ archive members
    rm deleteme.o
    

    演示 :

    一个C

    extern void two(void);
    
    void one()
    {
        two();
    }
    

    两个C

    extern void three(void);
    
    void two()
    {
        three();
    }
    

    创建静态库 libonetwo.a :

    $ gcc -Wall -c one.c two.c
    $ ar rcs libonetwo.a one.o two.o
    

    nm 分析静态库,就好像它只是其成员的命令行列表:

    $ nm --undefined-only libonetwo.a 
    
    one.o:
                     U _GLOBAL_OFFSET_TABLE_
                     U two
    
    two.o:
                     U _GLOBAL_OFFSET_TABLE_
                     U three
    

    因此,逐步将它们链接到一个临时对象文件中:

    $ ld -r -o deleteme.o --whole-archive libonetwo.a
    

    然后查看该对象文件的剩余未定义符号并将其删除:

    $ nm --undefined-only deleteme.o && rm deleteme.o 
                     U _GLOBAL_OFFSET_TABLE_
                     U three
    
        2
  •  2
  •   Employed Russian    8 年前

    没有一个命令(我知道)能做到这一点。

    但构造两个命令,一个用于所有未定义的符号,一个用于所有已定义的符号,然后只显示它们之间的区别,这是很简单的。

    comm -13 \
     <(nm libfoobar.a | egrep ' [BDTW] ' | sed -e 's/.* [BDTW] //' | sort -u) \
     <(nm libfoobar.a | grep ' U ' | sed -e 's/.* U //' | sort -u)
    

    弗斯特 nm 仅打印定义的符号。第二 纳米级 只打印未定义的符号(可以在同一库中的其他文件中定义)。

    这个 comm -13 只打印第二行 纳米级 不会出现在第一个 纳米级 .

    推荐文章