草庐IT

c - dlopen:是否可以捕获未解析的符号, "manually"在它们发生时解析它们?

是否可以在未解析的符号引用发生时捕获它们,以便调用一个函数来尝试根据需要解析符号?或者是否可以在运行时向动态符号表添加新符号而不创建库文件并打开它?我在GNU/Linux上,使用GCC。(对其他Unix的可移植性会很好,但这不是关键问题。)提前致谢!编辑:我应该更详细地说明我正在尝试做什么。我想为一种编程语言编写一个解释器,它应该支持编译的(dlopen'ed)和解释的模块。我希望从已编译模块调用在别处定义的函数由链接器解析,以避免在每次调用时查找函数,但对解释代码的调用将无法解析。我想捕获这些调用,以便我可以在需要时调用适当的解释函数(或者如果该函数不存在则发出错误信号)。

linux - Linux 上的 GetModuleHandle(NULL)

有没有办法在Linux上通过GetModuleHandle(NULL)将该句柄传递给dlsym3 最佳答案 documentation对于dlopen(3)状态:Thefunctiondlopen()loadsthedynamiclibraryfilenamedbythenull-terminatedstringfilenameandreturnsanopaque"handle"forthedynamiclibrary.IffilenameisNULL,thenthereturnedhandleisforthemainprogram

linux - Linux 上的 GetModuleHandle(NULL)

有没有办法在Linux上通过GetModuleHandle(NULL)将该句柄传递给dlsym3 最佳答案 documentation对于dlopen(3)状态:Thefunctiondlopen()loadsthedynamiclibraryfilenamedbythenull-terminatedstringfilenameandreturnsanopaque"handle"forthedynamiclibrary.IffilenameisNULL,thenthereturnedhandleisforthemainprogram

c++ - Linux dlopen : how to make loading lib manager

我用不同的arch选项编译了相同的代码(FMV不起作用,因为函数返回sse,我无法将“默认”更改为带有sse的东西)我如何制作一个在加载时检查cpu能力并加载相应库的元库?(没有任何dlsym机器)? 最佳答案 实现您想要的方法的一种方法是链接虚拟包装库,该库在启动时检查CPU功能,加载匹配的共享库,然后将所有函数调用转发到该共享库中的实现。此类虚拟库可以手动实现或通过自定义脚本生成。或者你可以使用Implib.so自动生成:$implib-gen.py--dlopen-callback=load_mylibmylib_avx.so

c++ - Linux dlopen : how to make loading lib manager

我用不同的arch选项编译了相同的代码(FMV不起作用,因为函数返回sse,我无法将“默认”更改为带有sse的东西)我如何制作一个在加载时检查cpu能力并加载相应库的元库?(没有任何dlsym机器)? 最佳答案 实现您想要的方法的一种方法是链接虚拟包装库,该库在启动时检查CPU功能,加载匹配的共享库,然后将所有函数调用转发到该共享库中的实现。此类虚拟库可以手动实现或通过自定义脚本生成。或者你可以使用Implib.so自动生成:$implib-gen.py--dlopen-callback=load_mylibmylib_avx.so

c++ - C++中的重复静态变量初始化

我构建了一个共享库“libMyLibrary.so”,其中包含一个“MyClass”类,其中包含一个“MyClass”类型的静态变量。然后我构建一个可执行文件“MyLibraryTest”,我链接到“libMyLibrary.so”。主程序使用“dlopen”动态加载作为参数给出的“.so”。在构建时,库和可执行文件在一个目录中生成,比如“buildDir/bin”。然后我将库安装到“installDir/lib”,将可执行文件安装到“installDir/bin”(从可执行文件中删除运行时路径)。当我使用LD_LIBRARY_PATH=buildDir运行“buildDir/MyLi

c++ - C++中的重复静态变量初始化

我构建了一个共享库“libMyLibrary.so”,其中包含一个“MyClass”类,其中包含一个“MyClass”类型的静态变量。然后我构建一个可执行文件“MyLibraryTest”,我链接到“libMyLibrary.so”。主程序使用“dlopen”动态加载作为参数给出的“.so”。在构建时,库和可执行文件在一个目录中生成,比如“buildDir/bin”。然后我将库安装到“installDir/lib”,将可执行文件安装到“installDir/bin”(从可执行文件中删除运行时路径)。当我使用LD_LIBRARY_PATH=buildDir运行“buildDir/MyLi

linux - 使用 dlopen() 加载共享库时出错

我正在开发一个在CentOS上使用dlopen加载用户创建的插件的程序。我遇到了一个插件的问题,该插件依赖于也具有依赖性的共享库:libplugin.so->libservices.so->libconfig.so我们的程序首先将依赖项加载到内存中,从依赖项树的叶子开始向上移动到插件,(此示例中省略了错误检查):dlopen("/path_to_plugin/libconfig.so",RTLD_NOW | RTLD_GLOBAL)dlopen("/path_to_plugin/libservices.so",RTLD_NOW | RTLD_GLOBAL)dlopen("/path_t

linux - 使用 dlopen() 加载共享库时出错

我正在开发一个在CentOS上使用dlopen加载用户创建的插件的程序。我遇到了一个插件的问题,该插件依赖于也具有依赖性的共享库:libplugin.so->libservices.so->libconfig.so我们的程序首先将依赖项加载到内存中,从依赖项树的叶子开始向上移动到插件,(此示例中省略了错误检查):dlopen("/path_to_plugin/libconfig.so",RTLD_NOW | RTLD_GLOBAL)dlopen("/path_to_plugin/libservices.so",RTLD_NOW | RTLD_GLOBAL)dlopen("/path_t

c - LD_PRELOAD不会影响RTLD_NOW的dlopen()

如果我直接使用共享库中的函数,即通过在代码中声明该函数并在编译时进行链接,则LD_PRELOAD可以正常工作。但是,如果我使用dlopen()/dlsym(),则LD_PRELOAD无效!问题是我想调试一个使用dlopen()加载某些插件的程序,并且该程序使用绝对文件名,因此仅使用LD_LIBRARY_PATH将无法工作。这是说明问题的示例代码。./libfoo.sovoidfoo(){printf("version1\n");}./preload/libfoo.sovoidfoo(){printf("version2\n");}main.c#include#includevoidfo