将共享对象中的符号解析为可执行文件
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 隐藏符号