How to list all externally-undefined symbols of a static library on Linux?

試著忘記壹切 提交于 2019-12-23 15:11:57

问题


I have a static library libfoo.a, which is just a compression of multiple .o files. I am looking for a way to list all symbols that

  • appear in the static library as UND
  • have no definition in this static library

So that I can find out all external symbol dependencies of this library.


回答1:


You can use this method:

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

Demo:

one.c

extern void two(void);

void one()
{
    two();
}

two.c

extern void three(void);

void two()
{
    three();
}

Make a static library libonetwo.a:

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

nm parses the static library as if it were just a commandline list of its members:

$ nm --undefined-only libonetwo.a 

one.o:
                 U _GLOBAL_OFFSET_TABLE_
                 U two

two.o:
                 U _GLOBAL_OFFSET_TABLE_
                 U three

So incrementally link them all into a temporary object file:

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

Then see the residual undefined symbols of that object file and delete it:

$ nm --undefined-only deleteme.o && rm deleteme.o 
                 U _GLOBAL_OFFSET_TABLE_
                 U three



回答2:


There is no single command (that I know of) that will do that.

But it's trivial to construct two commands, one for all undefined, and one for all defined symbols, and then show only the difference between them.

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

First nm prints only defined symbols. Second nm prints only undefined symbols (which may be defined in another file in the same library).

The comm -13 prints only lines from second nm which do not occur in the output from the first nm.



来源:https://stackoverflow.com/questions/51427755/how-to-list-all-externally-undefined-symbols-of-a-static-library-on-linux

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!