闪存.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
不是main.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)或放入静态非全局函数的前面,或者只是通过清理来整体减少代码量。这并不意味着将几行 C 变成一长行 C 而没有删除真正的功能,你需要让它做更少的事情。
或者在我的情况下,也许您有一些 .data 或 .bss 或其他项目也位于链接描述文件中定义的同一部分中,并且所有这些项目的组合占用了太多空间。在我上面的示例中将长度更改为 0x10 它首先抱怨 .text 而没有其他人,如上所述,如果我将其设为 0x100 它抱怨 .bss 然后停止抱怨,所以 ld 抱怨的是积极越线的人而不是那些人那还没有被拉进去。
您可以增大长度以构建它,然后检查 elf 文件(objdump 或 readelf 或其他),并从那里了解哪些部分确实太大,哪些函数很大或哪些数据等。函数那些不需要被优化器内联的全局变量等。