确定不必要地链接哪些静态库

时间:2016-06-22 13:51:12

标签: c++ linux gcc

我想减少一些C ++可执行文件的库依赖项,我正在为使用GCC的Linux编译。有一个列表可能包含40个链接的静态库。我想确定哪些是不必要的,我宁愿不要一次尝试删除它们以找出答案。

GCC中是否有一个选项可以让它对链接但不解析任何符号的库发出警告?

是否有可用的Linux工具可以帮助我?

要清除,我并不关心链接到可执行文件的未使用代码。相反,我关注不必要的构建依赖。我想减少我的构建时间。

2 个答案:

答案 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进行一些预处理可能会对某些用例更有帮助。