Thanks for all the help lately. I'm sorry to be flooding this list with so many questions, but I'm making good progress, and still running into some things I don't quite understand.

I'm getting the following linker error as soon as I add a struct to my code.

undefined reference to `_D15TypeInfo_Struct6__vtblZ'

I'm guessing this is because GDC is not generating the vtbl for my TypeInfo_Struct class.

Is this because I'm missing something in my runtime implementation, or could this be a code generation bug?

I ran objdump on my object file, and this symbmol did not appear.

I'm using GDC 4.8 arm-none-eabi:

(compile) arm-none-eabi-gdc -mthumb -mcpu=cortex-m4 -fno-emit-moduleinfo -ffunction-sections -fdata-sections -c start.d -o start.o

(link) arm-none-eabi-ld -T link.ld start.o -o start.elf


I've reduce my code quite a bit to the following, just to make the problem reproducible:

*********
start.d
*********
alias void function() ISR;
extern(C) immutable ISR[1] ISRVectorTable =
[
    &OnReset
];

void OnReset()
{
  while(true)
  { }
}

**********
object.d
**********
module object;

alias uint               size_t;
alias immutable(char)[]  string;

class Object
{}

class TypeInfo
{}

class TypeInfo_Struct : TypeInfo
{
    string name;
void[] m_init; // initializer; init.ptr == null if 0 initialize

    @safe pure nothrow
    {
        size_t   function(in void*)           xtoHash;
        bool     function(in void*, in void*) xopEquals;
        int      function(in void*, in void*) xopCmp;
        char[]   function(in void*)           xtoString;

        enum StructFlags : uint
        {
            hasPointers = 0x1,
        }
        StructFlags m_flags;
    }
    void function(void*)                    xdtor;
    void function(void*)                    xpostblit;

    uint m_align;
immutable(void)* m_RTInfo; // data for precise GC
}

***************
Linker Script
***************
MEMORY
{
  CCRAM    (rxw) : ORIGIN = 0x10000000, LENGTH =   64k
  SRAM     (rxw) : ORIGIN = 0x20000000, LENGTH =  128k
  FLASH    (rx)  : ORIGIN = 0x08000000, LENGTH = 1024k
}

_stackStart = ORIGIN(CCRAM) + LENGTH(CCRAM);

SECTIONS
{
    /* Don't need exception stuff right now */
    /DISCARD/ :
    {
        *(.ARM.extab*)
        *(.ARM.exidx*)
    }

    .text :
    {
        LONG(_stackStart);            /* Initial stack pointer */
        KEEP(*(*.ISRVectorTable))     /* Interrupt vector table */
        
        . = ALIGN(4);
        /* the code */
        *(.text)
        *(.text*)
        
        /* for "hello\r\n" string constant */
        . = ALIGN(4);
        *(.rodata)
        *(.rodata*)

        . = ALIGN(4);
        dataRomStart = .;
    } >FLASH

    .data : AT (dataRomStart)
    {
        . = ALIGN(4);
        dataRamStart = .;
        
        . = ALIGN(4);
        *(.data)
        *(.data*)

        . = ALIGN(4);
        dataRamEnd = .;
    } >SRAM

    .bss :
    {
        . = ALIGN(4);
        bssStart = .;

        *(.bss)
        *(.bss*)

        . = ALIGN(4);
        bssEnd = .;
    } >SRAM
}

Reply via email to