簡體   English   中英

找不到在另一個動態庫中定義的符號

[英]Cannot find symbol which is defined in another dynamic library

我編寫了一個程序(通過dlopen )加載a.so ,並且在a.soa.so dlopen b.so b.so使用在a.so實現的一些功能。 我在運行時收到此錯誤:

symbol lookup error, undefined symbol

nm a.so ,我得到了這個未定義的符號,類型為“ T”。 有人可以幫忙嗎?

您可以在dlopen a.so時使用RTLD_GLOBAL標志,然后a.so定義的符號將可用於后續加載的庫的符號解析。

當使用dlopen()動態加載b.so ,它將不會注意到調用程序可執行文件(或您的共享對象)中的符號。 因此,您將收到“未定義符號”錯誤。 調用層次結構在這里很重要,一旦加載,它就不會成為所有符號的大池。

為了做到實現這一功能,你可以定義在兩個功能b.so ,一個在a.so

  1. 接收回調函數(並保存/注冊)的函數。
  2. 執行回調函數(先前已注冊)的函數。

然后,在a.so您將擁有一個包裝該未定義符號的函數,我們將此函數稱為wrapper() 然后在a.so您將:

  1. 動態加載b.so
  2. b.so調用register函數, b.so其作為參數wrapper() (在a.so定義),因為它需要回調。
  3. b.so執行第二個函數, b.so將調用wrapper()

然后,您首先獲得了所需的內容-執行wrapper() ,而無需從b.so調用a.so定義的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM