1

上下文:我有一个通过网络传输可执行文件的程序。这个可执行文件太大了,所以我ldd -u bigFoo.so在其关联的共享对象上运行。这表明我有大量未使用的共享对象文件占用了一个演出。

问题:给定一段 C++ 源代码foo.cc,它被编译并链接到bigFoo.so中,并且unused.so(由 显示ldd -u)链接到bigFoo.so中,是否有脚本或 shell 命令序列可以快速确定foo.cc导致链接中的调用unused.so

4

1 回答 1

1

将选项添加-Wl,-M到您的CXXFLAGS. 搜索“ Archive member included... ”,以下几行将显示文件中包含哪些库,以及哪些函数请求它们。

一个例子:

gcc -std=gnu99  -O0 -Wall -Wextra -Wunused -Wl,-M -c showmmap.c -o showmmap.o
gcc -std=gnu99  -O0 -Wall -Wextra -Wunused -Wl,-M    showmmap.o -o showmmap
Archive member included to satisfy reference by file (symbol)

/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
                              /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o (__libc_csu_init)
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(fstat.oS)
                              showmmap.o (fstat)

Discarded input sections
--------8<--snip--->8-----

我不得不在我的档案中四处挖掘,才能找到可以在其他图书馆中找到的东西。在此示例中,您可以看到__libc_csu_initfstat是请求包含其他存档成员的函数。

-Wl,-M选项的输出相当...大量,请务必将输出通过管道传输到文件或通过less

我在这里展示的只是输出开头的一小段。考虑到您可能包含许多库例程,您的输出应该更长。

于 2014-07-16T07:55:38.207 回答