4

是否可以在它们发生时捕获未解析的符号引用,以便调用函数以尝试根据需要解析符号?或者是否可以在运行时将新符号添加到动态符号表中,而无需创建库文件并对其进行 dlopen 操作?我在 GNU/Linux 上,使用 GCC。(对其他 Unix 的可移植性会很好,但不是关键问题。)

提前致谢!

编辑:我应该更详细地说明我正在尝试做的事情。我想为一种编程语言编写一个解释器,它预计将支持编译(dlopen'ed)和解释模块。我希望从编译模块到其他地方定义的函数的调用由链接器解析,以避免在每次调用时查找函数,但对解释代码的调用将无法解析。我想捕获这些调用,以便在需要时调用适当的解释函数(或在函数不存在时发出错误信号)。

4

2 回答 2

2

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

于 2011-08-19T03:29:07.220 回答
2

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

如果您没有丢失的符号列表,您可以通过在二进制文件中使用“nm”或“objdump”来发现它们,并在此基础上编写一个脚本,该脚本将使用在应用程序执行之前丢失符号,然后 LD_PRELOAD 它也是如此。

此外,您可以使用 gdb 将新的“代码”注入应用程序,使功能指向您需要的内容。

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

但是无论如何,如果您可以解释您要完成的工作,那么提供适当的解决方案会更容易。

于 2011-08-19T03:10:08.367 回答