1

我有一个 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 特定的头文件加载到我的程序中。我想以可移植的方式包含此功能或禁止显示这些警告。

4

1 回答 1

3

你说“我收到警告”是什么意思?您的程序是否检查返回的值dlerror()并在它不为 NULL 时打印它?

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

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

解决方案(非常便携)将是:

  • for dlopen(3),在使用前检查它的返回值dlerror(),看看是否有错误;
  • 因为是一个有效的返回值,dlsym(3)所以在调用;之前在 void 上下文中调用 这将清除任何先前的错误,以便以后第二次调用返回的任何内容都可以信任。NULLdlerror()dlsym(3)dlerror(3)

一般来说,dlerror()在任何其他 dl* 调用之前调用 empty 不会有任何损害。

于 2010-08-30T22:18:56.997 回答