有没有办法从 ELF 中提取符号,并使用 LD 将另一个文件与之前 ELF 中定义的符号链接在一起?

Posted

技术标签:

【中文标题】有没有办法从 ELF 中提取符号,并使用 LD 将另一个文件与之前 ELF 中定义的符号链接在一起?【英文标题】:Is there a way to extract the symbols from a ELF, and use LD to link another file together with the symbols defined in the previous ELF? 【发布时间】:2014-05-03 02:45:58 【问题描述】:

我正在使用 devKitPro 专门为 Nintendo Wii 创建一个应用程序。我想通过提供加载通过 objcopy -O 二进制文件传递的代码的能力来使我的应用程序模块化。我的问题是,我希望模块能够使用加载到内存中的主 ELF 中的符号。我尝试了各种方法,但没有提出任何解决方案。

我尝试使用 -Map,因为我认为这可以让我使用链接器映射,但这个想法失败了。

我也尝试编译到共享库中,但这对我不起作用,因为链接器抱怨“具有动态重定位的只读段”。

我真的需要这方面的帮助,因为我既不在 Windows 也不在 Linux 环境中。

【问题讨论】:

*nix 上的“nm”实用程序可用于列出 ELF 文件中的符号(及其类型)。 也许你应该发布这个问题的答案? 正如 Mahonri 所说,您应该发布问题的答案,最好附上样本。对其他人来说根本不是一件麻烦事,关于 Wii 的问题并不多,也许这对尝试做和你一样的人有用。 请发布您的完整解决方案和答案 - 我们希望您分享您学到的知识作为其他人的答案。 【参考方案1】:

您可以考虑使用libdl 来执行此操作,该libdl 正是为了在运行时按名称加载符号。使用libdl,您可以获得作为初始化子例程一部分调用的所有函数的句柄,然后在您的程序需要它们时让它们可供您使用。最重要的是,您不需要在编译时拥有要链接的库,因此您可以将其替换为任何定义了这些符号的精灵,而无需重新编译。

【讨论】:

以上是关于有没有办法从 ELF 中提取符号,并使用 LD 将另一个文件与之前 ELF 中定义的符号链接在一起?的主要内容,如果未能解决你的问题,请参考以下文章

使用 GNU ld 链接器脚本包含二进制文件

安装软件报错:/lib/ld-linux.so.2: bad ELF interpreter

解决linux安装软件:/lib/ld-linux.so.2: bad ELF interpreter问题

将 16 位实模式代码链接到符合 Multiboot 的 ELF 可执行文件时出现 LD 错误

链接器会将哪些类型的符号放入可执行的 ELF 中?

“/usr/bin/javac: /lib/ld-linux.so.2: 错误的 ELF 解释器:没有这样的文件或目录”