[英]arm-none-eabi-ld: section .ARM.exidx overlaps section .data
[英]Why does arm-none-eabi-size report the .data section to be 0 even though I am using initialized RAM?
当我使用我的工具链(Yagarto和codesourcery)大小实用程序时,我对结果感到有些困惑。 它报告我在数据部分使用0字节。 见下文
$ arm-none-eabi-size.exe rest-server-example.crazy-horse.elf
text data bss dec hex filename
79364 0 34288 113652 1bbf4 rest-server-example.crazy-horse.elf
我知道我的代码正在使用静态RAM变量并将其初始化为0以外的值。
有趣的是,当我直接传递大小工具的一些目标文件时,我看到.data部分被报告
例:
text data bss dec hex filename
1648 0 20 1668 684 obj_crazy-horse/uip-nd6.o
200 12 2652 2864 b30 obj_crazy-horse/uip-packetqueue.o
12 0 0 12 c obj_crazy-horse/uip-split.o
1816 24 48 1888 760 obj_crazy-horse/usb-core.o
284 0 0 284 11c obj_crazy-horse/usb-interrupt.o
2064 20 188 2272 8e0 obj_crazy-horse/xmac.o
当构成它的目标文件报告非零值时,为什么elf文件会为.data部分报告0?
仅供参考我正在研究AT91SAM7x256 Micro的嵌入式软件
编辑:
添加CFLAGS和LDFLAGS
CFLAGS += -O -DRUN_AS_SYSTEM -DROM_RUN -ffunction-sections
LDFLAGS += -L $(CPU_DIRECTORY) -T $(LINKERSCRIPT) -nostartfiles -Wl,-Map,$(TARGET).map
编辑#2:从对象转储中我们可以清楚地看到.data部分已经分配了数据,但是大小实用程序由于某种原因没有将其提取到objdump链接
我正在寻找的只是获得我的RAM的确切用法我不是想弄清楚我的一个变量是否被优化了。
编辑3:更多信息显示size实用程序确实在.data部分中看到了某些内容
$ arm-none-eabi-size.exe -A -t -x rest-server-example.crazy-horse.elf
rest-server-example.crazy-horse.elf :
section size addr
.vectrom 0x34 0x100000
.text 0x10fc8 0x100038
.rodata 0x149c 0x111000
.ARM.extab 0x30 0x11249c
.ARM.exidx 0xe0 0x1124cc
.data 0x1028 0x200000
.bss 0x7bec 0x201028
.stack 0xa08 0x20f5f8
.ARM.attributes 0x32 0x0
.comment 0x11 0x0
.debug_aranges 0xc68 0x0
.debug_info 0x2b87e 0x0
.debug_abbrev 0x960b 0x0
.debug_line 0x9bcb 0x0
.debug_frame 0x4918 0x0
.debug_str 0x831d 0x0
.debug_loc 0x13fad 0x0
.debug_ranges 0x620 0x0
Total 0x7c4c5
我的解释是链接器脚本创建一个可加载的部分,其中包含数据部分的初始值和一段将数据复制到未初始化数据部分的启动代码。
如果你想拥有一个可以从只读内存运行的单个图像文件,这是必要的,因为前面没有ELF加载器可以为你执行该副本。
通常,这仅在段映射中进行(即输出节使用>
section placement命令在链接描述文件中排列),而不是通过两次映射输入节,但这当然也是可能的。
使用数字非常准确:文本大小是所需的Flash空间量,BSS大小是所需的RAM量。 初始化数据计数两次,一次用于Flash中的初始数据,一次用于RAM中的可修改数据。
您的.data部分设置了CODE属性,这会混淆“arm-none-eabi-size”。 .data部分的大小错误地添加到总文本大小而不是数据大小。
我的猜测是你有一些代码存储在flash中,但是在运行时被复制到ram,例如快速中断处理程序或必须从RAM运行的flash重新编程。 这将为数据段设置CODE属性,“size”认为所有.data都是文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.