2014-09-19 23 views
4

我正在爲我的應用程序編寫性能分析工具,並使用dladdr將函數指針轉換爲名稱。只要一切正常工作作爲即時通訊的調試,但只要我在釋放編譯(使用的XCode 5.1)的所有名稱轉換失敗並返回NULL例如:在版本中使用dladdr

#include <dlfcn.h> 
int main(int argc, char **argv) 
{ 
    Dl_info info; 

    if(dladdr(main, &info) != 0) 
    { fprintf(stderr, "%s\n", info.dli_sname); } 

我想,我傳遞給C多編譯器標誌/ C++標誌:-export-dynamic -fPIC以及-Wl, - export-dynamic什麼都不起作用......有沒有一種方法可以繼續編譯優化並保留函數地址 - > dladdr的名稱轉換功能?

+1

您是否嘗試過加入-rdynamic作爲一個連接器選項? – 2014-09-19 03:23:12

+1

Arrgg ...就是這樣!我試過-rdynamic,但我把它放在C/C++標誌中,而不是連接器... – McBob 2014-09-19 03:40:00

+0

這樣做!我已經將我的信息作爲正式答案。 – 2014-09-19 03:45:42

回答

6

clang和gcc支持-rdynamic選項作爲鏈接器選項。這應該能夠讓dladdr在發佈模式下按預期運行。 -rdynamic定義爲:

-rdynamic 傳遞標誌-export動態的ELF鏈接器,支持它的目標。這指示鏈接器將所有符號(不僅是已使用的符號)添加到動態符號表中。該選項對於dlopen的一些用途或允許從程序內獲取回溯是必需的。海合會連接選項

的更多信息,可以發現here

+0

OP聲稱嘗試了類似的東西,但我認爲該選項被錯誤傳遞。 – 2014-09-19 05:16:26

+0

正確,OP將它作爲* compiler *選項傳遞。我對他的帖子的第一個評論是嘗試-rdyanmic作爲*鏈接器*選項。我認爲那是OP在他在錯誤的地方完成了國旗的線索。 – 2014-09-19 05:20:23

相關問題