LM3S8962的C ++程序的链接器脚本使用Codesourcery lite工具链进行非托管?

时间:2011-01-21 08:13:02

标签: c++ embedded g++ ld cortex-m3

有没有人专门为Stellaris LM3S8962电路板设置链接器脚本,或者可以解释如何创建一个?我正在使用codesourcery g ++ lite工具链,并且可以使用此链接描述文件成功为托管环境创建elf文件:

这不适用于非托管库。我发现的所有例子都只适用于C而不是C ++,而cs3启动代码似乎有些神奇。任何帮助表示赞赏。

谢谢, 麦克

2 个答案:

答案 0 :(得分:2)

这些是C ++链接描述文件(来自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

在你的创业公司的某个地方,你需要打电话:

bl __libc_init_array

如果您使用http://www.google.com/codesearch,您应该能够找到特定于设备的内容。

答案 1 :(得分:1)

以下是我最终的结果:

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 ( * )
    }
}