问题标签 [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.
gcc - 海湾合作委员会。生成有限的调试信息
有没有办法强制gcc
只生成足够addr2line
实用的完整调试信息的子集?或者有什么方法可以去掉不需要的?我试过了
$ objcopy --only-keep-debug --remove-section=.debug_loc --remove-section=.debug_aranges --remove-section=.debug_frame my-elf-file
有什么可以除掉的吗?
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 功能可能很重要。
gcc - 如何使用 objcopy 或 libelf 将 elf 文件的一部分替换为另一部分,以便将其加载到内存中?
我有一个项目,我需要删除 ELF 文件的一部分并将其替换为内容稍作修改的另一部分。我能够首先删除原始部分,然后使用 objcopy 添加我想要的部分。但我总是收到以下警告:
这会导致该部分未加载到内存中,因此无法实现所需的功能。
添加它并将其带回细分市场的最佳方法是什么?
自由?或者这也可以使用 objcopy 来实现?
gcc - 使用 objcopy 删除未使用的部分
假设我有以下源文件:
我使用以下方法将其编译为目标文件gcc -ffunction-sections
:
然后我尝试从目标文件中删除部分.text.g
(带):g
那么,有没有办法从目标文件(用 编译-ffunction-sections
)中删除特定于函数的部分?
额外信息:
符号的完整列表
/li>file.o
是:我的目标是从目标文件中删除某些部分,类似于这样
ld --gc-sections
做。
或者是否有一些理论上的原因为什么这样的任务绝对超出了范围objcopy
并且只能执行ld -r
?
assembly - 链接描述文件未按预期跳过字节
所以,我有这个汇编文件,我用 GNU as 汇编它并使用链接器脚本与 GNU ld 链接。
链接描述文件 ( boot.ld
):
如您所见,我尝试通过执行. = 0x7cdfe
. .boot_end
包含引导签名,因此会填满剩余的两个字节。
我按如下方式创建引导加载程序:
boot.out
包含已经具有绝对地址的部分,一切似乎都很好。.boot_end
是在0x7dfe
,我希望这些孔用零填充,但不,boot.img
总共是 55 个字节。对我来说,奇怪的是该文件甚至不包含引导签名。它只是没有任何一个.text
或跳过的字节。.data
.boot_end
如何移动 ld 以跳过这些字节?我的引导签名到哪里去了?
vxworks - 从 SREC 文件中删除 S0 记录
我正在研究在 WindRiver 的 VxWorks 653 上运行的嵌入式系统。在构建二进制文件后,使用 objcopy 将其转换为 SREC,以便刻录到目标设备中。但是这个 SREC 文件包含一个 S0 记录及其构建目录,因此构建放置在两个不同目录中的相同代码将以不同的 SREC 文件结尾。是否可以关闭此 S0 记录添加到结果文件,无需手动操作?
c - 为什么 objcopy 排除一个部分而不排除另一个部分?
背景
我试图在我的 STM32 设备上使用 SRAM 的一个特殊部分,它位于 address 0x40006000
。我在 ST 的示例代码中看到的一种方法是简单地创建指针,其值恰好位于 RAM 的该部分中。我想要做的是让链接器为我管理该部分中的静态分配。
基本上,我从这样的事情开始:
像这样的东西(我认为它更不容易破碎,也没有那么老套,虽然不那么便携):
为了做到这一点,我修改了我的链接器脚本,在其中有一个名为“PMA”的新内存,0x40006000
并且我在其中找到了“.pma”部分,如下所示:
怎么了
所以这看起来一切都很好,花花公子,我的东西编译了,地图向我展示了,buffer0
并且buffer1
确实位于0x40006000
and 0x40006080
。这是我的makefile最后一位的输出:
.pma
正如我预期的那样,我看到它使用了 256 个字节。地址看起来也正确。现在,当我ls
进入bin
目录时,我会受到这样的欢迎:
该bin
文件是我通过 openocd 加载到我的芯片闪存上的文件。它是从 0x08000000 开始的闪存图像。
旁注:实际上,在我意识到它有多大之前,我实际上试图将那个 bin 文件加载到我的芯片上……这显然不起作用。
这是我删除 PMA 部分后得到的结果:
文件大小完全符合我的预期:
问题
据我了解,这里发生的事情是将objcopy
所有内容从0x08000000
to复制0x400060FF
到该 bin 文件中。这显然不是我想要发生的。我预计它只会复制闪存。
现在,显然我可以按照-R .pma
我的objcopy
命令说,一切都会很愉快。但是,我很好奇的是如何objcopy
知道不复制.data
到二进制图像中。我注意到跑步的结果与没有objcopy -R .data
跑步的结果完全相同objcopy
。与.bss
. 这告诉我它不是链接器脚本中的命令(这是我能看到的和AT
之间唯一真正的区别).data
.bss
我可以做些什么来使我的.pma
部分表现得与 's 的角度相同.data
或.bss
从objcopy
's 的角度来看?我正在使用的中间 elf 文件中的.data
/是否有一些有趣的事情发生(见上文生成 elf 文件的链接器命令)?.bss
c - 在 elf/bin 文件中插入代码
我需要编译一段代码,称为程序 A,并获取带有链接器给出的物理地址的 ELF 文件。
然后,我需要编译程序 B 并将其代码注入我无法重新编译的程序 A,因为我会丢失有关程序 A 的地址的信息。
现在,我在程序 A 上有一个空白部分,我试图将程序 B 复制到该部分。我正在尝试使用 GNUobjcopy
实用程序使用标志更新空白部分,--update-section
但到目前为止我还没有成功。
简而言之,我正在尝试编译一个代码,该代码需要有关其自身内存配置的信息(变量和函数在内存中的位置)。
linker - 如何将文本文件的内容添加为 ELF 文件中的一个部分?
我有一个正在组装和链接的 NASM 程序集文件(在 Intel-64 Linux 上)。
有一个文本文件,我希望文本文件的内容出现在生成的二进制文件中(基本上是一个字符串)。该二进制文件是 ELF 可执行文件。
我的计划是在 ELF 文件中创建一个新的只读数据部分(相当于常规.rodata
部分)。
理想情况下,会有一个工具可以将文件逐字添加为 elf 文件中的新部分,或者有一个链接器选项来逐字包含文件。
这可能吗?
binary - 是否可以重新定位二进制文件?
我使用objcopy -o binary创建了一个从 elf 文件创建的原始二进制文件。是否可以通过给定的偏移量重新定位它?我相信我正在寻找的效果类似于使用--change-addresses选项然后将其转换为二进制。
先感谢您