2017-07-29 32 views
-1

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の後にヒープを正しく配置するにはスクリプトをどのように調整する必要がありますか?

答えて

0

ヒープと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 
} 

私は(別のMCUのリンカスクリプトから)KEEP (*(.init))KEEP (*(.fini)).ARMセクションの行を追加しました。今はすべてがリンクして正常に動作します。

+0

孤児セクションが存在する場合、 '__end_code =。;'は意図したとおりではないことに注意してください。詳細については、https://stackoverflow.com/questions/49095127/gnu-linker-orphan-sections-and-symbol-assignment/49095312#49095312を参照してください。 – user2162550

関連する問題