用于快速确定哪些源代码导致不必要的 .so 链接的脚本
Script to Quickly Determine What Source Code Causes Unnecessary .so's to link
上下文:我有一个通过网络传输可执行文件的程序。这个可执行文件太大了,所以我在其关联的共享对象上运行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
相关文章:
- 用callgrind追踪不必要的副本
- 不必要的C++代码最终会出现在我完成的程序中吗?
- 总和的不必要行为C++?
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- Google Colab 看不到 .so 文件
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 如何在插入排序中使用 replace() 使语句变得不必要
- C 包装器C++库周围没有不必要的头文件
- 编译器是否消除了不必要的原子?
- Redhat Linux - 找不到 SO 文件
- 在 c++ 中不必要的包含
- GCC为AVR上的简单ISR产生不必要的寄存器推送
- 在序列化过程中删除不必要的内存分配
- QTREEWIDGET子分类,停止下降指示器显示给定有不必要的DropIndicatorPosition
- 为什么某些共享库以D.So而不是.so结束
- 如何在不指定不必要的模板参数的情况下使用模板类的成员类型
- Android Gradle避免了CMake项目不必要的重建
- 避免使用std::unordered_map(和其他)进行重复搜索或不必要的构造
- 用于快速确定哪些源代码导致不必要的 .so 链接的脚本