我有一个ANSI程序,它使用传递RTLD_LAZY的dlopen()动态加载.so文件。我收到
Undefined symbol "_nss_cache_cycle_prevention_function"在FreeBSD 7.2中访问.so文件时出现警告。nss_cache_cycle_prevention_function()不是我的程序中的一个函数,我想它一定来自FreeBSD。这在Linux上也可能是一个问题,尽管我在那里没有遇到这个问题。我不希望将FreeBSD特定的头文件加载到我的程序中。我想以一种可移植的方式包含这个函数,或者取消这些警告。
发布于 2010-08-31 06:18:57
你说“我收到警告”是什么意思?您的程序是否检查dlerror()返回的值,如果不为空,则将其打印出来?
_nss_cache_cycle_prevention_function是一个标记符号,FreeBSD上的nsdispatch(3)使用它来确定是否使用名称服务缓存守护程序nscd(8)的服务。它不存在于可执行文件或共享库中是非常正常的。
但是,当nsdispatch(3)执行dlsym(3)时,如果找不到该符号,则会设置错误。并且dlerror(3)返回最后一个错误的描述,而不是最后一个调用的错误的描述。我怀疑这就是你要攻击的东西。
解决方案(非常便携)将是:
对于
dlopen(3),请在使用dlerror()之前检查其返回值,以查看是否存在错误;dlsym(3),由于NULL是有效的返回值,因此在调用<代码>D16之前在无效上下文中调用dlerror();这将清除以前的任何错误,以便以后第二次调用dlerror(3)返回的任何内容都可以信任。一般来说,在任何其他dl*调用之前调用一个空的dlerror()不会有任何坏处。
https://stackoverflow.com/questions/3559147
复制相似问题