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

时间:2010-08-24 17:22:45

标签: c freebsd linker-warning

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

Undefined symbol "_nss_cache_cycle_prevention_function"
只要在FreeBSD 7.2中访问.so文件,就会发出

警告。 nss_cache_cycle_prevention_function()不是我程序的功能之一,我想必须来自FreeBSD。这也可能是Linux上的一个问题,虽然我没有遇到那里的问题。我宁愿不将FreeBSD特定的头文件加载到我的程序中。我希望以便携方式包含此功能或抑制这些警告。

1 个答案:

答案 0 :(得分:3)

你是什么意思说“我收到警告”?你的节目吗? 检查dlerror()返回的值,如果它不是NULL,则打印它?

_nss_cache_cycle_prevention_function是一个标记符号,nsdispatch(3)在FreeBSD上用来确定是否使用名称服务缓存守护进程nscd(8)的服务。它不存在于一个完全正常的情况 可执行文件或共享库。

但是当nsdispatch(3)执行dlsym(3)并且找不到符号时,将设置错误。并且dlerror(3)返回 last 错误的描述,而不是最后调用的错误描述。我怀疑那是你要打的。

解决方案(相当便携)将是:

  • for dlopen(3),在使用dlerror()查看是否存在错误之前检查其返回值;
  • 代表dlsym(3),因为NULL是有效的返回值, 在对dlerror()的调用之前,在空间上下文中调用dlsym(3);这将清除任何先前的错误,以便无论第二次调用dlerror(3)稍后返回的内容都可以信任。

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