3

我正在用 c++ 编写一个在我的主机(linux x86)和目标机器(arm)上运行的小应用程序。
我遇到的问题是,在主机上我的二进制文件大小约为 700kb,但在目标机器上约为 7mb。
我对两个平台都使用相同的编译开关。我的第一个想法是 arget 机器上的一个库是静态链接的,但我检查了两个二进制文件,objdump并且都使用相同的动态链接库。那么谁能给我提示我如何弄清楚为什么大小差异如此之大?

4

4 回答 4

3

虽然理论上不同的计算机体系结构对于同一个程序可能需要完全不同数量的可执行代码,但在现代体系结构中并不真正期望 10 倍。ARM 和 x86 可能不同,但它们仍然设计在同一个世界中,内存和带宽不会被浪费,这导致 CPU 设计人员试图使可执行代码尽可能紧凑。

因此,我将按概率顺序查看以下可能性:

  • 符号剥离:如果两个二进制文件中的一个已从其符号中剥离,那么它会明显更小,尤其是在使用调试信息编译的情况下。您可能想尝试剥离两个二进制文件,看看会发生什么。

  • 静态链接:我偶尔会遇到更喜欢静态链接而不是使用共享库的嵌入式目标的构建系统。检查每个二进制文件的库依赖关系可能会检测到这一点。

  • 附加启用代码:较大的二进制文件可能启用附加代码,因为例如构建系统找到了附加的可选库,或者因为目标平台需要特定的句柄。

    尽管如此,10 倍可能还是太大了,除非较小的二进制文件缺少很多功能,或者较大的二进制文件已静态链接到某些可选库中。

  • 不同的编译器配置:您不仅应该查看提供的编译器选项,还应该查看编译器为每个目标使用的默认值。例如,如果编译器在一种架构中具有显着更高的内联或循环展开限制,则生成的可执行文件可能会显着膨胀。

于 2012-12-07T10:22:00.403 回答
1

首先,没有理由期望为不同架构编译的相同代码在大小上相互有任何关系。您可以轻松地让 A 大于 B,然后更改一行代码,然后 B 大于 A。

其次,您所说的“二进制文件”是我猜的精灵,它有点二进制,有些开销很大。架构和其他类似事物之间的开销可能会有所不同。

最重要的是,如果您正在为两个架构/平台编译相同的代码,或者使用不同的编译器或编译选项为相同的架构编译,则没有理由期望文件大小彼此之间有任何关系。

于 2012-12-06T18:45:26.560 回答
0

不同的架构可以有完全不同的方式来处理同样的事情。例如,在 CISC(例如 x86)架构上加载立即数通常是一条指令,而在 RISC(例如 ppc、arm)上通常是多条指令,所需的实际数量取决于值。例如,如果指令集只允许 16 位立即数,您可能需要最多 7 条指令来加载 64 位值(按 16 位加载并在加载之间移动)。因此,代码本质上是不同的。

于 2012-12-06T23:31:37.947 回答
0

到目前为止未提及但与 ARM/x86 比较相关的一个原因是浮点仿真。今天所有的 x86 芯片都支持原生 FP(x86-64 甚至通过 SSE 支持 SIMD FP),但 ARM CPU 通常缺少 FP 单元。这反过来意味着即使是简单的 FP 加法也必须转换为对指数和尾数的一长串整数运算。

于 2012-12-07T14:44:10.770 回答