繁体   English   中英

为什么arm-none-eabi-size报告.data部分为0,即使我使用初始化的RAM?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM