我使用和老版本的ARM官方开发环境RVDS,目前我想切换到linux gcc工具链。
因此,我想写一个简单的你好世界运行在我们自己的板上,打印从UART。但是链接器和讣告卡住了我。
这是我的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。
我怎样才能解决这个问题?非常感谢。
发布于 2015-08-04 10:31:51
当我更改到以下编译器设置时,这个巨大的文件就消失了:
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发布于 2015-08-03 11:18:58
数据部分应该位于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 FillZerobsshttps://stackoverflow.com/questions/31784002
复制相似问题