使用--whole-archive ld选项后,大小急剧减小

时间:2015-10-26 12:42:44

标签: linker ld

ld documentation说,

  

- 全 - 归档

     

对于命令行后提到的每个档案   --whole-archive选项,包括链接中存档中的每个目标文件,而不是在存档中搜索所需对象   文件。这通常用于将存档文件转换为共享文件   库,强制每个对象都包含在生成的共享中   图书馆。此选项可能会被多次使用。

我编写了一个玩具程序,并将其与GNU gmp库(libgmp.a)静态链接。令人惊讶的是,libgmp.a的大小为1.2 MB,而生成的可执行文件的大小为526 KB。使用.a提取ar -x存档会生成457个目标文件。根据文档,如果所有这些链接无论使用情况如何,那么链接后的大小几乎会50%减少{?}}?有没有办法可以确认所有目标文件是否都链接在可执行文件中?

1 个答案:

答案 0 :(得分:0)

我很好奇,所以我自己尝试了。

我将一个空main()投入到一个源文件中,对其进行编译并链接到libm.a并指定了--whole-archive。然后我从libm.a中提取了所有目标文件,并将它们链接到所有目标文件。

我在两个可执行文件上都使用nm,将符号名称删除,并diff输出。它是相同的,两个可执行文件都有2003个符号。

我还从libm.a本身提取了符号名称,并将它们与我的可执行文件中的符号名称进行了比较。再一次,没有差异(当然,除了可执行文件中的C运行符号)。

所以我认为--whole-archive完全按照宣传的方式工作是非常安全的。

至于大小的巨大差异,很可能是因为目标文件是完整的ELF二进制文件。它们充满了信息(如ELF标题),而这些信息并不能生成可执行的可执行文件。