问题标签 [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.
binary - 将二进制文件从特定地址点填充到地址中的另一个特定地址点
问题描述:
我有两个二进制文件(我们称它们为文件 A和B)。文件 A 是内核,文件 B 是要运行的应用程序(是的,它是嵌入式操作系统)。对于文件 A,我需要填补从内核末尾到从地址 0x00020000 开始的程序开始之间的空白。
然后从 0x00020000 + 程序长度我需要填补空白到 0x00080000。
我试着调查arm-none-eabi-objcopy gap fill
但没有运气。(contiki 使用它)
我基本上有两个问题。我怎么知道何时开始从文件 A到 0x00080000 的填充以及如何进行填充。
如果有不清楚的地方,请告诉我,我会尽我所能更详细地解释。
debugging - 用于 pic30/xc16 的 objcopy - 在哪里可以找到类似物
我正在使用 PIC24 上的一个非独立项目,该项目需要引导加载程序,我想使用引导加载程序对其进行调试。我能够使用引导加载程序生成一个包含应用程序代码的 .hex 文件,注册一个在编译后执行的自定义脚本。
如果我现在在菜单中选择“Launch Debugger Main Project”,调试器正常执行摘要代码甚至到达应用程序启动,但不显示调试信息,因为它不包含在 .hex 文件中。但是如果我选择“调试主项目”,调试器正在加载包含调试信息但不包含加载程序代码的 .elf 文件,而不是制造的 .hex 文件。
有没有办法强制调试器从一个文件加载调试信息并从另一个文件加载可执行代码?或者有没有办法在编译的 .elf 文件中添加一个部分或完全替换其中的代码?pic30 和 xc16 都没有“objcopy”实用程序,是否有类似物?
这些是有问题的图片:
[1] https://s15.postimg.cc/59jynpikr/2018-06-27-0001.png
[2] https://s15.postimg.cc/kv1a7q7ej/2018-06-27-0002.png
[3] https://s15.postimg.cc/idpj0hid7/2018-06-27-0003.png
[4] https://s15.postimg.cc/8t5wdm0qz/2018-06-27-0004.png
[5] https://s15.postimg.cc/np4fl7rl7/2018-06-27-0005.png
linker - objcopy 创建的对象文件不兼容
我使用 objcopy 从二进制文件创建了一个目标文件,如下所示:
在链接器脚本部分之一中,我包含以下内容以将该文件放入该部分:
但我收到以下错误:
我正在为 arm 微控制器开发,所以我相信文件格式“elf32-little”是正确的。
任何帮助深表感谢。
################################################# ################### 按照 INCBIN 路径更新:
我尝试了一种新方法,虽然我已经取得了一些进展,但还没有完全实现。
这是我的汇编文件:
这是我得到的目标文件:
这是我的链接器脚本中的部分:
出于某种原因,链接器不会将数据放在此部分(或任何部分)中。
有什么想法有什么问题吗?
如果这里有什么问题,我提前道歉,我是链接器脚本的新手,所以仍然理解它们......
object - objcopy 生成巨大的二进制文件(265M)
当试图生成一个删除两个文本部分的二进制文件时,我最终得到了一个 265M 的巨大二进制文件。
有没有人知道为什么会发生这种情况?
提前致谢。
gcc - obj-copy 忽略一些填充
我在 arm obj-copy 中遇到了一个奇怪的问题。我做错了什么还是遇到了错误?
我想用零填充我的图像,直到 0x1000 (4096) 对齐,我通过下面的链接脚本进行填充。问题是 obj-copy 不会复制整个填充,由于某种原因它在 0x400 处停止。
我已经使用 objdump 来评估我的部分,它的大小似乎可以正确填充到 0x1000。
如果使用 0x1000 填充,为什么我的二进制文件的 hexdump 没有正确填充?我使用 objcopy 以下方式创建我的二进制文件:
转储:
链接脚本:
c - 删除使用 __attribute__((section)) 创建的部分
我有许多功能和相应的单元测试。我想将测试嵌入代码库本身。我想出了以下解决方案:
测试放置在.tests
我可以为发布构建剥离的部分中。我尝试了以下方法:
我发现这个问题描述了一个类似的问题,答案说这是因为该部分是从某个地方交叉引用的。
我认为.eh_frame
这是有罪的部分,因为删除它会起作用:
- 我可以删除此部分而不会产生任何后果吗?
- 有没有更好的方法来解决这个问题?
c++ - objcopy --redefine-syms 绑定失败
前提条件
第三方提供了fooapp
使用共享对象的 C++ 可执行文件libfoo.so
。该库还带有一个标头foo.hpp
,因此开发人员可以构建其他应用程序:
成功范例
这是一个LD_PRELOAD
基于标准的函数插入工作流。
首先,我编写了自己的库版本,myfoo.cpp
它完全反映了以下内容的一部分 foo.hpp
:
然后我将我的库编译成libmyfoo.so
并看到以下内容:
成功! ld_debug.log
按预期显示绑定,并bar(...)
生成输出到控制台。
失败示例
对于失败示例,我将 (1) 更改一个字符,myfoo.hpp
然后 (2) 使用以下方法修复二进制文件中的该字符objcopy
:
当我将我的库编译成libmyfoq.so
我看到以下内容:
失败! ld_debug.log
显示没有fooapp
符号绑定到libmyfoo.so
。
(PS——如果你好奇sym.map
的话,包含foq::bar
(PS——它和foo::bar
.-C
nm
man objcopy
为什么?
总之:
objcopy
正在正确重命名符号。- 符号名称没有改变大小。
- 但加载器在加载时忽略了它。
这里有什么故事?
gcc - objcopy 正在删除一个部分,除非我在该部分中声明一个静态 volatile 变量(使用属性)
我有一个链接器脚本,我在其中定义了一个包含软件映像校验和的部分。就像是:
使用 . 将校验和放入该部分objcopy --update-section
。
elf
我使用编译器构建了一个文件arm gcc
,我可以在其中看到此部分及其值:
我可以检索它的值:
现在我bin
通过执行生成一个文件
现在,如果我尝试再次读取校验和值,使用校验和 LMA 和第一部分 LMA 之间的差异(见上文):
我这里得到的结果和elf文件中得到的结果不同,就是校验和部分已经被objcopy去掉了。(至少我是这么认为的)。
不过,如果我在我的main.c
文件中定义它:
elf
现在,如果我用and文件复制与上述相同的步骤bin
(使用适当的偏移量),我可以从bin
文件中检索校验和(elf
并bin
给出相同的结果)。
问题
我的第一个问题是:我知道您可以使用 定义一个部分__attribute__((section))
,但是如果您使用链接描述文件中已经定义的部分,此命令是否会更改其将变量放置在该部分中的行为,而不是创建一个新的?
我的第二个问题是:objcopy
这是防止删除此特定部分的唯一方法吗?
gcc - 将 objcopy 与“精简存档”文件一起使用时出现问题
请使用以下 shell 命令重现问题:
结果,出现以下错误:
objcopy:st0AENRL/subdir/file2.o:没有这样的文件或目录
PS 当“瘦”存档由子目录中的对象文件组成时,会出现 objcopy 的问题。
有人知道这种 objcopy 的行为是否正常吗?