Defining symbols in a linker script

Mike via D.gnu d.gnu at puremagic.com
Fri Apr 18 17:34:24 PDT 2014


Hello,

It is common practice in ARM Cortex-M bare metal C/C++ programs 
to define symbols in the linker so one can initialize the .data 
and .bss segments and know the boundaries of one's stack and 
heap.  It looks something like this.

**** linkerscript ****
__text_end__ = .;

.data : AT(__text_end__)
{
     __data_start__ = .;
     *(.data)
     *(.data.*)
     __data_end__ = .;
} > SRAM

**** C++ file ****
extern "C" uint32_t __text_end__;
extern "C" uint32_t __data_start__;
extern "C" uint32_t __data_end__;

void startup()
{
     // copy mutable state out of ROM into RAM
     memcpy(&__data_start__, &__text_end__, (&__data_end__ - 
&__data_start__) * 4);
}

I tried to do something similar in D with...

extern(C) __gshared uint __text_end__;
extern(C) __gshared uint __data_start__;
extern(C) __gshared uint __data_end__;

... but unfortunately this puts new variables in the .bss 
segment.  I want the un-mangled name, so I can refer to it 
easily, but I also want it to be truly "extern" (defined 
elsewhere).  Is that possible at this moment in D?

Thanks for the help,
Mike


More information about the D.gnu mailing list