C / GCC:dlopen()而不需要dlsym()

我可以使用dlopen()和RTLD_NOW来延迟加载共享库。 但是,一旦库dynamic加载,仍然需要使用dlsym来单独加载每个符号。

由于我的库包含大量的API,所以我不想为它们调用dlsym。 有没有办法使API的工作方式与正常的加载时间链接相同(只需调用API而不需要dlsym)?

您可能正在寻找RTLD_GLOBAL。

从您链接到[1]的页面:

 RTLD_GLOBAL The symbols defined by this library will be made available for symbol resolution of subsequently loaded libraries. 

通过使用这个,你应该可以在你的API周围创建一个不需要使用dlsym()的“包装器”库,并以这种方式减少所需的dlsym()调用总数。 这当然引发了维护一个包装库比清理API更加费力的问题。

[1] http://man7.org/linux/man-pages/man3/dlsym.3.html

正如这里所解释的,你可以有一个插件,它包含一个attribute(constructor)函数,将许多插件函数注册到主程序提供的全局数据结构中(因为插件的构造函数在插件的dlopen时间被调用)。 所以你可以有一个插件,甚至不使用dlsym一次来检索和使用(很多)插件功能。

我需要使用dlsym来单独加载每个符号。

错误。 dlsym通过符号(或名称) 查找函数(或数据)。 该函数已经在这里了(因为插件的整个代码段被dlopen添加到你的虚拟地址空间中)。

可靠性不再相关,但仍然 – 您正在寻找Windows DLL导入库的模拟,这将提供看起来像您的代码正常功能的存根(stub),但在内部调用dlopendlsym

Linux不提供导入库,但可以通过一些自定义脚本手工生成,或者使用Implib.so工具完全自动完成。