我可以从运行时加载的共享对象访问宿主进程的符号吗?任何选择
Can I access to symbols of the host process from a shared object loaded in runtime? Any alternative?
在我的场景中,我想要一个插件,这是一个在运行时加载的共享对象,从"主机应用程序"访问符号,所以我可以添加任何功能到我的应用程序
我已经尝试过了,但没有找到任何方法来做到这一点,我不知道这是否可能。那么,我能不能这样做呢?或者,有没有其他方法可以替代使用插件的应用呢?
我是Fedora 15, Linux 2.6.4。但是,我希望解决方案是跨平台的。
主要有三种方法:
-
从应用程序向DLL传递函数指针结构,允许访问您想要共享的任何符号。这是最便携的方法,但是创建所有的函数指针有点麻烦。比如:
// In shared header struct app_vtable { void (*appFoo)(); }; // In plugin: const app_vtable *vt; void set_vtable(const app_vtable *vt_) { vt = vt_; } void bar() { vt->appFoo(); } // In application: void foo(); const app_vtable vt = { foo }; void loadplugin() { void *plugin = dlopen("plugin.so", RTLD_LAZY); void (*pset_vtable)(const app_vtable *) = dlsym(plugin, "set_vtable"); pset_vtable(&vt); void (*pbar)() = dlsym(plugin, "bar"); pbar(); }
-
将您的应用程序移动到一个库中,并在该库中简单地链接可执行文件并调用其中的入口点。然后,您的插件可以链接相同的库并轻松访问其符号。这也是相当可移植的,但由于需要在主应用程序库中使用与位置无关的代码,可能会导致一些性能损失(尽管在这种情况下,根据您的体系结构,您可能能够使用固定映射)。
- 仅在Linux(以及可能的其他ELF平台)上,您可以使用
-rdynamic
直接从应用程序可执行文件中导出符号。然而,这不是很可移植到其他平台-特别是,这些在Windows上是不等价的。
相关文章:
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 将无符号char*转换为std::istream*C++
- IPC使用多个管道和分支进程来运行Python程序
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 异常属于C++中的线程还是进程
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- WMI检测进程创建事件-c++
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- GDB:运行不带符号的 cpp 进程调试
- 我可以从运行时加载的共享对象访问宿主进程的符号吗?任何选择
- gdb/solaris:当附加到一个进程时,没有加载符号
- 参数列表中带有未包装管道符号|的进程