我可以使用dlopen()和RTLD_NOW延迟加载共享库。但是一旦动态加载库,我仍然需要使用dlsym单独加载每个符号。
由于我的库包含大量API,因此我不想为所有这些API调用dlsym。有没有办法让API与正常的加载时链接一样工作(你只需要调用API而不需要dlsym)?
答案 0 :(得分:1)
您可能正在寻找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 :(得分:0)
正如here所解释的那样,你可以有一个插件,它包含一个attribute(constructor)
函数,将许多插件函数注册到主程序提供的某些全局数据结构中(因为 constructors of插件在插件的dlopen
时间调用。所以你可以dlopen
- 编辑一个插件,甚至不用dlsym
一次来检索和使用(很多)插件函数。
我需要使用dlsym单独加载每个符号。
错误。 dlsym
按其符号(或名称)查找函数(或数据)。该函数已经在这里(因为插件的整个代码段被dlopen
)添加到您的虚拟地址空间中。
答案 2 :(得分:0)
可能不再相关但仍然 - 您正在寻找Windows DLL导入库的模拟,这些库将为您的代码提供看似普通函数的存根,但在内部调用dlopen
和dlsym
。
Linux不提供开箱即用的导入库,但您可以手动生成它们,通过一些自定义脚本或使用Implib.so工具完全自动执行此操作。