5

我对使用工具链(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 部分分配了数据,但由于某种原因,size 实用程序没有拾取它 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
4

2 回答 2

2

我的解释是链接描述文件创建了一个可加载的部分,其中包含数据部分的初始值和一段将数据复制到未初始化数据部分的启动代码。

如果您想要一个可以从只读内存运行的图像文件,这是必要的,因为前面没有 ELF 加载器,那么它将为您执行该副本。

通常,这仅在段到段的映射中完成(即,输出段使用>段放置命令排列在链接描述文件中),而不是通过两次映射输入段,但这当然也是可能的。

使用数字非常准确:文本大小是所需的闪存空间量,BSS 大小是所需的 RAM 量。初始化数据计数两次,一次用于 Flash 中的初始数据,一次用于 RAM 中的可修改数据。

于 2012-03-16T14:42:14.523 回答
2

您的 .data 部分设置了 CODE 属性,这使“arm-none-eabi-size”感到困惑。.data 部分的大小被错误地添加到总文本大小而不是数据大小中。

我的猜测是,您有一些代码存储在闪存中,但在运行时被复制到 ram,例如必须从 RAM 运行的快速中断处理程序或闪存重新编程。这将为数据段设置CODE属性,“size”认为所有的.data都是文本。

于 2015-09-28T14:50:25.120 回答