我想减少一些C ++可执行文件的库依赖项,我正在为使用GCC的Linux编译。有一个列表可能包含40个链接的静态库。我想确定哪些是不必要的,我宁愿不要一次尝试删除它们以找出答案。
GCC中是否有一个选项可以让它对链接但不解析任何符号的库发出警告?
是否有可用的Linux工具可以帮助我?
要清除,我并不关心链接到可执行文件的未使用代码。相反,我关注不必要的构建依赖。我想减少我的构建时间。
答案 0 :(得分:4)
在@ThomasMatthews提供的信息的基础上,对该问题发表评论:
使用-M
选项运行链接器并将其输出传递给以下脚本:
<强> get_used_libs 强>
#!/bin/bash
sed -e '/^Discarded input sections$/,$ d' \
-e '/^Archive member included to satisfy reference by file (symbol)$/ d' \
-e '/^As-needed library included to satisfy reference by file (symbol)$/ d' \
-e '/^Discarded input sections$/ d' \
-e '/^$/ d; /^\s/ d; s/\s\+.\+//; s/(.\+//' \
| sort -u
它将返回必要库以供您的程序链接。
免责声明:该脚本仅在玩具程序的GNU ld (GNU Binutils for Ubuntu) 2.25.1
输出上进行测试。
答案 1 :(得分:1)
虽然不如其他答案那么方便,但您可以使用nm
列出所需对象(U
)并导出(其他任何内容,但要注意[VvWw]
)任何对象的符号或存档。
使用grep和/或sed进行一些预处理可能会对某些用例更有帮助。