2 Stimmen

Linker-Skript für C++-Programm für LM3S8962 unhosted mit Codesourcery lite toolchain?

Hat jemand ein Linker-Skript speziell für das Stellaris LM3S8962 Board oder kann erklären, wie man eines erstellt? Ich verwende die Codesourcery g++ lite toolchain und kann mit diesem Linker-Skript erfolgreich die elf-Datei für die gehostete Umgebung erstellen:

Dies funktioniert nicht mit den nicht gehosteten Bibliotheken. Alle Beispiele, die ich gefunden habe, funktionieren nur für C und nicht für C++, und es scheint etwas Magie in Bezug auf den Cs3-Startcode zu geben. Jede Hilfe geschätzt.

Danke! Mike

2voto

leppie Punkte 111830

Dies sind die zusätzlichen Abschnitte in einem C++-Linkerskript (von STM32):

  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >FLASH
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >FLASH
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array*))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

Die irgendwo in Ihrem Startup, müssen Sie anrufen:

bl __libc_init_array

Wenn Sie http://www.google.com/codesearch sollten Sie in der Lage sein, etwas Gerätespezifisches zu finden.

1voto

mikelong Punkte 3504

Ich habe folgendes Ergebnis erzielt:

OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
GROUP(crti.o crtn.o crtbegin.o crtend.o)
ENTRY(Reset_Handler)                                         /* entry Point */

MEMORY {                                           /* memory map of LM3S811 */
    ROM (rx)  : ORIGIN = 0x00000000, LENGTH = 256K
    RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
}

/* The size of the stack used by the application. NOTE: you need to adjust  */
STACK_SIZE = 24K;

/* The size of the heap used by the application. NOTE: you need to adjust   */
HEAP_SIZE = 0K;

SECTIONS {
    .  = 0x0;
    .isr_vector : {                 /* the vector table goes FIRST into ROM */
        KEEP(*(.isr_vector))                                /* vector table */
        . = ALIGN(4);
    } >ROM

    .text : {                                         /* code and constants */
        . = ALIGN(4);
        *(.text)                                   /* .text sections (code) */
        *(.text*)                                 /* .text* sections (code) */
        *(.rodata)           /* .rodata sections (constants, strings, etc.) */
        *(.rodata*)         /* .rodata* sections (constants, strings, etc.) */

        KEEP (*(.init))
        KEEP (*(.fini))

        . = ALIGN(4);
    } >ROM

    __exidx_start = .;
    .ARM.exidx : {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    } >ROM
    __exidx_end = .;

    .preinit_array : {
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP (*(.preinit_array*))
        PROVIDE_HIDDEN (__preinit_array_end = .);
    } >ROM

    .init_array : {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
    } >ROM

    .fini_array : {
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP (*(.fini_array*))
        KEEP (*(SORT(.fini_array.*)))
        PROVIDE_HIDDEN (__fini_array_end = .);
    } >ROM

    _etext = .;                            /* global symbols at end of code */
    .vtable : {                 /* the vector table goes FIRST into RAM */
        KEEP(*(.vtable))                                /* vector table */
        . = ALIGN(4);
    } >RAM
    .data :  AT (_etext) {
        __data_load = LOADADDR (.data);
        __data_start = .;
        *(.data)                                          /* .data sections */
        *(.data*)                                        /* .data* sections */
        . = ALIGN(7);
        __data_end__ = .;
        _edata = __data_end__;
    } >RAM

    .bss : {
        __bss_start__ = . ;
        *(.bss)
        *(.bss*)
        *(COMMON)
        . = ALIGN(4);
        _ebss = .;                     /* define a global symbol at bss end */
        __bss_end__ = .;
    } >RAM

    PROVIDE ( end = _ebss );
    PROVIDE ( _end = _ebss );
    PROVIDE ( __end__ = _ebss );

    .heap : {
        __heap_start__ = . ;
        . = . + HEAP_SIZE;
        . = ALIGN(8);
        __heap_end__ = . ;
    } >RAM

    .stack : {
        __stack_start__ = . ;
        . = . + STACK_SIZE;
        . = ALIGN(8);
        __c_stack_top__ = . ;
        __stack_end__ = . ;
    } >RAM

    /* Remove information from the standard libraries */
    /DISCARD/ : {
        libc.a ( * )
        libm.a ( * )
        libgcc.a ( * )
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X