是否有可能在发生时捕获未解析的符号引用,以便调用函数以尝试根据需要解析符号?或者是否可以在运行时向动态符号表添加新符号,而无需创建库文件并对其进行操作?我在GNU / Linux上使用GCC。 (对其他Unix的可移植性会很好,但不是关键问题。)
提前致谢!
编辑:我应该详细了解我要做的事情。我想为编程语言编写一个解释器,期望它支持编译(dlopen'ed)和解释模块。我希望从编译模块到其他地方定义的函数的调用由链接器解析,以避免在每次调用时查找函数,但是对解释代码的调用将无法解析。我想捕获这些调用,以便在需要时调用适当的解释函数(如果函数不存在则发出错误信号)。
答案 0 :(得分:2)
如果您知道缺少哪些符号,您可以只使用它们编写库,并在应用程序执行之前使用LD_PRELOAD。
如果你没有丢失的符号列表,你可以在二进制文件上使用'nm'或'objdump'来发现它们,并在此基础上编写一个脚本来构建在应用程序执行之前带有缺失符号的库,然后LD_PRELOAD也是如此。
此外,您可以使用gdb将新的“代码”注入应用程序,使功能指向您所需的内容。
最后,您还可以覆盖一些ld.so函数来检测缺失的符号,并对它们采取一些措施。
但无论如何,如果你能解释一下你想要完成什么,那么提供一个合适的解决方案会更容易。
答案 1 :(得分:2)
我猜测你试图解决的问题是dlopen
并开始使用可加载模块,然后由于未解析的符号而突然崩溃。如果是这样,这是延迟绑定的结果,您可以通过在环境中导出LD_BIND_NOW=1
(或任何值,只要它已设置)来禁用它。这将确保在dlopen
返回之前可以解析所有符号,如果不能,则dlopen
操作将失败,让您可以优雅地处理这种情况。