问题标签 [objcopy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
784 浏览

gcc - 海湾合作委员会。生成有限的调试信息

有没有办法强制gcc只生成足够addr2line实用的完整调试信息的子集?或者有什么方法可以去掉不需要的?我试过了

$ objcopy --only-keep-debug --remove-section=.debug_loc --remove-section=.debug_aranges --remove-section=.debug_frame my-elf-file

有什么可以除掉的吗?

0 投票
1 回答
1680 浏览

gnu - 如何使 `objcopy` 支持 efi-app 目标?

以下 makefile 片段似乎是用于将文件objcopy转换为文件的命令行选项。.so.efi

它基本上从文件中提取某些部分.so并进入efi-app目标。

但是当我objcopy --info用来查看所有支持的输出文件格式(见下文)时,没有efi-app类型。

在此处输入图像描述

那么如何制作objcopy支持efi-app输出格式呢?

加 1

找到相关链接: https ://forums.gentoo.org/viewtopic-p-7197314.html

看来我需要考虑 Gentoo Linux 发行版和gnu-efi项目。

在链接断开的情况下添加下面的报价。

问题:

我对学习如何创建 UEFI 应用程序很感兴趣。我安装了 gnu-efi ebuild,在自述文件中发现 objcopy 需要支持 efi-app-x86_64。当我执行 objcopy --help 时,没有提及 efi-app-x86_64。我尝试添加多目标使用标志,但没有成功。我想知道是否有人知道如何获得支持 efi 的工具链,或者是否有任何关于使用 gentoo/linux 构建 efi 应用程序的 goosd 教程(我一直找不到)。

回答:

首先,Gentoo 的 GNU-EFI 是 3.0i 版本,非常旧(2009 年 9 月)。当前版本是 3.0s,尽管在我的测试中它运行得不是很好(二进制文件无法执行)。3.0r 版对我来说很好,所以你可能想尝试从它的 Sourceforge 页面下载它并在本地安装它。FWIW,我在今年 4 月提交了一份错误报告,要求进行版本升级,但没有得到任何官方行动,尽管此错误报告包含指向本地 ebuild 的链接。

至于您的主要问题,我的 objcopy 也没有将 efi-app-x86_64 显示为目标,但它确实有效。这是我得到的支持目标:

代码:

当我使用 GNU-EFI 编译我的 rEFInd 时,我在 make 输出中得到以下(以及许多其他消息):

代码:

这不会产生任何错误,实际上二进制文件可以正常工作。

所以底线是:不要担心它,除非它给你带来问题。如果是这种情况,请发回详细信息。

还有一点:可以使用 TianoCore EDK2 而不是 GNU-EFI 编译 EFI 应用程序。TianoCore 是一个完整的 EFI 实现,因此仅编译 EFI 应用程序有点矫枉过正,但它可以完成这项工作。它还有一个奇怪的(按 Linux 标准)编译过程,这可能会使从 Linux 安装和使用变得很尴尬。大多数为 Linux 用户开发的 EFI 程序,例如新的 Shim 安全工具和 gummiboot 引导加载程序,都使用 GNU-EFI,并且无法使用 TianoCore 进行编译。OTOH,TianoCore 比 GNU-EFI 更新得多,如果您想编译使用 TianoCore 或其前身开发工具包开发的东西,例如 EFI shell 程序,它是更好的选择。一些工具,例如 rEFInd,可以以任何一种方式编译。(重新搜索' 但是,启动 BIOS/传统引导加载程序的能力取决于 TianoCore 功能;如果您使用 GNU-EFI 编译 rEFInd,则无法启动 BIOS/旧版引导加载程序。)您可以查看 rEFInd 的 BUILDING.txt 和 Makefiles 以了解如何以更类似于 Linux/Unix 的方式使用 TianoCore。最后,哪个工具最好可能取决于您要编译的内容(哪个特定的现有程序或您从头开始编写的您自己的程序)。如果您正在编写一个新程序,那么了解您想要使用的 EFI 功能可能很重要。哪个工具最好可能取决于您要编译的内容(哪个特定的现有程序或您从头开始编写的您自己的程序)。如果您正在编写一个新程序,那么了解您想要使用的 EFI 功能可能很重要。哪个工具最好可能取决于您要编译的内容(哪个特定的现有程序或您从头开始编写的您自己的程序)。如果您正在编写一个新程序,那么了解您想要使用的 EFI 功能可能很重要。

0 投票
1 回答
4230 浏览

gcc - 如何使用 objcopy 或 libelf 将 elf 文件的一部分替换为另一部分,以便将其加载到内存中?

我有一个项目,我需要删除 ELF 文件的一部分并将其替换为内容稍作修改的另一部分。我能够首先删除原始部分,然后使用 objcopy 添加我想要的部分。但我总是收到以下警告:

这会导致该部分未加载到内存中,因此无法实现所需的功能。

添加它并将其带回细分市场的最佳方法是什么?

自由?或者这也可以使用 objcopy 来实现?

0 投票
0 回答
1427 浏览

gcc - 使用 objcopy 删除未使用的部分

假设我有以下源文件:

我使用以下方法将其编译为目标文件gcc -ffunction-sections

然后我尝试从目标文件中删除部分.text.g(带):g

那么,有没有办法从目标文件(用 编译-ffunction-sections)中删除特定于函数的部分?

额外信息:

  1. 符号的完整列表file.o是:

    /li>
  2. 我的目标是从目标文件中删除某些部分,类似于这样ld --gc-sections做。

或者是否有一些理论上的原因为什么这样的任务绝对超出了范围objcopy并且只能执行ld -r

0 投票
1 回答
525 浏览

assembly - 链接描述文件未按预期跳过字节

所以,我有这个汇编文件,我用 GNU as 汇编它并使用链接器脚本与 GNU ld 链接。

链接描述文件 ( boot.ld):

如您所见,我尝试通过执行. = 0x7cdfe. .boot_end包含引导签名,因此会填满剩余的两个字节。

我按如下方式创建引导加载程序:

boot.out包含已经具有绝对地址的部分,一切似乎都很好。.boot_end是在0x7dfe,我希望这些孔用零填充,但不,boot.img总共是 55 个字节。对我来说,奇怪的是该文件甚至不包含引导签名。它只是没有任何一个.text或跳过的字节。.data.boot_end

如何移动 ld 以跳过这些字节?我的引导签名到哪里去了?

0 投票
1 回答
121 浏览

vxworks - 从 SREC 文件中删除 S0 记录

我正在研究在 WindRiver 的 VxWorks 653 上运行的嵌入式系统。在构建二进制文件后,使用 objcopy 将其转换为 SREC,以便刻录到目标设备中。但是这个 SREC 文件包含一个 S0 记录及其构建目录,因此构建放置在两个不同目录中的相同代码将以不同的 SREC 文件结尾。是否可以关闭此 S0 记录添加到结果文件,无需手动操作?

0 投票
1 回答
1241 浏览

c - 为什么 objcopy 排除一个部分而不排除另一个部分?

背景

我试图在我的 STM32 设备上使用 SRAM 的一个特殊部分,它位于 address 0x40006000。我在 ST 的示例代码中看到的一种方法是简单地创建指针,其值恰好位于 RAM 的该部分中。我想要做的是让链接器为我管理该部分中的静态分配。

基本上,我从这样的事情开始:

像这样的东西(我认为它不容易破碎,也没有那么老套,虽然不那么便携):

为了做到这一点,我修改了我的链接器脚本,在其中有一个名为“PMA”的新内存,0x40006000并且我在其中找到了“.pma”部分,如下所示:

怎么了

所以这看起来一切都很好,花花公子,我的东西编译了,地图向我展示了,buffer0并且buffer1确实位于0x40006000and 0x40006080。这是我的makefile最后一位的输出:

.pma正如我预期的那样,我看到它使用了 256 个字节。地址看起来也正确。现在,当我ls进入bin目录时,我会受到这样的欢迎:

bin文件是我通过 openocd 加载到我的芯片闪存上的文件。它是从 0x08000000 开始的闪存图像。

旁注:实际上,在我意识到它有多大之前,我实际上试图将那个 bin 文件加载到我的芯片上……这显然不起作用。

这是我删除 PMA 部分后得到的结果:

文件大小完全符合我的预期:

问题

据我了解,这里发生的事情是将objcopy所有内容从0x08000000to复制0x400060FF到该 bin 文件中。这显然不是我想要发生的。我预计它只会复制闪存。

现在,显然我可以按照-R .pma我的objcopy命令说,一切都会很愉快。但是,我很好奇的是如何objcopy知道不复制.data到二进制图像中。我注意到跑步的结果与没有objcopy -R .data跑步的结果完全相同objcopy。与.bss. 这告诉我它不是链接器脚本中的命令(这是我能看到的和AT之间唯一真正的区别).data.bss

我可以做些什么来使我的.pma部分表现得与 's 的角度相同.data.bssobjcopy's 的角度来看?我正在使用的中间 elf 文件中的.data/是否有一些有趣的事情发生(见上文生成 elf 文件的链接器命令)?.bss

0 投票
0 回答
113 浏览

c - 在 elf/bin 文件中插入代码

我需要编译一段代码,称为程序 A,并获取带有链接器给出的物理地址的 ELF 文件。

然后,我需要编译程序 B 并将其代码注入我无法重新编译的程序 A,因为我会丢失有关程序 A 的地址的信息。

现在,我在程序 A 上有一个空白部分,我试图将程序 B 复制到该部分。我正在尝试使用 GNUobjcopy实用程序使用标志更新空白部分,--update-section但到目前为止我还没有成功。

简而言之,我正在尝试编译一个代码,该代码需要有关其自身内存配置的信息(变量和函数在内存中的位置)。

0 投票
1 回答
7216 浏览

linker - 如何将文本文件的内容添加为 ELF 文件中的一个部分?

我有一个正在组装和链接的 NASM 程序集文件(在 Intel-64 Linux 上)。

有一个文本文件,我希望文本文件的内容出现在生成的二进制文件中(基本上是一个字符串)。该二进制文件是 ELF 可执行文件。

我的计划是在 ELF 文件中创建一个新的只读数据部分(相当于常规.rodata部分)。

理想情况下,会有一个工具可以将文件逐字添加为 elf 文件中的新部分,或者有一个链接器选项来逐字包含文件。

这可能吗?

0 投票
1 回答
1235 浏览

binary - 是否可以重新定位二进制文​​件?

我使用objcopy -o binary创建了一个从 elf 文件创建的原始二进制文件。是否可以通过给定的偏移量重新定位它?我相信我正在寻找的效果类似于使用--change-addresses选项然后将其转换为二进制。

先感谢您