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

看板C_and_CPP作者 (神奇的空指標)時間9年前 (2015/03/29 18:39), 9年前編輯推噓3(3039)
留言42則, 8人參與, 最新討論串1/1
請問有沒有辦法在不內聯組合語言的情況下從 C/C++ 查看函數的機器碼與大小? 之前有嘗試過用函數指標配 While 去輸出機器碼, 用的方法是讀到 0xC3 (ret) 停止,不過算是個爛方法吧。 請問有沒有更好的方法來達到這項功能? -- Sent from my Windows7 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.252.0.226 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1427625578.A.148.html ※ 編輯: NilPtr (111.252.0.226), 03/29/2015 18:40:16

03/29 18:43, , 1F
我比較好奇你想做什麼...
03/29 18:43, 1F
觀察不同CPU的架構與編譯器生成出的機器碼,配著指令編碼表服用... 打算弄個能夠即時生成x86機器碼然後運型的程式庫吧, 類似 GNU Lightning 、 NanoJIT 的小玩具 ※ 編輯: NilPtr (111.252.0.226), 03/29/2015 18:56:27

03/29 19:12, , 2F
__builtin_frame_address可以得到函數起點
03/29 19:12, 2F

03/29 19:12, , 3F
GCC/G++ only, 不過終點我不太清楚怎麼拿
03/29 19:12, 3F

03/29 19:12, , 4F
這東西會傳回函數的parameter stack位置
03/29 19:12, 4F
感謝資訊提供

03/29 19:16, , 5F
撈debug symbol吧
03/29 19:16, 5F

03/29 19:17, , 6F
可是這還不如直接用debugger
03/29 19:17, 6F

03/29 19:18, , 7F
另外只是要看機械碼怎麼產生還是直接看文件吧
03/29 19:18, 7F

03/29 19:18, , 8F
03/29 19:18, 8F

03/29 19:19, , 9F
03/29 19:19, 9F

03/29 19:25, , 10F
objdump -d 也可以直接給你機械碼和asm對照
03/29 19:25, 10F
我都忘了還有 objdump 這指令還能用 ( 跪 感謝短網址,之前也稍微翻過Intel的官方文檔 不過還是想看一般編譯器編出來的東西是長怎樣

03/29 20:02, , 11F
其實他要寫的東西跟debugger已經沒啥兩樣了
03/29 20:02, 11F
類似,但是不是 Debugger :D

03/29 20:11, , 12F
我怎麼覺得他想寫的比較像 JIT compiler 啊XD
03/29 20:11, 12F
正解 ! 而且為了增加樂趣而不用現成的虛擬機 只能看著 LLVM、JVM、MONO 之類的東西流口水 主要是想要實現一個程式語言虛擬機 前端 (詞法分析語法分析) 的話反而沒太大興趣 不過這不是工業或學術項目,只是用來打發時間用的玩具 :D ※ 編輯: NilPtr (111.252.0.226), 03/29/2015 20:59:14

03/29 22:57, , 13F
你的玩具真有趣 不過c3很容易出錯啊 mov ebx,eax 就89c3了
03/29 22:57, 13F

03/29 22:58, , 14F
你的問題我之前也想問,objdump可以符合你要的嗎?
03/29 22:58, 14F

03/29 22:59, , 15F
沒空看objdump的src,不曉得它原理怎麼做的?
03/29 22:59, 15F
讀 c3 真的是很蠢的方法 XD

03/29 23:17, , 16F
objdump 就是先讀 header 才去 text segment 逐步
03/29 23:17, 16F

03/29 23:17, , 17F
disassemble
03/29 23:17, 17F
原來如此,所以說沒辦法確定已經連結後的可執行檔中函數佔了多少的大小嗎?

03/30 00:24, , 18F
大多數 basic block 就是以 jump inst 來判斷的
03/30 00:24, 18F

03/30 00:25, , 19F
如果你是做 instruction level 的 interpreter 或 JIT
03/30 00:25, 19F

03/30 00:25, , 20F
應該是直接這麼參考最快,可以參考 QEMU
03/30 00:25, 20F
只好去啃Intel手冊了,Intel編碼的方式有點讓我搞不太清楚 同時也參考 NanoJIT 或 DynASM 人家怎麼寫好了

03/30 00:26, , 21F
除非你有要做什麼最佳化必須判斷原始語言結構...
03/30 00:26, 21F

03/30 17:26, , 22F
至於 dirkc 的問題,x86 相對比較複雜,可能要完整
03/30 17:26, 22F

03/30 17:26, , 23F
disassemble 才能準確找到
03/30 17:26, 23F
※ 編輯: NilPtr (111.252.0.226), 03/30/2015 19:30:48

03/30 19:49, , 24F
其實可以考慮從 arm 開始?我認爲簡單很多
03/30 19:49, 24F

03/30 19:51, , 25F
不過除了 inst,其他架構也差蠻多的。像是 cache、page
03/30 19:51, 25F

03/30 19:53, , 26F
但是寫 process vm 應該不太會碰到XD
03/30 19:53, 26F
ARM 指令沒 X86 這麼恐怖,可以考慮先從低等的怪開始打 XDD 記憶體管理的話用 GC + Memory Pool,各種CG演算法也是樂趣所在 :D 要用的時候再用C/C++分配給動態生成的指令去處理吧,應該沒太大問題 這是一個要先把計算機架構、作業系統、編譯原理全都讀過一次的節奏,越級打怪...XD ※ 編輯: NilPtr (111.252.0.226), 03/30/2015 20:29:50

03/30 20:58, , 27F
不太懂, 看編譯器產生出來的組合語言原始檔可以嗎?
03/30 20:58, 27F

03/30 22:34, , 28F
原來是要看最後的機器碼喔....
03/30 22:34, 28F

03/31 10:16, , 29F
可以知道函數佔了多少的大小啊, executable 裡面有
03/31 10:16, 29F

03/31 10:17, , 30F
symbol table
03/31 10:17, 30F

03/31 10:18, , 31F
這個問題如果沒有 symbol table 的幫忙難度就高很多
03/31 10:18, 31F

03/31 10:20, , 32F
最典型的難題就是 ARM mix 了 thumb instruction
03/31 10:20, 32F

04/01 18:33, , 33F
我知道table裡面有函式起始位址,但也有長度大小的資訊嗎?
04/01 18:33, 33F

04/01 18:34, , 34F
可否給個關鍵字,感謝
04/01 18:34, 34F

04/01 20:08, , 35F
直接找下個函數的起始位置?
04/01 20:08, 35F

04/01 22:31, , 36F
1.不一定按順序排(這還可解決)2.似乎沒有保證(?)連續兩相對
04/01 22:31, 36F

04/01 22:32, , 37F
位址之差為一函式的長度?
04/01 22:32, 37F

04/01 23:52, , 38F
1.找下一個位址最接近的函數
04/01 23:52, 38F

04/01 23:53, , 39F
2.通常函數區域裡不會擺變數之類的東西
04/01 23:53, 39F

04/01 23:53, , 40F
NOP等怎麼算就是定義的問題了
04/01 23:53, 40F

04/03 05:36, , 41F
symbol table 裡面有 function size. st_size 就是
04/03 05:36, 41F

04/03 09:16, , 42F
謝謝
04/03 09:16, 42F
感謝 king19880326大大 與 azureblaze大大解答 ※ 編輯: NilPtr (36.232.169.94), 04/03/2015 22:06:20
文章代碼(AID): #1L5zPg58 (C_and_CPP)