objdump 和 objcopy 作为 c/c++ 库

Posted

技术标签:

【中文标题】objdump 和 objcopy 作为 c/c++ 库【英文标题】:objdump and objcopy as a c/c++ library 【发布时间】:2017-05-21 20:46:34 【问题描述】:

我需要在 ELF 上执行 objdump 以获取特定函数和变量的地址和/或大小以及 objcopy 以将其转换为不同的格式以供稍后执行的操作。尤其是第一部分,对objdump 的结果进行的一些操作有点复杂,因此我创建了一个小型 C++ 应用程序来执行该操作。它可以工作,但是它目前直接调用 gcc 的 objdumpobjdopy,包括其参数和 system 调用。

我不喜欢这种方法有多种原因,其中一个主要原因是我要么需要依赖用户在 PC 上拥有它们,要么将它们与我自己的可执行文件一起分发并将其视为一种动态库,但是以可执行文件的形式,我也不喜欢。

我的问题是,是否有某种形式的(gcc?)库可以(最好是静态地)链接以以这种方式执行相同的操作?我真的更愿意使用与 gcc 相近的东西,尤其是在与 gcc 生成的文件作为输入并提供相同输出的兼容性方面,因为我已经拥有我自己的可执行文件的那种版本。

【问题讨论】:

您要解决的实际问题是什么? 为什么你做/需要这个? 所以你基本上想重写objdump/objcpy的部分内容?那你可能想看看libbfd @JesperJuhl 我认为这与讨论无关,但正如你所问的,我想我会回答。这是因为我正在处理一个嵌入式(裸机)项目,该项目需要在启动(或调试)应用程序之前执行一些初始步骤。特别是,我需要将部分二进制文件加载到连接到主 MCU 的外部存储器中。这最容易通过临时放置在 MCU 的 RAM 中的加载程序来完成。但是,加载目标应用程序(到内部和外部存储器)的 PC 需要知道加载器函数的位置,因此 objdump @kaylum 不是真的重写它。我基本上完全按照他们已经在做的事情做,只是不从我的可执行文件中调用外部可执行文件,而是有一个库来执行这些任务(最好完全以相同的方式执行)。 【参考方案1】:

所有这些 obj* 工具都基于 BFD library。如果你看看 objdump 是如何做的并复制它,你应该可以在你自己的代码中做同样的事情。

您可以做的另一件事是将代码从 objdump 和朋友复制到您自己的程序中。它是开源的,你可以这样做。您所需要的只是让您自己的程序也使用 GPL,无论如何它们都必须是 GPL 才能使用 BFD 库。

【讨论】:

【参考方案2】:

程序 objdump 和 objcopy 不是 gcc 的一部分,它们是 binutils 的一部分。说到这里:libbfd 和 libopcodes 也是 binutils 的一部分,它们包含您可能可以使用的功能。

【讨论】:

谢谢,我去看看。

以上是关于objdump 和 objcopy 作为 c/c++ 库的主要内容,如果未能解决你的问题,请参考以下文章

实例:对一个Makefile的备注

led部分Makefile

objdump - GNU的二进制工具

Binutils-2.27

编写第一个裸机程序

bin utilities related