【发布时间】:2014-11-24 11:30:42
【问题描述】:
我正在使用 objcopy 删除一些必要的脚本以将资源文件(zip 文件)嵌入闪存(ARM 嵌入式事物)中。
我正在像这样使用 objcopy:
arm-none-eabi-objcopy.exe -I binary -O elf32-littlearm -B arm --rename-section .data=.rodata input.zip input.zip.o
arm-none-eabi-nm.exe -S -t d input.zip.o
00006301 R _binary_input_zip_end
00006301 A _binary_input_zip_size
00000000 R _binary_input_zip_start
我需要知道 _end 和 _size 符号的宽度是多少。我只能猜测 _start 是一个可以像字节数组一样访问的地址:extern uint8_t _binary_input_zip_start[];。我假设 _end 和 _size 是“本机”int-size,我想我可以放心地假设我可以将它们解释为 uint32_t。
但是我不能确定。我在 objcopy 的文档中找不到任何与“大小”相关的内容:https://sourceware.org/binutils/docs/binutils/objcopy.html
【问题讨论】:
-
我会在
hexdump周围使用一些脚本来创建一个包含const char zipcontent[] =...;的大 Cdata.c文件,然后链接data.o。无需使用objcopy技巧。 -
@BasileStarynkevitch 是的,我们曾经使用它,但是生成的 .c 文件需要添加到 SVN,因为构建服务器不会首先运行。 (它首先查找构建索引所需的文件,然后运行“预构建”命令(创建所述 .c 文件),然后由于所述文件在预构建之前不存在而出错)。但是在 SVN 中生成也很烦人。
-
我不确定,但您可以使用
objdump读取值。我在你的问题中遗漏了一些重要的东西? -
不,objdump 也没有指定它们变量的类型。我只想知道它们是否应该读作 uint8_t[]、uint16_t[]、uint32_t[]、void[]。软件通过用 start 减去 end 来获得字节数量并以每个字节 (uint8_t) 为基础读取它就可以正常工作。我只是想知道指定正确的“外部”类型的基础类型。