c语言 - dlopen:是否有可能捕获未解析的符号,"manually"它们发生时解析它们?



是否有可能在未解析的符号引用发生时捕获它们,以便调用一个函数来尝试根据需要解析符号?或者是否可以在运行时向动态符号表添加新符号,而无需创建库文件并打开它?我在GNU/Linux上,使用GCC。(可移植性到其他unix系统会很好,但不是关键问题。)

提前感谢!

编辑:我应该给出更多的细节,我正在努力做什么。我想为一种编程语言写一个解释器,它应该同时支持编译模块(开放模块)和解释模块。我希望从编译模块到其他地方定义的函数的调用由链接器解析,以避免在每次调用时查找函数,但是对解释代码的调用将无法解析。我想捕获这些调用,以便在需要时调用适当的解释函数(或者在函数不存在时发出错误信号)。

如果您知道缺少哪些符号,您可以用它们编写一个库,并在应用程序执行之前LD_PRELOAD它。

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

同样,你可以使用gdb注入新的"代码"到应用程序中,使函数指向你所需要的。

最后,您还可以覆盖一些ld.so函数来检测缺失的符号,并对它们做一些处理。

但无论如何,如果你能解释你想要实现的目标,那么提供一个合适的解决方案就会更容易。

我做了一个大胆的猜测,你试图解决的问题是你的dlopen和开始使用可加载模块的情况下,然后突然崩溃由于无法解决的符号。如果是这样,这是延迟绑定的结果,您可以通过在环境中导出LD_BIND_NOW=1(或任何值,只要设置了它)来禁用它。这将确保在dlopen返回之前可以解析所有符号,如果不能,dlopen操作将失败,让您优雅地处理这种情况。

最新更新