相同的源代码,不同的可执行文件大小?

Posted

技术标签:

【中文标题】相同的源代码,不同的可执行文件大小?【英文标题】:Same source code, different executable size? 【发布时间】:2020-04-12 19:41:24 【问题描述】:

在 AIX 中,不同版本的编译器能否使可执行文件(或库)大小不同?

问题

什么会影响可执行文件/库的大小?

编译器版本不同。 不同的编译选项。 不同的操作系统版本及其库(如 libm.a、libpthread.a ..)。 更多?

一些背景。

在这里,我们有一堆旧的可执行文件和库,它们不是版本控制下的源代码。我们需要弄清楚可执行文件是从我们拥有的源代码构建的。所以我们再次构建它,但是结果(exec,libs)大小不一样。

尝试..

我试过了..

dump -X64 -c : 它显示了编译时使用的编译器的一些信息。二进制文件的编译器版本是“IBM XL C/C++ .. 11.1.0.14”。但是我们拥有的编译器版本是'IBM .. 11.1.0.13'。这些能有所作为吗? ar -X64 -x :比较存档中提取的文件。当我“制作”一些库时,生成了目标文件(* .o)。大多数文件大小相同,但有些文件大小不同。转储它们(大小不同的文件)时,编译器不一样。

任何帮助、建议、链接都会有所帮助。谢谢。

【问题讨论】:

有很多因素会影响可执行程序文件的大小。您列出的那些就是其中之一。对库的更新也可能会影响大小。至于编译器版本,对编译器的更新可能包括对代码生成的更改,这当然会影响大小。它还可能包括对优化的更改,这也可能影响大小。 【参考方案1】:

什么会影响可执行文件/库的大小?

不同版本的编译器。

当然!它可以生成非常不同的二进制文件,不仅大小不同。它从不同的代码位置开始,对同一源代码进行完全不同的汇编。

不同的编译选项。

它必须改变大小!如果您针对大小或速度进行优化,结果肯定会有所不同。想想循环展开...

不同的操作系统版本及其库(如 libm.a、libpthread.a ..)。

由于它们也是用不同的编译器编译的,所以答案是递归的 :-)

更多?

也许是无穷无尽的清单?链接时文件的排序,不同的链接器选项,...

我的提示:

可执行文件的大小只是第一次检查。你可以拥有相同大小的不同可执行文件,非常清晰。

即使您有相同的编译器、相同的库和运行相同的操作系统,您也需要使用相同的构建脚本/make 来构建以获得相同的结果。如果有任何不同(编译器/库/编译器和/或链接器标志、文件顺序不同,则链接的可执行文件不同!

简而言之:如果您无法为您的构建复制环境的精确副本,您将永远不会看到相同的可执行文件,即使来源相同!

【讨论】:

在优化速度时,除了循环展开之外,还有许多其他因素可以增加大小,例如函数内联或循环对齐 谢谢!高管的年龄在 15 岁以上。没有人知道我们的来源是制作二进制文件。也许最好忘记大小..

以上是关于相同的源代码,不同的可执行文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

不同 C 编译器生成的可执行文件的差异

为不同的可执行文件名称制作参数

为啥我的可执行文件大小从 780K 增加到 1.1MB?

如何在一个 qt qml 窗口中运行和显示 4 个可执行文件?

减小与 opencv 静态链接的可执行文件的大小

由于调试符号,巨大的可执行文件,为啥?