2013-02-03 56 views
1

我有一個專門的共享庫,在執行可執行文件期間動態加載。該庫提供了功能b()。這個函數又調用一個函數a()將dyld鏈接到可執行文件本身的函數?

a函數是在可執行文件中定義的,而不是庫本身,所以我希望能夠從庫中調用我的一些可執行代碼。我已經成功地使用-undefined dynamic_lookup標誌,使鐺離開這些符號延遲綁定,但是當我嘗試運行可執行dyld的仍然抱怨:

dyld: lazy symbol binding failed: Symbol not found: _a 
    Referenced from: /usr/local/lib/myLib.dylib 
    Expected in: flat namespace 

我怎樣才能得到這個符號鏈接?

+0

爲什麼不''dlopen()'可執行文件和'dlsym()'函數?我不認爲目前的做法是可行的。 – 2013-02-03 10:01:28

+0

@ H2CO3我已經在加載庫了。我的目標是然後能夠調用駐留在加載庫的可執行文件中的函數。 –

+0

再次閱讀我的評論。 「爲什麼不'dlopen()**可執行文件**?」 – 2013-02-03 10:03:04

回答

0

事實證明,這是由Xcode默認導出符號導致的。您可以通過更改LLVM代碼生成構建設置下的「默認隱藏符號」選項來解決此問題。如果您不使用Xcode,則會控制是否在命令行上使用-fvisiblity=hidden標誌。

或者,您可以將此選項打開並通過將__attribute__((visibility("default")))屬性添加到要導出的函數來選擇性地導出符號。

相關問題