Thread overview
Undefined _D10TypeInfo_l6__initZ and _D15TypeInfo_Struct6__vtblZ added when instantiating template structs
Jan 26, 2015
Liran Zvibel
Jan 26, 2015
Laeeth Isharc
Jan 26, 2015
Mike
Feb 18, 2015
Liran Zvibel
Jan 26, 2015
Iain Buclaw
January 26, 2015
Hi,

I would like to use some D code in a C binary
.
Part of the D functionality used is by instantiating templated structs.

Even if I just try to compile the following simple code:

extern (C) {
    alias mytpye = BLA!(int);
    struct BLA(T) {
        T x;
    }
}

With the following gcd flags:
-fno-invariants -fno-in -fno-out -fno-bounds-check -O3 -fno-assert -c -nophoboslib  -nostdlib

I still have 3 undefined symbols:
_D10TypeInfo_i6__initZ _D15TypeInfo_Struct6__vtblZ _Dmodule_ref

I can alway just define them in the C glue code and get it over with, but I would like to understand what I SHOULD do to get it to easily link into a normal C executable.

Thanks!
Liran
January 26, 2015
On Monday, 26 January 2015 at 17:50:59 UTC, Liran Zvibel wrote:
> Hi,
>
> I would like to use some D code in a C binary
> .
> Part of the D functionality used is by instantiating templated structs.
>
> Even if I just try to compile the following simple code:
>
> extern (C) {
>     alias mytpye = BLA!(int);
>     struct BLA(T) {
>         T x;
>     }
> }
>
> With the following gcd flags:
> -fno-invariants -fno-in -fno-out -fno-bounds-check -O3 -fno-assert -c -nophoboslib  -nostdlib
>
> I still have 3 undefined symbols:
> _D10TypeInfo_i6__initZ _D15TypeInfo_Struct6__vtblZ _Dmodule_ref
>
> I can alway just define them in the C glue code and get it over with, but I would like to understand what I SHOULD do to get it to easily link into a normal C executable.
>
> Thanks!
> Liran


Is the BLA struct instantiated somewhere?
January 26, 2015
On Monday, 26 January 2015 at 17:50:59 UTC, Liran Zvibel wrote:

> With the following gcd flags:
> -fno-invariants -fno-in -fno-out -fno-bounds-check -O3 -fno-assert -c -nophoboslib  -nostdlib
>
> I still have 3 undefined symbols:
> _D10TypeInfo_i6__initZ _D15TypeInfo_Struct6__vtblZ _Dmodule_ref
>

If you're compliling with -nophoboslib, you are also compiling without the runtime, not just phobos.  GDC compiles them in one library, IIRC.

Therefore, you have to implement those parts of the runtime the compiler inserts implicitly.  This includes TypeInfo and ModuleInfo.  You can compile with -fno-emit-moduleinfo to get rid of the _Dmodule_ref symbol, but there's no equivalent yet for TypeInfo.

Depending on what features of D you are employing, you may be able to stub out the TypeInfo in your object.d file.  I have an example here:
https://github.com/JinShil/D_Runtime_ARM_Cortex-M_study/wiki/1.3-Structs.  For 64-bit it may need to be different.  See: https://github.com/JinShil/druntime_level_0/blob/master/source/object.d

I figured out the size of each `ignore` array by trial and error.

Mike
January 26, 2015
On 26 January 2015 at 17:50, Liran Zvibel via D.gnu <d.gnu@puremagic.com> wrote:
> Hi,
>
> I would like to use some D code in a C binary
> .
> Part of the D functionality used is by instantiating templated structs.
>
> Even if I just try to compile the following simple code:
>
> extern (C) {
>     alias mytpye = BLA!(int);
>     struct BLA(T) {
>         T x;
>     }
> }
>
> With the following gcd flags:
> -fno-invariants -fno-in -fno-out -fno-bounds-check -O3 -fno-assert -c
> -nophoboslib  -nostdlib
>

-frelease -O3 -c does the same as -fno-invariants -fno-in ...

> I still have 3 undefined symbols:
> _D10TypeInfo_i6__initZ _D15TypeInfo_Struct6__vtblZ _Dmodule_ref
>
> I can alway just define them in the C glue code and get it over with, but I would like to understand what I SHOULD do to get it to easily link into a normal C executable.
>

There is work underway to talk about what will need to be done to implement @notypeinfo or a similarly named attribute.  Until then you need to link against libdruntime - or a library that provides a minimal implementation/stubs (ie: minlibd)

As I'm typing this, I can see Mike has replied, probably with this same answer. :)

Iain.
February 18, 2015
On Monday, 26 January 2015 at 23:21:23 UTC, Mike wrote:
>
> If you're compliling with -nophoboslib, you are also compiling without the runtime, not just phobos.  GDC compiles them in one library, IIRC.
>
> Therefore, you have to implement those parts of the runtime the compiler inserts implicitly.  This includes TypeInfo and ModuleInfo.  You can compile with -fno-emit-moduleinfo to get rid of the _Dmodule_ref symbol, but there's no equivalent yet for TypeInfo.
>
> Depending on what features of D you are employing, you may be able to stub out the TypeInfo in your object.d file.  I have an example here:
> https://github.com/JinShil/D_Runtime_ARM_Cortex-M_study/wiki/1.3-Structs.
>  For 64-bit it may need to be different.  See: https://github.com/JinShil/druntime_level_0/blob/master/source/object.d
>
> I figured out the size of each `ignore` array by trial and error.
>
> Mike


I'm using https://github.com/JinShil/druntime_level_0/ and it works very well for me.

Thank you very much!
Liran