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,那就是:))