繁体   English   中英

为什么objdump产生的程序集很大?

[英]Why assembly produced by objdump is huge?

我正在尝试查看我的简单C应用程序的程序集。 因此,我尝试通过使用objdump从二进制文件生成程序集,该程序集可生成约4.3MB大小的文件,并包含103228行汇编代码 然后,我尝试通过向gcc提供-S-save-temps标志来做到这一点。

我使用了以下三个命令:

 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标志在这里看起来似乎没有必要,但是在编译了一些汇编组件的时间之后,我必须在模拟器上执行此二进制文件,这是必须的。

那么,在我分析执行跟踪时,应该考虑哪个汇编代码最相关? (我知道这是另一个问题,但是用相同的答案覆盖将很方便。)

后两个只是将asm保存为您的功能。

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

请注意,对于3, -static-lm不执行任何操作,因为您没有链接。 gcc foo.c -S -O3 -fverbose-asm -o- | less gcc foo.c -S -O3 -fverbose-asm -o- | less通常很方便。

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


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

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


那么,在我分析执行跟踪时,应该考虑哪个汇编代码最相关?

这取决于您要学习的内容! 如果您很好地了解了每个库函数调用的“昂贵”程度(在指令数量,污染分支预测变量的分支数量以及数据缓存污染方面),那么您无需跟踪执行过程图书馆电话。 如果您有一些内部循环使用的数学库函数,那么在代码对时间要求严格的情况下,有必要对其进行研究。

但是,通常,探查器或调试器中的单步调试对此很有用。 仅具有大量库代码的反汇编输出通常很混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM