我为某些 ARM 处理器编译了我的代码并拥有二进制文件。现在我想知道它在我的 FLASh 内存中占用的确切字节大小(地址范围)。
因为,我在闪存的最后 1kB 有一定的恢复机制,不希望它被覆盖,因为它需要永久存在。
二进制的 readelf 给了我起始地址(映射到代码和数据段)&我不能真正将它映射到我想要的。
我为某些 ARM 处理器编译了我的代码并拥有二进制文件。现在我想知道它在我的 FLASh 内存中占用的确切字节大小(地址范围)。
因为,我在闪存的最后 1kB 有一定的恢复机制,不希望它被覆盖,因为它需要永久存在。
二进制的 readelf 给了我起始地址(映射到代码和数据段)&我不能真正将它映射到我想要的。
如果您的编译器/链接器基于 gnu 工具链 (gcc/ld)
1/ 在编译时
在您的链接描述文件中调整节大小以减去 1K。如果您的代码不适合您的闪存区域,您的编译器会抛出错误。
例子 :
MEMORY
{
FLASH (rx) : ORIGIN = 0x08001000, LENGTH = 128K-1K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K
}
2/ 在运行时
您可以在链接描述文件中设置一个符号来确定程序的结束(文本段)。您可以使用此符号进行运行时测试
例子 :
.text :
{
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
} >FLASH
3/ 手动
编译后,使用 objcopy 转换您的 elf 文件以获取进入闪存的二进制图像。检查您的数据表以获取您的闪存大小并手动检查文件大小是否适合您的闪存负 1K。
例子:
objcopy -O binary myfile.elf myfile.bin
使用值'ab'预初始化闪存,加载二进制文件。读取闪存,直到遇到超过 2 个“ab”值。这应该给出二进制占用的闪存中的地址范围。(这是假设您的二进制文件可能不超过 2 个“ab”作为二进制文件的一部分)