我知道我可以用得到由編譯器生成彙編源代碼:如何在gcc中獲得完整的彙編程序輸出?
gcc -S ...
即使是煩人不給我一個目標文件作爲過程的一部分。
但是我怎麼能得到編譯代碼的一切?我的意思是地址,生成的字節等等。
由gcc -S
輸出的指令不會告訴我關於指令長度或編碼的任何內容,這是我想看到的。
我知道我可以用得到由編譯器生成彙編源代碼:如何在gcc中獲得完整的彙編程序輸出?
gcc -S ...
即使是煩人不給我一個目標文件作爲過程的一部分。
但是我怎麼能得到編譯代碼的一切?我的意思是地址,生成的字節等等。
由gcc -S
輸出的指令不會告訴我關於指令長度或編碼的任何內容,這是我想看到的。
我喜歡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
,它將嘗試使用相應的源代碼行對輸出進行註釋。
這聽起來像我想你想要一個反彙編程序。 objdump
幾乎是標準(Mac OS X上的otool
);與您的鏈接器提供給您的任何映射文件信息一致,反彙編您的目標文件應該會給你所需的一切。
gcc將生成一個彙編語言源文件。然後,您可以使用as -a yourfile.S
生成包含每條指令的偏移量和編碼字節的列表。 -a
也有一些子選項來控制列表文件中顯示的內容(as --help
將給出它們以及其他可用選項的列表)。
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調試
獲得快速列表的最簡單方法是將-a
選項用於彙編程序,您可以通過將-Wa,-a
放在gcc
命令行上來執行此操作。您可以對a選項使用各種修飾符來完全影響出現的內容 - 請參閱as(1)手冊頁。
[使用GCC生成可讀的程序集?](https://stackoverflow.com/questions/1289881/using-gcc-to-produce-readable-assembly) – 2018-02-27 19:49:29