我有一个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特定的头文件加载到我的程序中。我希望以便携方式包含此功能或抑制这些警告。
答案 0 :(得分:3)
你是什么意思说“我收到警告”?你的节目吗?
检查dlerror()
返回的值,如果它不是NULL,则打印它?
_nss_cache_cycle_prevention_function
是一个标记符号,nsdispatch(3)
在FreeBSD上用来确定是否使用名称服务缓存守护进程nscd(8)
的服务。它不存在于一个完全正常的情况
可执行文件或共享库。
但是当nsdispatch(3)
执行dlsym(3)
并且找不到符号时,将设置错误。并且dlerror(3)
返回 last 错误的描述,而不是最后调用的错误描述。我怀疑那是你要打的。
解决方案(相当便携)将是:
dlopen(3)
,在使用dlerror()
查看是否存在错误之前检查其返回值; dlsym(3)
,因为NULL
是有效的返回值,
在对dlerror()
的调用之前,在空间上下文中调用dlsym(3)
;这将清除任何先前的错误,以便无论第二次调用dlerror(3)
稍后返回的内容都可以信任。通常,在任何其他dl *调用之前调用空dlerror()
不会有任何损害。