Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/GCC:dlopen()不需要dlsym()_C_Linux_Gcc_Linker - Fatal编程技术网

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

C/GCC:dlopen()不需要dlsym(),c,linux,gcc,linker,C,Linux,Gcc,Linker,我可以使用dlopen()延迟加载共享库。但一旦库被动态加载,我仍然需要使用dlsym分别加载每个符号 因为我的库包含大量API,所以我不想为所有API调用dlsym。是否有任何方法可以使API以与普通加载时链接相同的方式工作(您只需调用API而不需要dlsym)?您可能正在寻找RTLD\U GLOBAL 从链接到[1]的页面: RTLD_GLOBAL The symbols defined by this library will be made available for

我可以使用dlopen()延迟加载共享库。但一旦库被动态加载,我仍然需要使用dlsym分别加载每个符号


因为我的库包含大量API,所以我不想为所有API调用dlsym。是否有任何方法可以使API以与普通加载时链接相同的方式工作(您只需调用API而不需要dlsym)?

您可能正在寻找RTLD\U 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]

如前所述,您可以拥有一个包含
属性(构造函数)
函数的插件,该函数将许多插件函数注册到主程序提供的一些全局数据结构中(因为插件的构造函数是在插件的
dlopen
时间调用的)。因此,您可以使用
dlopen
-ed插件,而不必使用
dlsym
一次来检索和使用(许多)插件函数

我需要使用dlsym分别加载每个符号


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


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

您的意思是不需要显式调用
dlsym()
?是的,我只需要动态加载库。来自应用程序的API调用将正常工作——我不想重写代码,使每个API都包含dlsym()。我将其取消标记为重复,因为Linux的共享库语义与Windows的共享库语义完全不同;在Windows上可能的东西在Linux上不一定是可能的,反之亦然。(对于好奇的人来说,可执行图像格式和可执行图像格式之间的区别在于控制什么。)这是一个几乎重复的问题的答案