ld
documentation说,
- 全 - 归档
对于命令行后提到的每个档案 --whole-archive选项,包括链接中存档中的每个目标文件,而不是在存档中搜索所需对象 文件。这通常用于将存档文件转换为共享文件 库,强制每个对象都包含在生成的共享中 图书馆。此选项可能会被多次使用。
我编写了一个玩具程序,并将其与GNU gmp
库(libgmp.a
)静态链接。令人惊讶的是,libgmp.a
的大小为1.2 MB
,而生成的可执行文件的大小为526 KB
。使用.a
提取ar -x
存档会生成457
个目标文件。根据文档,如果所有这些链接无论使用情况如何,那么链接后的大小几乎会50%
减少{?}}?有没有办法可以确认所有目标文件是否都链接在可执行文件中?
答案 0 :(得分:0)
我很好奇,所以我自己尝试了。
我将一个空main()
投入到一个源文件中,对其进行编译并链接到libm.a
并指定了--whole-archive
。然后我从libm.a
中提取了所有目标文件,并将它们链接到所有目标文件。
我在两个可执行文件上都使用nm
,将符号名称删除,并diff
输出。它是相同的,两个可执行文件都有2003个符号。
我还从libm.a
本身提取了符号名称,并将它们与我的可执行文件中的符号名称进行了比较。再一次,没有差异(当然,除了可执行文件中的C运行符号)。
所以我认为--whole-archive
完全按照宣传的方式工作是非常安全的。
至于大小的巨大差异,很可能是因为目标文件是完整的ELF二进制文件。它们充满了信息(如ELF标题),而这些信息并不能生成可执行的可执行文件。