Thu, 30 Jul 2009 06:52:14 +0000 (UTC), teo wrote:
> I have difficulties creating a Shared Object (.so) with D. Is it
> possible? Can I use classes defined in the library from the executable?
>
> Here is my library file:
> module test; // file "test.d"
> export int testMe() { return 1; }
> export class Test
> {
> private int n;
> this(int i) { n = i; }
> int get() { return n; }
> }
>
> I compile like shown below:
> $ dmd -fPIC -c test.d
> $ gcc -shared -o libtest.so test.o
>
> [snip]
>
> And this is the program:
> module main; // file "prog.d"
> import std.stdio;
> import test;
> void main()
> {
> writefln("testMe: %d", testMe());
> writefln("Test class: %d", (new Test(3)).get());
> }
>
> I compile it with:
> $ dmd prog.d -L-L`pwd` -L-ltest
>
> And get:
> /usr/bin/ld: dynamic variable `_D4test4Test7__ClassZ' is zero size
> /usr/bin/ld: prog.o(.text._Dmain+0x26): unresolvable R_386_32 relocation
> against symbol `_D4test4Test7__ClassZ'
> /usr/bin/ld: final link failed: Nonrepresentable section on output
> collect2: ld returned 1 exit status
> --- errorlevel 1
>
> Please note that "_D4test4Test7__ClassZ" is defined in the library.
>
> BTW compiling with following works:
> $ dmd test.d prog.d
I get the same results, i.e. it does not work. Though with one
clarification: from the command:
> $ gcc -shared -o libtest.so test.o
I get a warning:
> /usr/lib/gcc/i686-pc-linux-gnu/4.3.3/../../../../i686-pc-linux-gnu/bin/ld:
> warning: creating a DT_TEXTREL in object.
Internets say that this is because test.o is *not* position-independent.
Could this mean that -fPIC switch does not work? Could it be the reason
linking fails?
Reproduced with both DMD 1.046 and 2.031. GCC is 4.3.3 as you can see
from the warning.