我看到二進制翻譯通常跟蹤爲主。是否因爲無法獲得功能的界限?二進制代碼中是否有函數標籤?如何找到函數邊界以二進制代碼
回答
有非同小可的答案。您可以搜索ret
指令,但不能保證它們是函數邊界,因爲您可以從函數的中間返回。
搜索的東西一樣
mov ebp, esp
將努力在一定程度上,但同樣,它也不能保證。
一些編譯器(最引人注目的是英特爾編譯器),將後支塊移動到函數結束,並跳回功能...
什麼是跟蹤型是什麼意思?對您的問題的基本答案是否定的,機器代碼中沒有功能標籤。可能存在針對每個編譯器的特定模式,您可以使用可執行格式來查找代碼中公共函數的入口點。但是現在編譯器可以進行全程序優化,從而在機器代碼級別模糊了函數的概念。
用於尋找開始和結束的C函數地址的常用方法是打印出的存儲器映射和掃描功能的開始。許多編譯器將在存儲器映射中指定函數長度。
一些編譯器提供#pragma
或預處理的關鍵詞,讓你的功能分配到特定地址。
抱歉,該C語言只提供的功能的起始地址;不是他們的長度。
如果知道所有函數的起始地址,就很容易獲得長度,對吧? – dalibocai
不,C語言不提供獲取函數長度的工具。必須查閱映射文件和鏈接器指令文件。連接器不需要連續放置函數,也不需要在同一空間中放置函數;一個功能可能在SRAM中,另一個在ROM中。 –
- 1. 二進制掩碼的邊界
- 2. 十進制到二進制代碼
- 3. 查找最左邊的二進制數
- 4. 如何幹運行程序代碼'二進制到十進制'
- 5. VERILOG:如何找到一個5位數的二進制補碼
- 6. GDB顯示「無法找到當前函數的邊界」步進
- 7. 如何閱讀cuda二進制代碼
- 8. 負數十進制到二進制c代碼
- 9. 用二進制補碼查找二進制數,C
- 10. 如何在Haskell中實現十進制到二進制函數
- 11. 邊界代碼 - Java
- 12. 如何將數組編碼爲二進制並將二進制數據解組到二進制數組中?
- 13. 如何以編程方式獲得二進制數的二進制補碼
- 14. 瞭解二進制代碼
- 15. 8位二進制代碼
- 16. 二進制搜索代碼
- 17. 邊緣尋找二進制搜索
- 18. 代碼中的控制邊界實體
- 19. 查找二進制數組行數以一定的編碼
- 20. 如何收集二進制內核以分發專有代碼
- 21. 爲腳本的二進制代碼中沒有找到」 SSIS
- 22. 無法找到二進制搜索代碼錯誤
- 23. SSIS僅在start_execution上才找到「二進制代碼或腳本」
- 24. 二進制到十進制代碼改進
- 25. 如何將十六進制代碼轉換爲二進制代碼?
- 26. 如何將數字(十進制)轉換爲二進制(二進制)數字和從二進制到十進制?
- 27. 我無法在mercurial源代碼中找到diff二進制代碼
- 28. 如何找到使用二進制搜索的用戶號碼
- 29. protobuf網「找到二進制無參數的構造函數」
- 30. C#函數來翻譯二進制代碼
這是很容易得到LLVM的二進制代碼的函數標籤信息。爲什麼機器代碼不包含功能標籤信息? – dalibocai
但這不是LLVM。這是一個完全編譯的二進制文件。 (至少這就是我所假設的......) – Mysticial