dlopen:是否可以捕捉未解析的符号,“手动”解决它们发生的问题?

问题描述:

是否有可能在发生时捕获未解析的符号引用,以便调用函数以尝试根据需要解析符号?或者是否有可能在运行时将新符号添加到动态符号表中,而不创建库文件并将其删除?我在GNU/Linux上使用GCC。 (移植到其它Unix系统将是很好的,但不是关键问题。)提前dlopen:是否可以捕捉未解析的符号,“手动”解决它们发生的问题?

谢谢!

编辑:我应该给我更多的细节,我正在尝试做什么。我想为编程语言编写一个解释器,预计它将支持编译(dlopen)和解释模块。我想要从编译模块调用其他地方定义的函数,以便由链接器解析,以避免在每次调用时查找该函数,但对解释代码的调用将不会解决。我想要捕获这些调用,以便在需要时调用相应的解释函数(或者如果函数不存在,则发出错误信号)。

+1

你能解释一下你实际上想要完成什么,以及现在你有什么不工作? –

+0

你甚至得到未解决的符号引用?如果您使用的是dlfcn.h,如果找不到所需的符号,则dlsym()将返回NULL,因此您可以使用它? – Electro

+0

有趣的问题。如果你澄清你想要完成的事情,我肯定会给它+1。 –

如果你知道符号缺什么,你可以写一个库只是他们,并在申请前执行LD_PRELOAD它。

如果您没有缺失的符号列表,您可以通过在二进制文件上使用'nm'或'objdump'来发现它们,并在此基础上编写一个脚本,它将构建在应用程序执行前存在缺少符号的库,然后LD_PRELOAD。

此外,您可以使用gdb来注入新的“代码”到应用程序,使得功能指向你所需要的。

最后,您还可以覆盖一些ld.so功能检测缺少的符号,和他们做一些事。

但在任何情况下,如果你能解释一下你正在试图完成的任务,这将是更方便地提供一个妥善的解决办法。

+0

已编辑的问题。重写ld.so看起来像是重魔,但可能会奏效;我稍后会看看。谢谢您的帮助! –

我在猜测你试图解决的问题是你的问题dlopen并开始使用可加载模块,然后由于未解析的符号而突然崩溃。如果是这样,这是懒结合的结果,您可以通过(只要它的设置或值)环境中的出口LD_BIND_NOW=1禁用它。这将确保所有符号可以在dlopen返回前解析,如果有的话不能,dlopen操作将失败,让您适度地处理这种情况。

+0

我编辑了这个问题,以添加更多关于我想要做的事情的信息。如果我可以通过即时创建缺失的符号来“优雅地处理这种情况”,这就解决了这个问题。 –

+0

我明白你想要什么。这绝对没有办法做到这一点可移植。你为什么要尝试使用本地C/asm级别的符号作为高级语言?如果你使用了自己的符号解析和绑定系统,你就没有问题。 –

+0

我认为使用现有的链接器机制会比使用自己的链接器更简单。但似乎这是要走的路......感谢您的帮助! –