2010-08-24 60 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