你如何在gcc中从C / C ++源得到汇编程序输出?

怎么作到这一点? 编程

若是我想分析如何编译某些内容,我将如何得到发出的汇编代码? sass


#1楼

使用-S开关 优化

g++ -S main.cpp

或者与gcc this

gcc -S main.c

也看到这个 spa


#2楼

使用-S选项: 调试

gcc -S program.c

#3楼

若是你想看到的东西取决于输出的连接,那么除了前面提到的gcc -S以外,对输出目标文件/可执行文件的objdump也多是有用的。 这是Loren Merritt的一个很是有用的脚本,它将默认的objdump语法转换为更易读的nasm语法: code

#!/usr/bin/perl -w
$ptr='(BYTE|WORD|DWORD|QWORD|XMMWORD) PTR ';
$reg='(?:[er]?(?:[abcd]x|[sd]i|[sb]p)|[abcd][hl]|r1?[0-589][dwb]?|mm[0-7]|xmm1?[0-9])';
open FH, '-|', '/usr/bin/objdump', '-w', '-M', 'intel', @ARGV or die;
$prev = "";
while(<FH>){
    if(/$ptr/o) {
        s/$ptr(\[[^\[\]]+\],$reg)/$2/o or
        s/($reg,)$ptr(\[[^\[\]]+\])/$1$3/o or
        s/$ptr/lc $1/oe;
    }
    if($prev =~ /\t(repz )?ret / and
       $_ =~ /\tnop |\txchg *ax,ax$/) {
       # drop this line
    } else {
       print $prev;
       $prev = $_;
    }
}
print $prev;
close FH;

我怀疑这也能够用在gcc -S的输出上。 对象


#4楼

使用-S选项gcc(或g ++)。 资源

gcc -S helloworld.c

这将在helloworld.c上运行预处理器(cpp),执行初始编译,而后在运行汇编程序以前中止。 get

默认状况下,这将输出一个文件helloworld.s 。 仍然可使用-o选项设置输出文件。

gcc -S -o my_asm_output.s helloworld.c

固然,只有拥有原始资源才能使用。 若是只有结果对象文件,则另外一种方法是使用objdump ,方法是设置--disassemble选项(或缩写形式的-d )。

objdump -S --disassemble helloworld > helloworld.dump

若是为目标文件启用了调试选项(编译时为-g )而且文件还没有被剥离,则此选项最有效。

运行file helloworld将为您提供有关使用objdump得到的详细程度的一些指示。


#5楼

正如你们所指出的那样,对GCC使用-S选项。 我还想补充说,结果可能会有所不一样(很是!)取决于您是否添加优化选项( -O0表示无, -O2表示激进优化)。

特别是在RISC体系结构中,编译器一般会在进行优化时将代码转换为几乎没法识别。 看结果使人印象深入,使人着迷!

相关文章
相关标签/搜索