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

Determining which static libraries are linked unnecessarily

本文关键字:静态 链接 不必要      更新时间:2023-10-16

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

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

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

为了学习,我不关心未使用的代码被链接到可执行文件中。相反,我关心的是不必要的构建依赖项。我想缩短我的构建时间。

建立在@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输出上进行了测试。

虽然不像其他答案那么方便,但您可以使用nm列出任何对象或存档所需的(U)和导出(任何其他内容,但请注意[VvWw])符号。

使用 grep 和/或 sed 进行一些预处理可能会使它对某些用例更有帮助。