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 的 objdump
和 objdopy
,包括其参数和 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++ 库的主要内容,如果未能解决你的问题,请参考以下文章