2010-09-07 79 views
4

我知道我可以用得到由編譯器生成彙編源代碼如何在gcc中獲得完整的彙編程序輸出?

gcc -S ... 

即使是煩人不給我一個目標文件作爲過程的一部分。

但是我怎麼能得到編譯代碼的一切?我的意思是地址,生成的字節等等。

gcc -S輸出的指令不會告訴我關於指令長度或編碼的任何內容,這是我想看到的。

+0

[使用GCC生成可讀的程序集?](https://stackoverflow.com/questions/1289881/using-gcc-to-produce-readable-assembly) – 2018-02-27 19:49:29

回答

7

我喜歡objdump這個,但最有用的選項是非顯而易見的 - 特別是如果您在包含重定位的對象文件上使用它,而不是最終的二進制文件。

objdump -d some_binary做了一個合理的工作。

objdump -d some_object.o用處不大,因爲對外部函數的調用沒有得到有益拆解:

... 
00000005 <foo>: 
    5: 55      push %ebp 
    6: 89 e5     mov %esp,%ebp 
    8: 53      push %ebx 
... 
    29: c7 04 24 00 00 00 00 movl $0x0,(%esp) 
    30: e8 fc ff ff ff   call 31 <foo+0x2c> 
    35: 89 d8     mov %ebx,%eax 
... 

call實際上是printf() ...添加-r標記可與;它標誌着搬遷。 objdump -dr some_object.o給出:

... 
    29: c7 04 24 00 00 00 00 movl $0x0,(%esp) 
         2c: R_386_32 .rodata.str1.1 
    30: e8 fc ff ff ff   call 31 <foo+0x2c> 
         31: R_386_PC32 printf 
... 

然後,我發現它有用看到註釋爲<symbol+offset>每一行。objdump有一個方便的選項,但它有轉向實際字節斷轉儲惱人的副作用 - objdump --prefix-addresses -dr some_object.o給出:

... 
00000005 <foo> push %ebp 
00000006 <foo+0x1> mov %esp,%ebp 
00000008 <foo+0x3> push %ebx 
... 

但事實證明,你可以撤消通過提供另一晦澀選項,最後到達在我最喜歡的objdump咒語:

objdump --prefix-addresses --show-raw-insn -dr file.o

這使輸出這樣的:

... 
00000005 <foo> 55      push %ebp 
00000006 <foo+0x1> 89 e5      mov %esp,%ebp 
00000008 <foo+0x3> 53       push %ebx 
... 
00000029 <foo+0x24> c7 04 24 00 00 00 00  movl $0x0,(%esp) 
         2c: R_386_32 .rodata.str1.1 
00000030 <foo+0x2b> e8 fc ff ff ff    call 00000031 <foo+0x2c> 
         31: R_386_PC32 printf 
00000035 <foo+0x30> 89 d8      mov %ebx,%eax 
... 

如果你已經用調試符號(即編譯爲-g),並且您將-dr替換爲-Srl,它將嘗試使用相應的源代碼行對輸出進行註釋。

0

這聽起來像我想你想要一個反彙編程序。 objdump幾乎是標準(Mac OS X上的otool);與您的鏈接器提供給您的任何映射文件信息一致,反彙編您的目標文件應該會給你所需的一切。

1

gcc將生成一個彙編語言源文件。然後,您可以使用as -a yourfile.S生成包含每條指令的偏移量和編碼字節的列表。 -a也有一些子選項來控制列表文件中顯示的內容(as --help將給出它們以及其他可用選項的列表)。

0
nasm -f elf xx.asm -l x.lst 

gcc xx.c xx.o -o xx 

產生一個「清單」文件x.lst後者只適用於xx.asm

爲xx.c與xx.asm你可以編譯他們兩個,然後用「gdb」一起 - GNU調試

3

獲得快速列表的最簡單方法是將-a選項用於彙編程序,您可以通過將-Wa,-a放在gcc命令行上來執行此操作。您可以對a選項使用各種修飾符來完全影響出現的內容 - 請參閱as(1)手冊頁。