2015-05-27 50 views
1

我有一些C++代碼,內部使用多個第三方庫。代碼編譯良好,但在執行過程中無法加載某些共享庫(libintbasic.so)。考慮到這種情況,我無法在系統中安裝任何庫,唯一的出路是找到哪個函數調用該庫。我怎麼能找到誰叫這個庫(我的代碼不直接調用這個庫)。如何查找誰在調用共享庫函數?

+1

使用調試器查找導致調用的行。 – user2079303

+1

你可能想要添加「linux」標籤 –

回答

0

刪除鏈接選項-lintbasic,您將在錯誤消息中看到需要此庫的所有函數。這不是乾淨的,但應該可以正常工作。

+0

嗯,那不是我想要做的事情。我想擺脫那些正在調用它的函數。我想找出這些功能。 – ari

+0

我剛剛編輯了我的答案。 – Brahim

1

我不能任何庫安裝到系統中,

這似乎是一個虛假的要求:明確您可以將二進制文件複製到系統中。將其他庫安裝到同一個目錄並不困難。

我怎麼能發現誰在呼叫該庫

有兩種情況考慮:

  1. 二進制文件或庫之一,它直接鏈接到鏈接libintbasic.so。您的二進制文件不會運行
  2. 您的二進制文件或與其直接鏈接的庫之一調用dlopen("libintbasic.so",...),並且在dlopen失敗時失敗。

通過設置LD_DEBUG=files,libs來調試第一個案例通常是最容易的。動態加載器會告訴你哪些庫正在被加載,以及爲什麼需要它們。

調試第二種情況是容易gdb:設置dlopen斷點,並執行每次命中斷點時whereinfo shared命令。