微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

-rdynamic只有select的符号?

场景:

可执行文件在运行时通过dlopen加载共享对象。

共享对象引用了一些实际编译到主可执行文件中的符号(一个函数)。

如果在链接可执行文件时向gcc添加-rdynamic,这工作正常。

如何在Windows中开发一个服务器

编译时未定义的引用'main'

如何在Linux上正确地将networking接口设置为混杂模式

有没有办法来检查哪些顺序符号加载到Linux中的应用程序?

如何在Linux上与.la库文件链接

-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; }

plugin.c,在运行时加载的插件代码

#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] 举报,一经查实,本站将立刻删除。

相关推荐