区域ram溢出,section .text不适合区域ram

时间:2017-02-04 14:17:52

标签: c gcc compilation bare-metal ds-5

我正在尝试用GCC compilator(Standart C)编译一个裸机应用程序。我将Cyclone V SoCCortex-A9处理器一起使用。 Eclipse DS-5。我收到了错误 - "Region ram overflowed by 295376 bytes""section .text will not fit region ram"

我认为问题不在链接器脚本中,而在于其他内容。我看到编译器尝试将项目中的所有.c文件添加到一个.axf文件中的消息,即使我在我的主.c文件中没有包含它们(我编写程序的地方)我从项目中删除了一些未使用的.c文件"Region ram overflowed by 275433 bytes"(不同的溢出大小)。我该怎么做才能摆脱这个错误?

1 个答案:

答案 0 :(得分:1)

flash.ld

MEMORY
{
    ram : ORIGIN = 0x00000000, LENGTH = 0x100
}
SECTIONS
{
    .text : { *(.text*) } > ram
    .rodata : { *(.rodata*) } > ram
    .bss : { *(.bss*) } > ram
}

flash.s

.globl _start
_start:
    b reset
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
reset:
    mov sp,#0x8000
    bl notmain
    b hang
hang:
    b hang

notmain.c

unsigned int data[1000];
int notmain ( void )
{
    unsigned int ra;
    for(ra=0;ra<1000;ra++) data[ra]=ra;
    return(0);
}

生成文件

ARMGNU = arm-none-eabi

COPS = -O2 -nostdlib -nostartfiles -ffreestanding

all : notmain.bin

clean:
    rm -f *.bin
    rm -f *.o
    rm -f *.elf
    rm -f *.list

flash.o : flash.s
    $(ARMGNU)-as $(AOPS) flash.s -o flash.o

notmain.o : notmain.c
    $(ARMGNU)-gcc $(COPS) -c notmain.c -o notmain.o

notmain.bin : flash.ld flash.o notmain.o
    $(ARMGNU)-ld -o notmain.elf -T flash.ld flash.o notmain.o
    $(ARMGNU)-objdump -D notmain.elf > notmain.list
    $(ARMGNU)-objcopy notmain.elf notmain.bin -O binary

输出:

arm-none-eabi-ld -o notmain.elf -T flash.ld flash.o notmain.o
arm-none-eabi-ld:flash.ld:10: warning: memory region `rom' not declared
arm-none-eabi-ld: notmain.elf section `.bss' will not fit in region `ram'
arm-none-eabi-ld: region `ram' overflowed by 3828 bytes
Makefile:21: recipe for target 'notmain.bin' failed
make: *** [notmain.bin] Error 1

我本可以说.text不适合,但是你遇到了同样的问题。更改链接描述文件中的大小。

ram : ORIGIN = 0x00000000, LENGTH = 0x1000

现在很开心

arm-none-eabi-ld -o notmain.elf -T flash.ld flash.o notmain.o
arm-none-eabi-objdump -D notmain.elf > notmain.list
arm-none-eabi-objcopy notmain.elf notmain.bin -O binary

.text部分,这是你的程序本身,对于&#34;内存来说太大了#34;分配给它。如果您使用的链接描述文件反映了您所分配内容的真实大小,那么您的程序太大,您需要将其缩小,如果您不是(在gcc命令行上为-O2),则可以通过优化来启动前面的非全局函数,或者只是通过清理整体减少代码量。这并不意味着将C行中的几行放入一行C而没有删除实际功能,您需要让它做更少的事情。

或者在我的情况下,或许你有一些.data或.bss或其他项目也在链接器脚本中定义的同一部分中,并且所有这些项目的组合占用了太多空间。在我上面的示例中将长度更改为0x10它首先抱怨.text而没有其他的,如上所述如果我将其设为0x100则抱怨.bss然后停止抱怨,所以ld抱怨那个积极越过线而不是那些还没有进入。

你可以让长度更大来构建它,然后检查elf文件(objdump或readelf或者其他),从那里可能知道哪个部分真的太大,哪些函数是巨大的或什么数据,等优化器等内联不需要的全局函数