用于快速确定哪些源代码导致不必要的 .so 链接的脚本

Script to Quickly Determine What Source Code Causes Unnecessary .so's to link

本文关键字:不必要 so 脚本 链接 源代码 用于      更新时间:2023-10-16

上下文:我有一个通过网络传输可执行文件的程序。这个可执行文件太大了,所以我在其关联的共享对象上运行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_initfstat是请求包含其他存档成员的函数。

-Wl,-M选项的输出是相当…容量很大,请确保将输出管道传输到文件或通过less

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