是否可以指示 GNU ld 打印链接期间需要哪些 .o 文件
Can GNU ld be instructed to print which .o files are needed during a link?
一点背景:我正在尝试为嵌入式传感器系统构建AVR二进制文件,并且我的运行接近我的大小限制。我使用了一些外部库来帮助我,但是当编译为每个库一个对象时,它们相当大。我想将它们拉到较小的对象中,以便只有我需要的功能链接到我的程序中。我已经设法通过拆分一个大型库将二进制大小降低了 2k。
了解在游戏的每个阶段使用了哪些对象会有很大帮助,这样我就可以更有效地拆分它们。有没有办法ld
打印它链接的对象?
我不确定对象级别,但我相信您可以使用 CFLAGS="-fdata-sections -ffunction-sections"
和 LDFLAGS="-Wl,--gc-sections -Wl,--print-gc-sections"
在符号级别解决这个问题。这应该删除所有未引用符号的代码,并向您显示已删除的符号,如果由于某种原因您决定返回到目标文件级别并希望仅识别包含已删除符号的对象文件,这可能会很有用。
更准确地说,我引用的编译器标志将要求编译器将每个函数或全局变量放在一个部分中,然后--gc-sections
链接器标志将删除所有尚未使用的部分。可能是每个对象文件都包含自己的部分,即使其中的函数都共享一个部分。在这种情况下,链接器标志本身应该执行您的要求:消除未使用的整个对象。gcc 手册指出编译器标志会增加对象大小,虽然我希望最终的可执行文件不会受到此影响,但我不确定,所以无论如何你都应该尝试一下LDFLAGS="-Wl,--gc-sections
本身。
列出的选项名称可能是有用的关键字,用于在stackoverflow上搜索有关如何减小二进制文件大小的其他建议。 例如,gc-sections
目前产生62场比赛。
- CMake-按正确顺序将项目与C运行时对象文件链接
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 错误 VSP1011:无法获取调试信息.与 /配置文件链接器开关链接
- 将我的主输出库与测试可执行文件链接时出现问题
- CMake + Qt + GTest 文件链接
- 生成文件链接
- 使用LTO静态链接的可执行文件(链接时间优化):如何使用以前构建的库进行制作
- 生成文件链接错误
- 使用 c++ 生成文件的文件链接
- 生成文件:链接器错误
- 反转头文件/链接
- C++实现和头文件链接
- .cpp文件将不会与.h文件链接
- 将问题与多个文件链接在一起
- 编译三个C++文件.链接错误
- C++如何将我的主类与我的头文件链接起来
- 使文件链接问题 架构x86_64的未定义符号
- c++和mex文件链接错误
- 使用堆叠类生成文件链接问题
- 使用对象文件链接c++中的东西