2016-02-14 100 views
0

我想查看我的简单C应用程序的程序集。所以,我试图使用objdump来生成二进制程序集,并且它会生成大约4.3MB大小的文件,其中103228行汇编代码为。然后,我试图通过向gcc提供-S & -save-temps标志来完成此操作。为什么objdump生成的程序集很庞大?

我已经使用以下三个命令:

1. arm-linux-gnueabi-objdump -d hello_simple > hello_simple.dump 
2. arm-linux-gnueabi-gcc -save-temps -static hello_simple.c -o hello_simple -lm 
3. arm-linux-gnueabi-gcc -S -static hello_simple.c -o hello_simple.asm -lm 

在2 & 3的情况下,恰好相同的结果产生的,即,65行汇编代码。我明白objdump也会产生一些额外的细节。

但是,为什么有一个巨大的区别?

EDIT1:我用下面的命令来建立一个二进制:

arm-linux-gnueabi-gcc -static hello_simple.c -o hello_simple -lm 

EDIT2:虽然,-static-lm标志可以看这里没有必要,但是,我必须执行在模拟器中的二进制在编译时添加一些组件组件后,使其成为必需。

那么,在执行跟踪分析过程中,我应该认为哪个汇编代码最相关? (我知道这是另一个问题,但在相同的答案中可以方便地使用它。)

+0

.debug_info我猜?试着首先去掉 –

+1

如果你的程序使用了'-static'链接,它还会包含'libc'和其他链接到可执行文件的库。那些也会被'objdump'倾倒。 –

+0

re:你最后的编辑。 '-static -lm'对**命令3没有任何影响。**它们显然对其他命令有所作用,因为这些* do *会产生二进制文件。 –

回答

3

第二个是为您的函数保存asm。

第一个也有CRT启动代码。而且,由于您静态链接了它,所以您调用的所有库函数。

请注意,对于3,-static-lm不要做任何事情,因为你没有链接。 gcc foo.c -S -O3 -fverbose-asm -o- | less通常很方便。

我注意到你的命令行中没有包含-O3-march=。您应该优化编译,并让gcc优化目标硬件的代码。


.s是机器生成的asm的标准后缀。 (手写asm:.S:gcc foo.S将首先通过cpp运行它)。 gcc -S产生一个.s,同样的方法-c产生一个.o

对于x86而言,.asm通常仅用于Intel语法(NASM/YASM),但IDK对ARM的约定是什么。


所以,它的汇编代码,我应该我执行跟踪的分析中认为是最相关的?

这取决于你想学的东西!如果您很清楚每个库函数调用的“昂贵”(根据指令数量,污染分支预测器的分支数量以及数据高速缓存污染),则无需通过执行图书馆电话。如果你有一些内部循环使用的数学库函数,那么如果代码对时间要求很高,那么值得一看。但是,通常情况下,调试器中的分析器或单步执行对此非常有用。只是有很多库代码的反汇编输出通常只是混乱。

相关问题