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

时间:2013-09-12 06:33:44

标签: c linux gcc linker

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

由于我的库包含大量API,因此我不想为所有这些API调用dlsym。有没有办法让API与正常的加载时链接一样工作(你只需要调用API而不需要dlsym)?

3 个答案:

答案 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] http://man7.org/linux/man-pages/man3/dlsym.3.html

答案 1 :(得分:0)

正如here所解释的那样,你可以有一个插件,它包含一个attribute(constructor)函数,将许多插件函数注册到主程序提供的某些全局数据结构中(因为 constructors of插件在插件的dlopen时间调用。所以你可以dlopen - 编辑一个插件,甚至不用dlsym一次来检索和使用(很多)插件函数。

  

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

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

答案 2 :(得分:0)

可能不再相关但仍然 - 您正在寻找Windows DLL导入库的模拟,这些库将为您的代码提供看似普通函数的存根,但在内部调用dlopendlsym

Linux不提供开箱即用的导入库,但您可以手动生成它们,通过一些自定义脚本或使用Implib.so工具完全自动执行此操作。