动态库搜索¶
本节介绍 NSPR 加载、卸载和解析动态库中符号的编程接口。它还提供了一种方法,用于调整静态链接代码的符号,使其对其他客户端看起来像是动态加载的。
库链接类型¶
这些数据类型被定义用于动态库链接
库链接函数¶
库链接函数包括:
查找主可执行程序中定义的符号¶
PR_LoadLibrary 无法打开引用主可执行程序的句柄。(这确实是一个应该修复的遗漏。)但是,可以通过以下方式查找在主可执行程序中定义的符号。
PRLibrary *lib;
void *funcPtr;
funcPtr = PR_FindSymbolAndLibrary("FunctionName", &lib);
当 PR_FindSymbolAndLibrary 返回时,funcPtr
是您要查找的函数指针的值,变量 lib 引用主可执行程序。然后,您可以对 lib 调用 PR_FindSymbol 以查找在主程序中定义的其他符号。请记住,在完成操作后,调用 PR_UnloadLibrary(lib)
关闭库句柄。
平台说明¶
要在某些平台上使用动态库加载函数,必须在运行时设置某些环境变量,并且您可能需要使用特殊的链接器选项来链接您的可执行程序。
本节总结了这些平台的特性。有关更多信息,请参阅 Unix 的 ld
和 dlopen
(或 HP-UX 上的 shl_load
)的手册页,以及 Win32 的 LoadLibrary
文档。
动态库搜索路径¶
动态库搜索路径是在其中查找动态库的目录列表。每个平台都有自己的标准目录,用于查找动态库,以及由环境变量指定的可自定义的目录列表。
在大多数 Unix 系统上,此环境变量是
LD_LIBRARY_PATH
。这些系统通常使用dlopen
加载动态库。HP-UX 使用
shl_load
加载动态库,指定动态库搜索路径的环境变量是SHLIB_PATH
。此外,可执行程序必须链接 +s 选项,以便在运行时搜索SHLIB_PATH
指定的目录中的共享库。或者,您可以使用chatr
工具将 +s 选项作为后处理步骤启用。例如,在不使用 +s 选项的情况下链接您的可执行程序 a.out,然后执行以下操作
chatr +s enable a.out
在 Rhapsody 上,环境变量是
DYLD_LIBRARY_PATH
。在 Win32 上,环境变量是
PATH
。相同的搜索路径用于搜索可执行程序和 DLL。
从主可执行程序导出符号¶
在某些系统上,主可执行程序中定义的符号默认情况下不会导出。在 HP-UX 上,您必须使用 -E 链接器选项链接可执行程序,以便将主程序中的所有符号导出到共享库。如果您使用 GNU 编译器(在任何平台上),您也必须使用 -E 选项链接可执行程序。