场景:
可执行文件在运行时通过dlopen加载共享对象。
共享对象引用了一些实际编译到主可执行文件中的符号(一个函数)。
如果在链接可执行文件时向gcc添加-rdynamic,这工作正常。
如何在Windows中开发一个服务器
编译时未定义的引用'main'
如何在Linux上正确地将networking接口设置为混杂模式
有没有办法来检查哪些顺序符号加载到Linux中的应用程序?
-rdynamic导出可执行文件的所有非静态符号。 我的共享对象只需要一些select。
问题:有没有办法实现-rdynamic的效果,但是限制了我所知道的共享对象所需的less数select符号?
编辑:
至less有两个人误解了这个问题,所以我试图澄清一下:
这个问题不是从dynamic库中导出符号。
这是一个最小的例子:
func.h,通用的头文件
#include <stdio.h> void func(void);
main.c,主要可执行代码:
#include <dlfcn.h> #include "func.h" // this function is later called by plugin void func(void) { printf("funcn"); } int main() { void * plugin_lib = dlopen("./plugin.so",RTLD_Now); printf("dlopen -> %p,error: %sn",plugin_lib,dlerror()); // find and call function "plugin" in plugin.so void (*p)(void); // declares p as pointer to function p = dlsym(plugin_lib,"plugin"); p(); return 0; }
#include "func.h" void plugin() { printf("pluginn"); func(); }
如果我编译
$ gcc -o main main.c -ldl $ gcc -shared -fPIC -o plugin.so plugin.c
然后plugin.so不能被加载,因为它引用了无法parsing的符号func:
$ ./main dlopen -> (nil),error: ./plugin.so: undefined symbol: func Segmentation fault (core dumped)
我可以通过使用-rdynamic编译来说服主要的可执行文件导出所有的全局符号:
$ gcc -rdynamic -o main main.c -ldl $ ./main dlopen -> 0x75e030,error: (null) plugin func
但是,这将不必要地用所有符号填充dynamic符号表。
(这个dynamic符号表可以用nm -D main来检查。)
问题是,我怎样才能将“func”添加到主可执行文件的dynamic符号表中,而不是所有的东西。
在std :: istream上的Windows IStream接口
exception错误对话框
LabVIEW Linux C ++开发 – 初学者的问题
内存分配如何在极端情况下工作?
从C#运行一个FTP命令batch file
你可以用GCC的visibility属性来做。
声明你需要用__attribute__ ((visibility ("default")))标志导出的函数。 然后编译你的整个库传递-fvisibility=hidden参数到GCC。
有关此方面的完整说明,请参阅以下GCC文档页面 。
不幸的是,这对于可执行文件来说很难实现。 您需要生成要导出的符号列表,然后向LDFLAGS添加-Wl,--dynamic-list=symfile.txt 。
下面是在Clang中完成的例子 ( 这里是他们用来生成符号文件的脚本)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。