我正在使用和ARM官方开发环境RVDS的旧版本,目前我想切换到linux gcc工具链。
所以我想写一个简单的hello world在我们自己的主板上运行,从UART打印。但是链接器和objcopy困住了我。
这是我的LD文件:
MEMORY
{
rom (rx) : ORIGIN = 0, LENGTH = 128K
ram (rwx) : ORIGIN = 0x60000000, LENGTH = 128K
}
SECTIONS
{
. = 0x0;
.text : {
*(vectors)
*(.text)
*(.rodata)
}
. = 0x60000000;
.data : {
*(.data)
}
.bss : {
*(.bss)
}
}
make之后,它会生成一个大约1.6G的巨型bin文件,大小只有0x60000000。
我该如何解决这个问题?非常感谢。
答案 0 :(得分:2)
数据部分应位于RAM中。更改链接描述文件:
/* . = 0x60000000; removed */
.data : {
*(.data)
} >RAM
.bss : {
*(.bss)
} >RAM
您的启动代码应将数据从ROM复制到RAM。为此,它需要初始化值的地址以及运行时数据应存在的位置。
再次更改脚本:
/* used by the startup to initialize data */
_sidata = .;
.data : AT( _sidata )
{
_sdata = .;
*(.data)
_edata = .;
} >RAM
.bss : {
_sbss = .;
*(.bss)
_ebss = .;
} >RAM
添加代码
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0
b LoopCopyDataInit
CopyDataInit:
ldr r3, =_sidata
ldr r3, [r3, r1]
str r3, [r0, r1]
adds r1, r1, #4
LoopCopyDataInit:
ldr r0, =_sdata
ldr r3, =_edata
adds r2, r0, r1
cmp r2, r3
bcc CopyDataInit
为.bss
部分添加类似的代码。
ldr r2, =_sbss
b LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
movs r3, #0
str r3, [r2], #4
LoopFillZerobss:
ldr r3, = _ebss
cmp r2, r3
bcc FillZerobss
答案 1 :(得分:1)
CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld
OBJCP = arm-none-eabi-objcopy
CFLAGS += -mcpu=arm1176jz-s -mthumb -mlittle-endian
CFLAGS += -ffunction-sections -fdata-sections
CFLAGS += -fshort-enums -fomit-frame-pointer -fno-strict-aliasing
CFLAGS += -Wall -std=c99
LFLAGS += -nostartfiles
LFLAGS += -T my_ld.ld
CPFLAGS = -O binary