2011-09-08 71 views

回答

2

有非同小可的答案。您可以搜索ret指令,但不能保證它們是函數邊界,因爲您可以從函數的中間返回。

搜索的東西一樣

mov ebp, esp 

將努力在一定程度上,但同樣,它也不能保證。

一些編譯器(最引人注目的是英特爾編譯器),將後支塊移動到函數結束,並跳回功能...

+0

這是很容易得到LLVM的二進制代碼的函數標籤信息。爲什麼機器代碼不包含功能標籤信息? – dalibocai

+0

但這不是LLVM。這是一個完全編譯的二進制文件。 (至少這就是我所假設的......) – Mysticial

0

什麼是跟蹤型是什麼意思?對您的問題的基本答案是否定的,機器代碼中沒有功能標籤。可能存在針對每個編譯器的特定模式,您可以使用可執行格式來查找代碼中公共函數的入口點。但是現在編譯器可以進行全程序優化,從而在機器代碼級別模糊了函數的概念。

0

用於尋找開始和結束的C函數地址的常用方法是打印出的存儲器映射和掃描功能的開始。許多編譯器將在存儲器映射中指定函數長度。

一些編譯器提供#pragma或預處理的關鍵詞,讓你的功能分配到特定地址。

抱歉,該C語言只提供的功能的起始地址;不是他們的長度。

+0

如果知道所有函數的起始地址,就很容易獲得長度,對吧? – dalibocai

+0

不,C語言不提供獲取函數長度的工具。必須查閱映射文件和鏈接器指令文件。連接器不需要連續放置函數,也不需要在同一空間中放置函數;一個功能可能在SRAM中,另一個在ROM中。 –

相關問題