将共享对象中的符号解析为可执行文件

Posted

技术标签:

【中文标题】将共享对象中的符号解析为可执行文件【英文标题】:Resolving symbols in shared object to executable 【发布时间】:2014-06-03 12:19:05 【问题描述】:

如何制作一个可执行文件,动态地加载共享对象并将其未定义的符号解析为可执行文件本身?在 Linux 上。

例如共享对象有

extern int a;
void f()  a=1; 

并且可执行文件有

int a;

我想从可执行文件中调用f() 并更改a 的值。

谢谢。

【问题讨论】:

这应该是开箱即用的。你是如何编译你的例子的? @Phillip 不是真的...共享对象 (so.c) 使用 cc so.c -o a.so -shared -fPIC 和可执行文件 (loader.c) cc loader.c -o loader -ldl。使用LD_LIBRARY_PATH=$PWD ./loader 运行。 loader 抱怨“未定义的符号:a”。使用dlopen("a.so", RTLD_NOW) 加载的共享对象。 啊,我忽略了你问题中的动态 【参考方案1】:

来自dlopen 手册页:

使用该库的依赖项列表中的库以及之前使用 RTLD_GLOBAL 标志打开的任何其他库来解析库中的外部引用。如果可执行文件与标志“-rdynamic”(或同义词“--export-dynamic”)链接,则可执行文件中的全局符号也将用于解析动态加载的库中的引用。

因此,使用 -rdynamic 重新编译您的主应用程序应该会有所帮助。

【讨论】:

以上是关于将共享对象中的符号解析为可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

gcov 检测共享对象引用 __gcov_init 隐藏符号

可执行文件 = 可执行文件 python 错误(尝试使用 cx_freeze 将 pygame 转换为可执行文件)

将Python代码导出为可执行文件

将 Pygame 3.5 转换为可执行文件 - Mac

将python程序发布为可执行文件

将Python的.py文件转变为可执行文件.exe