上下文:我有一个通过网络传输可执行文件的程序。这个可执行文件太大了,所以我ldd -u bigFoo.so
在其关联的共享对象上运行。这表明我有大量未使用的共享对象文件占用了一个演出。
问题:给定一段 C++ 源代码foo.cc
,它被编译并链接到bigFoo.so
中,并且unused.so
(由 显示ldd -u
)链接到bigFoo.so
中,是否有脚本或 shell 命令序列可以快速确定foo.cc
导致链接中的调用unused.so
?
上下文:我有一个通过网络传输可执行文件的程序。这个可执行文件太大了,所以我ldd -u bigFoo.so
在其关联的共享对象上运行。这表明我有大量未使用的共享对象文件占用了一个演出。
问题:给定一段 C++ 源代码foo.cc
,它被编译并链接到bigFoo.so
中,并且unused.so
(由 显示ldd -u
)链接到bigFoo.so
中,是否有脚本或 shell 命令序列可以快速确定foo.cc
导致链接中的调用unused.so
?
将选项添加-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_init和fstat是请求包含其他存档成员的函数。
该-Wl,-M
选项的输出相当...大量,请务必将输出通过管道传输到文件或通过less
我在这里展示的只是输出开头的一小段。考虑到您可能包含许多库例程,您的输出应该更长。