dlerror:FreeBSD 7.2上未定义的符号“_nss_cache_cycle_prevention_function”

我有一个ANSI C程序,使用传递RTLD_LAZY的dlopen()动态加载.so文件。 我收到

Undefined symbol "_nss_cache_cycle_prevention_function" 

在FreeBSD 7.2中访问.so文件时发出警告。 nss_cache_cycle_prevention_function()不是我程序的function之一,我想必须来自FreeBSD。 这也可能是Linux上的问题,尽管我没有遇到问题。 我宁愿不将FreeBSD特定的头文件加载到我的程序中。 我想以便携方式包含此function或抑制这些警告。

你是什​​么意思说“我收到警告”? 你的程序是否检查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) 之前调用void上下文中的dlerror() dlsym(3) ; 这将清除任何先前的错误,以便无论第二次调用dlerror(3)以后返回的内容都可以信任。

通常,在任何其他dl *调用之前调用空的dlerror()不会有任何损害。