2010-08-24 19 views
1

我有一個ANSI C程序,它使用dlopen()傳遞RTLD_LAZY動態加載.so文件。我收到dlerror:FreeBSD 7.2上未定義的符號「_nss_cache_cycle_prevention_function」

Undefined symbol "_nss_cache_cycle_prevention_function" 

在FreeBSD 7.2中訪問.so文件時發出警告。 nss_cache_cycle_prevention_function()不是我程序的函數之一,我想必須來自FreeBSD。這也可能是Linux上的一個問題,雖然我沒有遇到這個問題。我不想將FreeBSD特定的頭文件加載到我的程序中。我想要以便攜的方式包含這個功能或者抑制這些警告。

回答

3

你是說「我收到警告」是什麼意思?你的程序 檢查dlerror()返回的值,如果它不是NULL,則打印它?

_nss_cache_cycle_prevention_function是一個標記符號,由FreeBSD使用nsdispatch(3)來確定是否使用名稱服務緩存守護進程nscd(8)的服務。它在 可執行文件或共享庫中不存在是非常正常的。

但是當nsdispatch(3)執行dlsym(3),並且找不到該符號時,將會設置該錯誤。並且dlerror(3)返回最後錯誤的描述,而不是最後錯誤的描述調用。我懷疑這就是你打的。

解決方案(相當便攜式)將是:

  • dlopen(3),用dlerror(),看看是否有一個錯誤在所有前檢查它的返回值;
  • dlsym(3),因爲NULL是一個有效的返回值, 調用dlsym(3)之前調用dlerror()在無效的情況下;這將清除以前的任何錯誤,以便第二次致電dlerror(3)時返回的任何內容都可以被信任。

通常,在任何其他dl *調用之前調用空的dlerror()都不會造成任何損害。

+0

是的,我的程序在調用dlsym()之後將任何非NULL dlerror()返回值吐出到日誌中。在我調用dlsym()之前,我做了你所說的並調用了dlerror(),並且未定義的符號警告消失了!謝謝。 – 2010-08-31 19:51:55