gcc - 更改编译器优化级别不会更改已编译的二进制文件
问题描述
我一直在使用arm-linux-gnueabi-gcc
工具链将二进制文件交叉编译为arm
. 奇怪的是,尽管我更改了优化级别,但编译的二进制文件没有任何差异。即使我是从“arm”关注此文档,并从下面指出的相同来源中获取。
#include <stdio.h>
int main(){
int x =10, y =20;
int z;
z =x+y;
return 0;
}
我什至浏览了该man
页面,我认为我正确使用了优化标志。这是我用来编译的确切代码。
arm-linux-gnueabi-gcc -O1 -o test test.c
但是,无论我如何更改上述 arm 文档中所示的优化级别,“测试”目标文件的生成都不会改变(编译后的二进制文件的大小是相同的)。可能是什么原因?我在这里做错了吗?提前致谢。
解决方案
arm-linux-gnueabi-gcc -O0 -c so.c -o so.o
arm-linux-gnueabi-objdump -D so.o
so.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <main>:
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0
8: e24dd014 sub sp, sp, #20
c: e3a0300a mov r3, #10
10: e50b3010 str r3, [fp, #-16]
14: e3a03014 mov r3, #20
18: e50b300c str r3, [fp, #-12]
1c: e51b2010 ldr r2, [fp, #-16]
20: e51b300c ldr r3, [fp, #-12]
24: e0823003 add r3, r2, r3
28: e50b3008 str r3, [fp, #-8]
2c: e3a03000 mov r3, #0
30: e1a00003 mov r0, r3
34: e24bd000 sub sp, fp, #0
38: e49db004 pop {fp} ; (ldr fp, [sp], #4)
3c: e12fff1e bx lr
arm-linux-gnueabi-gcc -O1 -c so.c -o so.o
arm-linux-gnueabi-objdump -D so.o
so.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <main>:
0: e3a00000 mov r0, #0
4: e12fff1e bx lr
其余的优化级别应该产生与 -O1 相同的结果,因为这是死代码,所有这些都通过简单的优化被删除。
这里的关键是当您说“二进制”时,我假设您的意思是由
arm-linux-gnueabi-gcc -O1 -o test test.c
该“测试”文件包含很多东西,对于像这样的简单程序,几乎没有一个是实际代码。
如果您检查目标文件的大小(上面的 so.o)而不是链接的二进制文件,您应该会看到差异或使用 arm-whatever-objcopy -O 二进制文件,您“可能”会看到差异,它也可能在那里的噪音也很大。
-O0 对象为 880 字节,-O1 为 824 字节,但正如您在反汇编中看到的,由于优化,大小差异很大。
推荐阅读
- javascript - 根据屏幕大小将引导模式更改为静态 div
- tensorflow - Tensorflow 2.0 中 TFRecordCompressionType.GZIP 接收错误
- android - Android Kotlin 回收站视图中点击事件的新意图
- flutter - 列表在末尾重复/类似轮播
- java - 如何在 Eclipse 中从 github 运行应用程序
- eclipse - Eclipse RCP 动态 MenuContribution 使用 CoreExpression 隐藏和取消隐藏
- python - 从 href python '#' 中删除元素
- javascript - 切片数组并从 RTL / LTR 转换
- java - 解释为什么这可以找到两个等于小数点后三位的数字
- java - 如何在片段中添加另一个屏幕?