GCC/objdump:生成可编译/可构建的程序集(穿插在C/C++中)源代码?

sda*_*aau 7 c assembly gcc objdump

这接近于使用GCC生成可读组件?,但我的上下文是avr-gcc(并相应地avr-objdump)Atmel(虽然,我想它将适用于GCC董事会).

问题是,我有一个多个.c和.cpp文件的项目; 最终被编译成可执行文件,其名称与'master'.cpp文件相同.在这个过程中,我可以通过两种方式获得汇编列表:

  • 我可以使用开关指示gcc发出汇编列表源(参见Linux汇编和反汇编和简介)-S; 在这种情况下,我得到一个文件,内容如下:
    ...
    loop:
      push r14
      push r15
      push r16
      push r17
      push r28
      push r29
    /* prologue: function /
    / frame size = 0 */
      ldi r24,lo8(13)
      ldi r22,lo8(1)
      call digitalWrite
      rjmp .L2
    .L3:
      ldi r24,lo8(MyObj)
      ldi r25,hi8(MyObj)
      call _ZN16MYOBJ7connectEv
    .L2:
      ldi r24,lo8(MyObj)
      ldi r25,hi8(MyObj)
      call _ZN16MYOBJ11isConnectedEv
    ...
    

(还没有尝试过;但我想这段代码是可编译的/可构建的....)

  • 我可以检查最终的可执行文件,并指示objdump使用该-S开关发出汇编列表源; 在这种情况下,我得到一个文件,内容如下:
    ...
    0000066a <init>:
    void init()
    {
            // this needs to be called before setup() or some functions won't
            // work there
            sei();
         66a:       78 94           sei
         66c:       83 b7           in      r24, 0x33       ; 51
         66e:       84 60           ori     r24, 0x04       ; 4
         670:       83 bf           out     0x33, r24       ; 51
    ...
    000006be <loop>:
         6be:       ef 92           push    r14
         6c0:       ff 92           push    r15
         6c2:       0f 93           push    r16
         6c4:       1f 93           push    r17
         6c6:       cf 93           push    r28
         6c8:       df 93           push    r29
         6ca:       8d e0           ldi     r24, 0x0D       ; 13
         6cc:       61 e0           ldi     r22, 0x01       ; 1
         6ce:       0e 94 23 02     call    0x446   ; 0x446 
         6d2:       04 c0           rjmp    .+8             ; 0x6dc 
         6d4:       8d ef           ldi     r24, 0xFD       ; 253
         6d6:       94 e0           ldi     r25, 0x04       ; 4
         6d8:       0e 94 25 06     call    0xc4a   ; 0xc4a <_ZN16MYOBJ7connectEv>
         6dc:       8d ef           ldi     r24, 0xFD       ; 253
         6de:       94 e0           ldi     r25, 0x04       ; 4
         6e0:       0e 94 21 06     call    0xc42   ; 0xc42 <_ZN16MYOBJ11isConnectedEv>
    ...
    

(我确实试图构建这个代码,它确实失败了 - 它将'行号'作为标签读取)

显然,两个列表(loop至少是函数)代表相同的汇编代码; 除了:

  • gcc一个(应该)编译-的objdump人做
  • objdump一个包含所有称为函数,这可能会在比"主"其他文件中定义列表(例如,digitalWrite) -在gcc一个确实并不
  • objdump一个含有原来的C/C++源极线"散布"与组件(只对于C的文件,但只是偶尔,貌似?) -的gcc一个确实并不

那么,有没有办法获得一个可编译的汇编列表,但是所有的内联函数,以及源C/C++代码(可能在适当的地方)散布为注释(因此它们不会干扰)编译汇编文件)?(没有为输出编写解析器objdump,那就是:))

Spu*_*d86 1

将该选项添加-fverbose-asm到您的 gcc 命令行中。(这是在 gcc 手册中,但它记录在“Code Gen Options”下)