TM4C ARMマイクロコントローラ(_sbrk
にはend
シンボルが必要)で標準ライブラリ関数を使用するために小さなヒープを追加する必要があります。これは私のリンカスクリプトでGNUリンカーARM - セクションが重複する理由は?
(マイコンのデモに付属):
ld: section .init loaded at [000126b4,000126bf] overlaps section .data loaded at [000126b4,00012f8f]
collect2: error: ld returned 1 exit status
:
/* 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
}
私は.dataの/の.textが、私はリンクエラーを取得するために、.bssの類推後.heap追加します
AT(ADDR(.bss) + SIZEOF(.bss))
を削除した場合も同様です。 .heapを削除してlibc関数を呼び出すと、すべてがコンパイルされてリンクされ、出力バイナリが正しく実行されます。
bssの後にヒープを正しく配置するにはスクリプトをどのように調整する必要がありますか?
孤児セクションが存在する場合、 '__end_code =。;'は意図したとおりではないことに注意してください。詳細については、https://stackoverflow.com/questions/49095127/gnu-linker-orphan-sections-and-symbol-assignment/49095312#49095312を参照してください。 – user2162550