我可以使用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更加费力的问题。
正如这里所解释的,你可以有一个插件,它包含一个attribute(constructor)
函数,将许多插件函数注册到主程序提供的全局数据结构中(因为插件的构造函数在插件的dlopen
时间被调用)。 所以你可以有一个插件,甚至不使用dlsym
一次来检索和使用(很多)插件功能。
我需要使用dlsym来单独加载每个符号。
错误。 dlsym
通过符号(或名称) 查找函数(或数据)。 该函数已经在这里了(因为插件的整个代码段被dlopen
添加到你的虚拟地址空间中)。
可靠性不再相关,但仍然 – 您正在寻找Windows DLL导入库的模拟,这将提供看起来像您的代码正常功能的存根(stub),但在内部调用dlopen
和dlsym
。
Linux不提供导入库,但可以通过一些自定义脚本手工生成,或者使用Implib.so工具完全自动完成。