上下文:我有一个通过网络传输可执行文件的程序。这个可执行文件太大了,所以我在其关联的共享对象上运行ldd -u bigFoo.so
。这表明我有大量未使用的共享目标文件,它们占用了一个gig以上的空间。
问题:给定一段c++源代码foo.cc
被编译并链接到bigFoo.so
, unused.so
(由ldd -u
透露)被链接到bigFoo.so
,是否有一个脚本或shell命令序列可以快速确定foo.cc
中的哪些调用导致unused.so
的链接?
将选项-Wl,-M
添加到CXXFLAGS
后重新编译。搜索"存档成员包含…"',下面的行将显示文件中包含了哪些库,以及哪些函数请求了它们。
一个例子:
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