GNU链接器ARM - 为什么我的部分重叠?
问题描述:
我需要添加一个小堆以使用TM4C ARM微控制器上的标准库函数(_sbrk
需要end
符号)。GNU链接器ARM - 为什么我的部分重叠?
这是我的链接脚本(附带微控制器演示):
/* 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
}
我只加.HEAP后的.bss类推到。数据/的.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?
答
事实证明,我的堆和bss是正确的,但是当链接标准库函数时,添加了名为.init和.fini的新节 - 它们与.data相冲突。这是我纠正链接脚本:
/* 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*)
KEEP (*(.init))
KEEP (*(.fini))
_etext = .;
} > FLASH
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > FLASH
.ARM :
{
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
} > FLASH
__end_code = .;
.data : AT(__end_code)
{
_data = .;
_ldata = LOADADDR (.data);
*(vtable)
*(.data*)
_edata = .;
} > SRAM
.bss :
{
_bss = .;
*(.bss*)
*(COMMON)
_ebss = .;
} > SRAM
.heap : AT(_ebss)
{
. = ALIGN(8);
__end__ = .;
PROVIDE(end = .);
__HeapBase = .;
. += HEAP_SIZE;
__HeapLimit = .;
} > SRAM
}
我添加的行KEEP (*(.init))
,KEEP (*(.fini))
和.ARM
段(从另一个MCU连接脚本)。现在一切链接和运行良好。
请注意,'__end_code =。;'可能不是你想要的,如果孤儿节存在。有关更多详细信息,请参阅https://stackoverflow.com/questions/49095127/gnu-linker-orphan-sections-and-symbol-assignment/49095312#49095312 – user2162550