How do you get assembler output from C/C++ source in gcc?

后端 未结 17 1793
天命终不由人
天命终不由人 2020-11-22 02:43

How does one do this?

If I want to analyze how something is getting compiled, how would I get the emitted assembly code?

相关标签:
17条回答
  • 2020-11-22 03:06

    If what you want to see depends on the linking of the output, then objdump on the output object file/executable may also be useful in addition to the aforementioned gcc -S. Here's a very useful script by Loren Merritt that converts the default objdump syntax into the more readable nasm syntax:

    #!/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;
    

    I suspect this can also be used on the output of gcc -S.

    0 讨论(0)
  • 2020-11-22 03:07

    Well, as everyone said, use -S option. If you use -save-temps option, you can also get preprocessed file(.i), assembly file(.s) and object file(*.o). (get each of them by using -E, -S, and -c.)

    0 讨论(0)
  • 2020-11-22 03:09

    Here is a solution for C using gcc :

    gcc -S program.c && gcc program.c -o output
    
    1. Here the first part stores the assembly output of the program in the same file name as Program but with a changed .s extension, you can open it as any normal text file.

    2. The second part here compiles your program for actual usage and generates an executable for your Program with a specified file name.

    The program.c used above is the name of your program and output is the name of the executable you want to generate.

    BTW It's my First post on StackOverFlow :-}

    0 讨论(0)
  • 2020-11-22 03:10

    Use the -S option to gcc (or g++).

    gcc -S helloworld.c
    

    This will run the preprocessor (cpp) over helloworld.c, perform the initial compilation and then stop before the assembler is run.

    By default this will output a file helloworld.s. The output file can be still be set by using the -o option.

    gcc -S -o my_asm_output.s helloworld.c
    

    Of course this only works if you have the original source. An alternative if you only have the resultant object file is to use objdump, by setting the --disassemble option (or -d for the abbreviated form).

    objdump -S --disassemble helloworld > helloworld.dump
    

    This option works best if debugging option is enabled for the object file (-g at compilation time) and the file hasn't been stripped.

    Running file helloworld will give you some indication as to the level of detail that you will get by using objdump.

    0 讨论(0)
  • 2020-11-22 03:11

    As everyone has pointed out, use the -S option to GCC. I would also like to add that the results may vary (wildly!) depending on whether or not you add optimization options (-O0 for none, -O2 for agressive optimization).

    On RISC architectures in particular, the compiler will often transform the code almost beyond recognition in doing optimization. It's impressive and fascinating to look at the results!

    0 讨论(0)
  • 2020-11-22 03:16

    The following command line is from Christian Garbin's blog

    g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
    

    I ran G++ from a DOS window on Win-XP, against a routine that contains an implicit cast

    c:\gpp_code>g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
    horton_ex2_05.cpp: In function `int main()':
    horton_ex2_05.cpp:92: warning: assignment to `int' from `double'
    

    The output is asssembled generated code iterspersed with the original C++ code (the C++ code is shown as comments in the generated asm stream)

      16:horton_ex2_05.cpp **** using std::setw;
      17:horton_ex2_05.cpp ****
      18:horton_ex2_05.cpp **** void disp_Time_Line (void);
      19:horton_ex2_05.cpp ****
      20:horton_ex2_05.cpp **** int main(void)
      21:horton_ex2_05.cpp **** {
     164                    %ebp
     165                            subl $128,%esp
    ?GAS LISTING C:\DOCUME~1\CRAIGM~1\LOCALS~1\Temp\ccx52rCc.s
    166 0128 55                    call ___main
    167 0129 89E5          .stabn 68,0,21,LM2-_main
    168 012b 81EC8000      LM2:
    168      0000
    169 0131 E8000000      LBB2:
    169      00
    170                    .stabn 68,0,25,LM3-_main
    171                    LM3:
    172                            movl $0,-16(%ebp)
    
    0 讨论(0)
提交回复
热议问题