gcc 区域ram溢出,节.文本将不适合区域ram

brc7rcf0  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(553)

我正在尝试使用GCC编译器(标准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"(不同的溢出大小).我应该做什么来摆脱这个错误?

uwopmtnx

uwopmtnx1#

flash.ld

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

闪存.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部分,基本上就是你的程序本身,对于分配给它的“内存”来说太大了。如果你正在使用的链接器脚本反映了你所分配的真实大小,你的程序太大了,你需要把它变小,如果你不这样做,可以从优化开始(在gcc命令行上使用-O2)或将static放在非全局函数前面,或者仅仅是通过清理来总体减少代码量。这并不意味着将几行C语言变成一长行C语言,而不删除任何真实的功能,你需要让它做更少的事情。
或者像我这里的例子一样,你可能有一些.data或.bss或其他项目,它们也在链接器脚本中定义的同一部分中,它们的组合占用了太多的空间。在我上面的例子中,将长度改为0x 10,它首先抱怨.text,而没有其他项目,如上所述,如果我将长度改为0x 100,它抱怨.bss,然后停止抱怨。所以ld是在抱怨那些主动越界的,而不是那些还没有被拉进来的。
您可以增加长度以使其能够构建,然后检查elf文件(objdump或readelf或其他文件),并从中了解哪些部分确实太大,哪些函数太大或哪些数据太大等。全局函数不需要由优化器内联,等等。

相关问题