Thread overview | ||||||
---|---|---|---|---|---|---|
|
December 23, 2013 undefined reference to `_D15TypeInfo_Struct6__vtblZ' | ||||
---|---|---|---|---|
| ||||
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 } |
December 23, 2013 Re: undefined reference to `_D15TypeInfo_Struct6__vtblZ' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike | Am Mon, 23 Dec 2013 12:03:09 +0000
schrieb "Mike" <none@none.com>:
> 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'
>
It looks like you didn't compile object.d? The vtblZ symbols are only generated when you compile a .d file and then you have to link in the resulting object file, importing alone is not enough.
So something like
arm-eabi-gdc object.d -o object.o
link object.o start.o -o start
|
December 23, 2013 Re: undefined reference to `_D15TypeInfo_Struct6__vtblZ' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Johannes Pfau | On Monday, 23 December 2013 at 12:57:33 UTC, Johannes Pfau wrote: > Am Mon, 23 Dec 2013 12:03:09 +0000 > schrieb "Mike" <none@none.com>: > >> 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' >> > > It looks like you didn't compile object.d? The vtblZ symbols are only > generated when you compile a .d file and then you have to link in the > resulting object file, importing alone is not enough. > > So something like > arm-eabi-gdc object.d -o object.o > link object.o start.o -o start Thanks johannes. I already tried just as you suggested, but when I tried it, I ended up with multiple definitions as shown below. This is why I assumed it was compiled automatically start.o:(.rodata._D6Object6__initZ+0x0): multiple definition of `_D6Object6__initZ' object.o:(.rodata._D6Object6__initZ+0x0): first defined here start.o:(.rodata._D6Object6__vtblZ+0x0): multiple definition of `_D6Object6__vtblZ' object.o:(.rodata._D6Object6__vtblZ+0x0): first defined here start.o:(.data._D6Object7__ClassZ+0x0): multiple definition of `_D6Object7__ClassZ' object.o:(.data._D6Object7__ClassZ+0x0): first defined here start.o:(.rodata._D14TypeInfo_Class6__vtblZ+0x0): multiple definition of `_D14TypeInfo_Class6__vtblZ' object.o:(.rodata._D14TypeInfo_Class6__vtblZ+0x0): first defined here So I'm quite confused. Do I need and object.di file instead? Is there something to naming "object_.d" (trailing underscore) instead of "object.d"? |
December 23, 2013 Re: undefined reference to `_D15TypeInfo_Struct6__vtblZ' | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike | On Monday, 23 December 2013 at 13:19:21 UTC, Mike wrote:
> On Monday, 23 December 2013 at 12:57:33 UTC, Johannes Pfau wrote:
>> Am Mon, 23 Dec 2013 12:03:09 +0000
>> schrieb "Mike" <none@none.com>:
>>
>>> 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'
>>>
>>
>> It looks like you didn't compile object.d? The vtblZ symbols are only
>> generated when you compile a .d file and then you have to link in the
>> resulting object file, importing alone is not enough.
>>
>> So something like
>> arm-eabi-gdc object.d -o object.o
>> link object.o start.o -o start
>
> Thanks johannes. I already tried just as you suggested, but when I tried it, I ended up with multiple definitions as shown below. This is why I assumed it was compiled automatically
>
> start.o:(.rodata._D6Object6__initZ+0x0): multiple definition of `_D6Object6__initZ'
> object.o:(.rodata._D6Object6__initZ+0x0): first defined here
> start.o:(.rodata._D6Object6__vtblZ+0x0): multiple definition of `_D6Object6__vtblZ'
> object.o:(.rodata._D6Object6__vtblZ+0x0): first defined here
> start.o:(.data._D6Object7__ClassZ+0x0): multiple definition of `_D6Object7__ClassZ'
> object.o:(.data._D6Object7__ClassZ+0x0): first defined here
> start.o:(.rodata._D14TypeInfo_Class6__vtblZ+0x0): multiple definition of `_D14TypeInfo_Class6__vtblZ'
> object.o:(.rodata._D14TypeInfo_Class6__vtblZ+0x0): first defined here
>
>
> So I'm quite confused. Do I need and object.di file instead? Is there something to naming "object_.d" (trailing underscore) instead of "object.d"?
Cancel that. I had a makefile typo. My mistake. You are correct.
|
Copyright © 1999-2021 by the D Language Foundation