c++ - 相同的源代码,不同的可执行文件大小?
问题描述
在 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)。大多数文件大小相同,但有些文件大小不同。当转储它们(具有不同大小的文件)时,编译器是不同的。
任何帮助、建议、链接都会有所帮助。谢谢你。
解决方案
什么会影响可执行文件/库的大小?
不同版本的编译器。
当然!它可以生成非常不同的二进制文件,不仅大小不同。它从不同的代码位置开始,对同一源代码完全不同的汇编。
不同的编译选项。
它必须改变大小!如果您针对大小或速度进行优化,结果肯定会有所不同。想想循环展开......
不同的操作系统版本及其库(如 libm.a、libpthread.a ..)。
因为它们也是用不同的编译器编译的,所以答案是递归的:-)
更多的?
也许是无穷无尽的清单?链接时文件的排序,不同的链接器选项,...
我的提示:
可执行文件的大小只是第一次检查。您可以拥有相同大小的不同可执行文件,非常清楚。
即使您有相同的编译器,运行相同的库和相同的操作系统,您也需要使用相同的构建脚本/make 来构建以获得相同的结果。如果有什么不同(编译器/库/编译器和/或链接器标志、文件顺序不同,则链接的可执行文件不同!
简而言之:如果您无法为您的构建复制环境的精确副本,您将永远不会看到相同的可执行文件,即使来源相同!
推荐阅读
- powershell - 在PowerShell中正确使用cmd
- android - 如何为 Http get 请求创建一个 while 循环以不断重复该过程直到某个值为真?在科特林
- python - 尝试运行相同的函数时出现 str.split() 问题 - 列未被“擦除”
- firebase - 输入'_MapStream
>' 不是类型“列表”的子类型 ' 在类型转换中 - php - Ajax + mysql 重载页面
- javascript - MDBootstrap | 禁用可选日期:当前日期 + 3 天
- java - 使用 okhttp3 时空 HTTP 获取响应正文
- flutter - 如何返回与 dart 下拉列表中的值不同的值?
- statistics - 卡林鲁宾检验中的单调似然比假设
- node.js - 计算模式的长度并将其存储在数据库中