2011-06-09 32 views
8

我有一個可執行文件和一個動態庫(.so)。該庫導出一些符號和可執行調用成功。但我想讓庫調用可執行文件的功能。我一直試圖做的可執行如下:如何從我的庫中調用可執行文件中的函數?

//test 
extern "C" void print(const char * str) { 
    std::cout << str << std::endl; 
} 

,這在庫:

extern "C" void print(const char *); 

,但是當我在執行調用dlopen(加載庫),它會返回錯誤undefined symbol: print。我該如何解決它?

回答

9

在Linux/ELF中,您可以將-export-dynamic選項傳遞給鏈接器(編譯器驅動程序gcc上的-rdynamic),以便將可執行文件中的符號導出到共享對象。

您的庫中會有一個虛擬的print實現,它會被可執行文件的實現所遮蔽,因爲通常會在共享對象之前搜索可執行文件以進行符號解析。

這有缺點,它不是非常細粒度,你可能會最終覆蓋一些你不打算的符號。該細粒度選項是創建符號的列表導出爲:

{ 
    print; 
    <other symbols> 
}; 

並傳遞給上述連接基團,例如來自gcc:-Wl,--dynamic-list=<file with list of symbols>

+0

@milo:我已經添加了從可執行文件導出符號的更加細緻的方式。 – ninjalj 2011-06-10 19:36:30

+0

非常感謝!我想我最好讀一下「dso howto」,以便在共享對象中獲得更全面的知識。 – milo 2011-06-11 06:14:48

+0

對其他主要平臺的幾句話會很好。 – ManuelSchneid3r 2017-01-10 21:40:20

4

實現此目的的一種更簡單的方法是讓可執行文件註冊一個函數供庫以後使用,函數庫存儲指向該函數的指針,並可以在以後調用它。

相關問題