[dmd-internals] Linker errors with g++

Daniel Murphy yebblies at gmail.com
Thu Dec 5 19:05:06 PST 2013


I've almost gotten DDMD to link on 64-bit linux, but there's an annoying
difference with g++ vs dmc.

../dmd/src/glue.a(e2ir.o):(.rodata._ZTV9SymbolExp[_ZTV9SymbolExp]+0x90):
undefined reference to `Expression::toString()'
../dmd/src/glue.a(e2ir.o):(.rodata._ZTV9SymbolExp[_ZTV9SymbolExp]+0xe0):
undefined reference to `Expression::inferType(Type*, int, Scope*,
Array<TemplateParameter>*)'
../dmd/src/glue.a(e2ir.o):(.rodata._ZTV9SymbolExp[_ZTV9SymbolExp]+0x170):
undefined reference to `Expression::buildArrayIdent(OutBuffer*,
Array<Expression>*)'
../dmd/src/glue.a(e2ir.o):(.rodata._ZTV9SymbolExp[_ZTV9SymbolExp]+0x178):
undefined reference to `Expression::buildArrayLoop(Array<Parameter>*)'
../dmd/src/glue.a(tocsym.o):(.rodata._ZTV17SymbolDeclaration[_ZTV17SymbolDeclaration]+0x188):
undefined reference to `Dsymbol::addComment(unsigned char const*)'
../dmd/src/glue.a(tocsym.o):(.rodata._ZTV24TypeInfoClassDeclaration[_ZTV24TypeInfoClassDeclaration]+0x188):
undefined reference to `Dsymbol::addComment(unsigned char const*)'
../dmd/src/glue.a(typinf.o):(.rodata._ZTV24TypeInfoConstDeclaration[_ZTV24TypeInfoConstDeclaration]+0x188):
undefined reference to `Dsymbol::addComment(unsigned char const*)'
../dmd/src/glue.a(typinf.o):(.rodata._ZTV28TypeInfoInvariantDeclaration[_ZTV28TypeInfoInvariantDeclaration]+0x188):
undefined reference to `Dsymbol::addComment(unsigned char const*)'
../dmd/src/glue.a(typinf.o):(.rodata._ZTV25TypeInfoSharedDeclaration[_ZTV25TypeInfoSharedDeclaration]+0x188):
undefined reference to `Dsymbol::addComment(unsigned char const*)'
../dmd/src/glue.a(typinf.o):(.rodata._ZTV23TypeInfoWildDeclaration[_ZTV23TypeInfoWildDeclaration]+0x188):
more undefined references to `Dsymbol::addComment(unsigned char const*)'
follow

These appear to happen because a class (SymbolExp) has a member function
written in e2ir.c, and g++ is writing out the full vtable complete with
references to the actual functions, whereas dmc just references the vtable
symbol.  It then fails because eg toString was renamed to _toString,
templated structs are currently mangled wrong, unsigned char is mangled
differently to 'char' etc

Is there a way anyone knows of to make g++ just reference the vtable
symbol, and not re-emit the contents?

Thanks,
Daniel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/dmd-internals/attachments/20131206/bbb888ee/attachment.html>


More information about the dmd-internals mailing list