2012-07-17 112 views
6

任何獲取指令地址的方法? 我試圖用標籤來說明指令並獲取標籤的地址,但似乎它只能在GCC編譯器中與& &運算符一起使用。 (參考:this article)如果其他編譯器呢?獲取C/C++指令的地址

這個問題的任何想法?

+0

你爲什麼問? – 2012-07-17 20:48:15

+4

C++不需要執行指令。 – 2012-07-17 20:48:32

+0

嗨巴西爾,我目前正在對指令/數據監視功能進行一些研究。 – nigong 2012-07-17 20:51:46

回答

4

我不確定C或C++語言標準是否提到了指令;你可以設想運行一個C程序,編譯成由一大羣人類奴隸執行(但即使標準符合,這也是不道德的)。你可以用鉛筆和紙自己運行一個簡單的小程序,你可以使用C解釋器等等......

一個優化的C或C++編譯器也可以將一些C語句翻譯成幾個機器指令位於不同的地方(尤其是編譯器可以執行內聯或克隆功能甚至是基本塊,甚至在源代碼中沒有任何inline關鍵字)。

在大多數系統上,你可能需要處理代碼(例如在彙編中)一個例程,它返回一個指針值作爲其返回地址(即調用者的地址)。

使用GCC(以及兼容的編譯器,可能是Clang/LLVM),您可以使用__builtin_return_address和相關的內置函數。

Linux上的Gnu Libc爲您提供backtrace(但是當我嘗試時,我已經被它激活了)。

注意與-fno-frame-pointer

編譯時,這些技巧可能無法正常工作,您也可以考慮定製GCC例如插件或MELT擴展(MELT是一種領域特定的語言,作爲GCC的GPLv3插件實現,比使用C編碼的插件更容易擴展GCC)。您定製的GCC可能會在適當的地方插入調用儀器功能。

+0

嗨巴西爾,謝謝你的回答。但我不是故意說出指示和聲明的關係。我想要做的只是獲取C/C++語句或指令的地址。 :) – nigong 2012-07-17 20:59:19

+1

@nigong他基本上說甚至可能根本就沒有指示。特別是如果它由奴隸而不是CPU來運行的話。 – Mysticial 2012-07-17 21:03:31

+1

如果'指令'和'語句'有相似的概念,這可能是可行的。但是,大多數語句會生成多條指令,這些指令甚至可能不是連續的(循環結構等),並可能與來自其他語句的指令交錯(優化,指令調度)。 – twalberg 2012-07-17 21:13:13

0

接近指令地址的唯一標準C或C++構造函數指針,我想這不是你的意思。然而,你可以完成你可能用gcc標籤值做的大部分工作,而不是指向包含必要代碼塊的函數的指針。

在C/C++中沒有其他選項。

2

注意:出路在這裏箱子..

你能已鏈接器生成一個包含應用程序對象(功能和數據)的(相對或其他方式)的地址映射文件?你的應用程序可以簡單地解析鏈接器映射文件...

+0

在Linux上,'dladdr'爲你做了這個 - 參見''和'dlopen'),或者至少有很大的幫助。 – 2012-07-17 21:15:11