首页 > 解决方案 > 更改编译器优化级别不会更改已编译的二进制文件

问题描述

我一直在使用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 文档中所示的优化级别,“测试”目标文件的生成都不会改变(编译后的二进制文件的大小是相同的)。可能是什么原因?我在这里做错了吗?提前致谢。

标签: gccarmcross-compilingcompiler-optimization

解决方案


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 字节,但正如您在反汇编中看到的,由于优化,大小差异很大。


推荐阅读