【发布时间】:2018-01-05 16:58:38
【问题描述】:
我需要添加一个小堆以在 TM4C ARM 微控制器上使用标准库函数(_sbrk 需要 end 符号)。
这是我的链接器脚本(带有微控制器演示):
/* Entry Point */
ENTRY(Reset_Handler)
HEAP_SIZE = 1024;
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000
}
SECTIONS
{
.text :
{
_text = .;
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
_etext = .;
} > FLASH
.data : AT(ADDR(.text) + SIZEOF(.text))
{
_data = .;
_ldata = LOADADDR (.data);
*(vtable)
*(.data*)
_edata = .;
} > SRAM
.bss :
{
_bss = .;
*(.bss*)
*(COMMON)
_ebss = .;
} > SRAM
.heap : AT(ADDR(.bss) + SIZEOF(.bss))
{
. = ALIGN(8);
__end__ = .;
PROVIDE(end = .);
__HeapBase = .;
. += HEAP_SIZE;
__HeapLimit = .;
} > SRAM
}
我只在 .bss 之后添加了 .heap,类似于 .data/.text 但我得到链接错误:
ld: section .init loaded at [000126b4,000126bf] overlaps section .data loaded at [000126b4,00012f8f]
collect2: error: ld returned 1 exit status
当我删除 AT(ADDR(.bss) + SIZEOF(.bss)) 时也会发生这种情况。当我删除 .heap 并调用 libc 函数时,所有内容都会编译和链接,输出二进制文件会正确运行。
我应该如何调整脚本以在 bss 之后正确放置堆?
【问题讨论】:
标签: gcc arm ld linker-scripts