[问题] 关于函数大小与机器码

楼主: 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