Shared Object with DMD v2.031

teo teo.ubuntu.remove at yahoo.com
Fri Jul 31 11:50:28 PDT 2009


On Fri, 31 Jul 2009 18:47:29 +0400, Sergey Gromov wrote:

> 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.

I got it working:
0) setup
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib

1) compile the library and move it in /opt/lib
$ dmd -fPIC -c test.d
$ gcc -shared -o libtest.so test.o
$ dmd -c -H -o- test.d

2) compile the program
$ dmd prog.d test.di -L-L/opt/lib -L-ltest

The output of ldd is:
$ ldd prog
	linux-gate.so.1 =>  (0xb8075000)
	libtest.so => /opt/lib/libtest.so (0xb8070000)
	libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb8053000)
	libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb802c000)
	libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7ec9000)
	/lib/ld-linux.so.2 (0xb8076000)

My problem was that I thought that DMD will read the .so and will obtain 
required information from there, but it obviously needs the .di file.

You should try again - this above is the complete procedure.


More information about the Digitalmars-d-learn mailing list