dlopen相关内容

Dlopen是否会创建多个库实例?

在网上搜索后,似乎找不到答案。 当我第一次使用dlOpen时,它似乎比之后的任何时间都要长,包括如果我从一个程序的多个实例运行它。 dlopen是否将SO加载到内存中一次,并让操作系统保存它,以便任何后续调用(即使是来自程序的另一个实例)都指向内存中的同一位置? 那么基本上,运行库的程序的3个实例是否意味着相同.so的3个实例被加载到内存中,或者内存中只有一个实例? 谢谢 ..
发布时间:2022-06-28 16:09:34 C/C++开发

如何在 Linux 上根据 CPU 能力进行运行时绑定

是否可以让 linux 库(例如“libloader.so")加载另一个库来解析任何外部符号? 我有一大堆代码有条件地编译以支持 SIMD 级别(SSE2、AVX、AVX2).如果构建平台与运行时平台相同,这将正常工作.但它阻碍了跨代处理器的重用. 一个想法是让 executable 调用 function 链接到不直接实现 function 的 libloader.so>.相反,它从 ..
发布时间:2022-01-04 15:42:19 服务器开发

创建包含字符串的静态 C 结构

我正在尝试在 Rust 中创建一个动态库,该库将一个结构导出为一个符号,该符号将通过 dlopen() 加载到 C 程序中. 然而,我在访问结构体中的第二个字符串时遇到了一些段错误,所以我做了一个小测试程序来尝试找出我做错了什么. 这是使用“rustc --crate-type dylib test.rs"编译的 Rust 代码(test.rs): #[repr(C)]pub 结构 ..
发布时间:2021-12-23 17:25:10 其他开发

MatLab 错误:无法使用静态 TLS 打开

几天以来,我在使用 MATLAB 时不断收到相同的错误,该错误在某些时候使用 dlopen 发生.我对 MATLAB 很陌生,这就是为什么我不知道该怎么做.谷歌似乎也没有帮助我.当我尝试制作特征向量时,我得到了这个: 使用 eig 时出错LAPACK 加载错误:dlopen:无法使用静态 TLS 加载更多对象 我在做乘法时也得到了这个: 错误使用 *BLAS 加载错误:dlopen:无法使用 ..
发布时间:2021-12-08 15:13:00 其他开发

构建一个 .so 这也是一个可执行文件

所以大家可能都知道 glibc 的 /lib/libc.so.6 可以像普通的可执行文件一样在 shell 中执行,在这种情况下,它会打印其版本信息并退出.这是通过在 .so 中定义入口点来完成的.在某些情况下,将其用于其他项目也可能很有趣.不幸的是,您可以通过 ld 的 -e 选项设置的低级入口点有点太低级了:动态加载器不可用,因此您无法调用任何适当的库函数.由于这个原因,glibc 在这个入口 ..
发布时间:2021-12-03 13:18:34 服务器开发

如何从 C++ 调用动态库函数?

目前我正在创建某种插件系统.我的程序编写代码,然后编译(另见我的 其他 问题).然后使用 dlopen 再次打开生成的(编译的)库.这允许人们自己在程序中编写自定义函数. //在指定路径打开编译好的库void* handle = dlopen("COMPILEDLIBRARYPATH", RTLD_LAZY);如果(句柄 == NULL){std::cout ..
发布时间:2021-07-23 20:21:35 C/C++开发

无法使用 dlsym 获取统计信息

我正在尝试为 stat/lstat/fstat 编写一个钩子,但我似乎无法从dlsym.我正在使用以下代码获取原始指针. orig_stat = dlsym(RTLD_NEXT, "stat");orig_lstat = dlsym(RTLD_NEXT, "lstat");orig_fstat = dlsym(RTLD_NEXT, "fstat"); 然而,所有三个变量都设置为 null 并且 ..
发布时间:2021-07-23 20:20:58 其他开发

接收“未定义符号"使用 dlopen 加载库时出错

我正在编写一些使用动态共享库作为插件的代码. 我用于构建共享库的命令行如下所示: cc -shared -fPIC -o module.so -g -Wall module.c 在模块中,我可以调用已加载到主可执行文件中的任何其他共享库中的函数. 但是,我无法访问(导出)可执行文件本身中的函数(我收到 undefined symbol 错误). 我对 dlopen 的调用如下 ..
发布时间:2021-07-23 20:17:43 其他开发

主程序和共享库在 __static_initialization_and_destruction_0 中初始化相同的静态变量

有谁知道为什么在 dlopen() 中初始化的库会初始化主程序拥有的静态变量.主程序和共享库都有静态变量的副本,但是由于某种原因共享库重新初始化了主程序的静态变量副本并销毁,导致主程序试图销毁时出现段错误. 这是符号表中的错误名称修改的情况吗? 解决方案 在这种情况下,运行时链接器只需要进程中符号的单个活动副本.如果共享对象和可执行文件都有该符号的副本,则运行时链接程序将解析对其中之 ..

几个共享对象使用相同的 proto 导致错误:文件已存在于数据库中

与 protobuf3 相关的错误 我有一个项目,它有一个 C++ 可执行核心和几个称为插件的共享对象(.so、.dll).当核心启动时,它将使用 dlopen 加载这些插件.核心和插件使用 protobuf 作为通信协议,因此他们必须将生成的 .pb.cc 和 .ph.h 文件编译成他们的二进制文件,以获得串行器/解串器.并且 libprotobuf.so 链接到核心和插件.当我启动核心时 ..
发布时间:2021-06-22 19:53:19 C/C++开发

Mac上的RTLD_FIRST是否可以在Linux上执行RTLD_DEEP_BIND的工作?

我对Linux上的RTLD_DEEP_BIND的理解是,如果您的主程序中有一个函数A(),并且在动态链接库(称为lib)中有两个函数A()和B(),其中B定义为: B(){一种();} 然后,对B()的调用将总是最终从库中调用A.这是RTLD_FIRST在Mac上执行的工作吗?抱歉-我对文档感到困惑. 解决方案 RTLD_DEEPBIND 似乎是OS X上的默认设置.默认.(您可以在 ..
发布时间:2021-05-31 19:01:44 其他开发

带有两个共享库的dlopen,可导出符号

我有一个Linux共享库foo.so,它使用 dlopen("foo.so",RTLD_NOW | RTLD_LOCAL)从可执行文件加载.我想从foo.so中打开另一个库bar.so,该库引用foo.so中定义的符号,但是链接程序无法找到它们.我无法将RTLD_LOCAL更改为RTLD_GLOBAL,因为我没有可执行文件的源进行加载.我认为在链接foo.so时 -Wl,-export-dynam ..
发布时间:2021-05-29 23:15:27 服务器开发

Linux共享库取决于dlopen使用RTLD_LOCAL打开的另一个共享库中的符号

我有一个共享库 libmain.so ,由宿主程序使用 dlopen("libmain.so",RTLD_LOCAL)加载,在某些情况下, libmain.so 将同时使用 dlopen 加载另一个共享库 libpatch.so .问题是 libpatch.so取决于libmain.so中的符号,那么我该如何解决呢? 由于权限原因,不能将 RTLD_LOCAL 更改为 RTLD_GLOBAL ..
发布时间:2021-05-29 23:11:57 服务器开发

dlopen()搜索路径

是否可以通过编程方式找出dlopen()为共享对象搜索的路径?我一直以为dlopen()只会出现在/lib和/usr/lib中,但是现在我已经看到在Linux Mint上,几个核心组件(如libglib-2.0.so)位于完全不同的文件夹中,即/rofs/lib/中.i386-gnu-linux和其他一些.有没有办法了解dlopen()将搜索共享对象的所有这些路径?我已经检查了环境变量LD_LIB ..
发布时间:2021-05-29 22:42:09 服务器开发

如何规避dlopen()缓存?

根据其手册页,dlopen()不会两次加载同一个库: 如果使用dlopen()再次加载相同的共享对象,则相同返回对象句柄.动态链接器维护参考计数对象句柄,因此动态加载的共享对象是在多次调用dlclose()之前,不会释放它因为dlopen()已成功完成.任何初始化返回(请参阅下面)仅被调用一次.但是,随后的dlopen()调用使用RTLD_NOW加载同一共享库的对象可能会强制符号早期加载RT ..
发布时间:2021-05-29 21:27:50 其他开发

Solaris进程如何读取自己的符号表?

我有一个Solaris进程,它是一个由 ld 加载并带有一些 .so 库的C ++应用程序.此应用程序具有一个函数,该函数在调用函数中获取返回地址,然后尝试确定所述调用函数的名称. 如果我为此使用 dladdr(3),它并不总是将我希望看到的内容放在Dl_info :: dli_sname中.看起来它返回的函数名称不是最接近指针值下方或指针值处.如果我获取指针值并查看 nm 的输出,则可以将 ..
发布时间:2021-05-29 20:04:16 C/C++开发

iOS 10中沙箱中的dlopen()被阻止

我正在使用dlopen()从文档目录中加载动态框架,它在iOS10下运行良好,但是在iOS10中不再运行,控制台的日志为: 文件系统沙箱阻止了'/var/mobile/Containers/Data/Application/71EB4588-A83F-4AF0-9409-DD09AFB2CA77/Documents/MyDylib.framework/MyDylib'的mmap() 我该如何 ..
发布时间:2021-05-17 18:31:26 其他开发