[問題] 關於函數大小與機器碼

作者: NilPtr (神奇的空指標)   2015-03-29 18:39:33
請問有沒有辦法在不內聯組合語言的情況下從
C/C++ 查看函數的機器碼與大小?
之前有嘗試過用函數指標配 While 去輸出機器碼,
用的方法是讀到 0xC3 (ret) 停止,不過算是個爛方法吧。
請問有沒有更好的方法來達到這項功能?
作者: LPH66 (-6.2598534e+18f)   2015-03-29 18:43:00
我比較好奇你想做什麼...
作者: Killercat (殺人貓™)   2015-03-29 19:12:00
__builtin_frame_address可以得到函數起點GCC/G++ only, 不過終點我不太清楚怎麼拿這東西會傳回函數的parameter stack位置
作者: azureblaze (AzureBlaze)   2015-03-29 19:16:00
撈debug symbol吧可是這還不如直接用debugger另外只是要看機械碼怎麼產生還是直接看文件吧http://goo.gl/cu5ggP#1J3XmLtsobjdump -d 也可以直接給你機械碼和asm對照
作者: Killercat (殺人貓™)   2015-03-29 20:02:00
其實他要寫的東西跟debugger已經沒啥兩樣了
作者: tjjh89017 (伊達政宗)   2015-03-29 20:11:00
我怎麼覺得他想寫的比較像 JIT compiler 啊XD
作者: dirkc (3781615)   2015-03-29 22:57:00
你的玩具真有趣 不過c3很容易出錯啊 mov ebx,eax 就89c3了你的問題我之前也想問,objdump可以符合你要的嗎?沒空看objdump的src,不曉得它原理怎麼做的?
作者: king19880326 (OK的啦~我都可以接受)   2015-03-29 23:17:00
objdump 就是先讀 header 才去 text segment 逐步disassemble
作者: carylorrk (carylorrk)   2015-03-30 00:24:00
大多數 basic block 就是以 jump inst 來判斷的如果你是做 instruction level 的 interpreter 或 JIT應該是直接這麼參考最快,可以參考 QEMU除非你有要做什麼最佳化必須判斷原始語言結構...
作者: suhorng ( )   2015-03-30 20:58:00
不太懂, 看編譯器產生出來的組合語言原始檔可以嗎?原來是要看最後的機器碼喔....
作者: king19880326 (OK的啦~我都可以接受)   2015-03-31 10:16:00
可以知道函數佔了多少的大小啊, executable 裡面有symbol table這個問題如果沒有 symbol table 的幫忙難度就高很多最典型的難題就是 ARM mix 了 thumb instruction
作者: dirkc (3781615)   2015-04-01 18:33:00
我知道table裡面有函式起始位址,但也有長度大小的資訊嗎?可否給個關鍵字,感謝
作者: azureblaze (AzureBlaze)   2015-04-01 20:08:00
直接找下個函數的起始位置?
作者: dirkc (3781615)   2015-04-01 22:31:00
1.不一定按順序排(這還可解決)2.似乎沒有保證(?)連續兩相對位址之差為一函式的長度?
作者: azureblaze (AzureBlaze)   2015-04-01 23:52:00
1.找下一個位址最接近的函數2.通常函數區域裡不會擺變數之類的東西NOP等怎麼算就是定義的問題了
作者: king19880326 (OK的啦~我都可以接受)   2015-04-03 05:36:00
symbol table 裡面有 function size. st_size 就是
作者: dirkc (3781615)   2015-04-03 09:16:00
謝謝

Links booklink

Contact Us: admin [ a t ] ucptt.com