我正在尝试用GCC compilator
(Standart C)编译一个裸机应用程序。我将Cyclone V SoC
与Cortex-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"
(不同的溢出大小)。我该怎么做才能摆脱这个错误?
答案 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或者其他),从那里可能知道哪个部分真的太大,哪些函数是巨大的或什么数据,等优化器等内联不需要的全局函数