On Wednesday, 8 January 2014 at 19:13:36 UTC, Timo Sintonen wrote:
On Wednesday, 8 January 2014 at 15:52:25 UTC, Johannes Pfau wrote:


Stupid question, but are C++ exceptions working for you? I think we don't change anything inthe compiler related to exception handling, so if C++ worked and D didn't it could only be a problem with the runtime
code?

I have never used c++ in this platform and I do not know what it would require. Some commercial toolsets use gcc as backend but I do not know if they have c++.

I use C++ exceptions on an STM32F4 (ARM Cortex-M4F) with the GNU Tools for ARM Embedded Processors (https://launchpad.net/gcc-arm-embedded). To get it to work, however, I had to make changes to my linker script. Here's the linker script I'm currently using:

/*******************************************************
Memory Spaces Definitions
*********************************************************/
MEMORY
{
  CCRAM    (rxw) : ORIGIN = 0x10000000, LENGTH =  64k
  RAM      (rxw) : ORIGIN = 0x20000000, LENGTH = 128k
  FLASH    (rx)  : ORIGIN = 0x08000000, LENGTH = 1024k
}

/******************************************************
higher address of the user mode stack
*********************************************************/
_estack = ORIGIN(CCRAM) + LENGTH(CCRAM);

/********************************************************
 Section Definitions
**********************************************************/
SECTIONS
{
        .ccm (NOLOAD) :
        {
        . = ALIGN(4);
        *(.ccm)
        . = ALIGN(4);
        } >CCRAM

.isr_vector : /* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
    {
        . = ALIGN(4);
        KEEP(*(.isr_vector))            /* Startup code */
        . = ALIGN(4);
    } >FLASH


.text : /* the program code is stored in the .text section, which goes to Flash */
    {
            . = ALIGN(4);
        *(.text)                        /* remaining code */
        *(.text.*)                      /* remaining code */
*(.rodata) /* read-only data (constants) */
        *(.rodata*)
        *(.glue_7)
        *(.glue_7t)

                *(.eh_frame)                    /* C++ Exception Handling */
                
. = ALIGN(4); /* now make sure we keep the C++ constructors */
                KEEP (*(.init))
                . = ALIGN(4);
                KEEP (*(.fini))

                . = ALIGN(4);
                __preinit_array_start = .;
                KEEP (*(.preinit_array))
                __preinit_array_end = .;

                . = ALIGN(4);
                __init_array_start = .;
                KEEP (*(SORT(.init_array.*)))
                KEEP (*(.init_array))
                __init_array_end = .;

                . = ALIGN(4);
                __fini_array_start = .;
                KEEP (*(.fini_array))
                KEEP (*(SORT(.fini_array.*)))
                __fini_array_end = .;

                . = ALIGN(0x4);
                KEEP (*crtbegin.o(.ctors))
                KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
                KEEP (*(SORT(.ctors.*)))
                KEEP (*crtend.o(.ctors))

                . = ALIGN(0x4);
                KEEP (*crtbegin.o(.dtors))
                KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
                KEEP (*(SORT(.dtors.*)))
                KEEP (*crtend.o(.dtors))

            . = ALIGN(4);
        _etext = .;
    } >FLASH
        
    .ARM.extab :
    {
        *(.ARM.extab* .gnu.linkonce.armextab.*)
    } >FLASH

        
    .ARM :
    {
        __exidx_start = .;
        *(.ARM.exidx*)
        __exidx_end = .;
    } >FLASH

        
_sidata = .; /* This is used by the startup in order to initialize the .data secion */


        /******************************************************
         This is the initialized data section.  It is one task of the
         startup to copy the initial values from FLASH to RAM.
        ******************************************************/
    .data  : AT ( _sidata )
    {
            . = ALIGN(4);
_sdata = . ; /* This is used by the startup in order to initialize the .data secion */
        _data = . ;

        *(.data)
        *(.data.*)
        *(.RAMtext)

            . = ALIGN(4);
        
_edata = . ; /* This is used by the startup in order to initialize the .data secion */
    } >RAM

_eidata = _sidata + (_edata - _sdata); /*calculate end address of idata*/

_lastdataromaddress = ORIGIN(FLASH) + LENGTH(FLASH); /*check that idata remains in FLASH region*/
    ___toobig___ = ( _eidata > _lastdataromaddress) ? 1 : 0 ;
___toobigmsg___ = ( ___toobig___ ) ? "!!!!!!!!! FLASH IS FULL !!!!!!!!!" : 0 ;


        /*****************************************************
         This is the uninitialized data section
        **********************************************/
    .bss :
    {
            . = ALIGN(4);
_sbss = .; /* This is used by the startup in order to initialize the .bss secion */
        _bss = .;

        *(.bss)
        *(.bss*)
        *(COMMON)

            . = ALIGN(4);
        
_ebss = . ; /* This is used by the startup in order to initialize the .bss secion */
    } >RAM

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


/************************************************************
 Discard debug info
******************************************************/
    /DISCARD/ :
    {
        libc.a ( * )
        libm.a ( * )
        libgcc.a ( * )
                libstdc++.a ( * )
                libsupc++.a ( * )
    }

    .ARM.attributes 0 : { *(.ARM.attributes) }
}

Reply via email to