dynamic library building and loading

Jacob Carlborg doob at me.com
Thu Sep 27 01:26:47 PDT 2012


On 2012-09-27 10:04, Maxim Fomin wrote:
> On Thursday, 27 September 2012 at 05:52:44 UTC, Jens Mueller
> wrote:
>> Maxim Fomin wrote:
>>> You can build shared libraries on linux by manually compiling object
>>> files and linking them. On windows last time I tries it was not
>>> possible.
>>
>> Can you give detailed steps for doing this on Linux? Because nobody as
>> far as I know has made this work yet?
>>
>> Jens
>
> Dpaste seems not working, so, sorry for code
>
> ----lib.d---
> import std.stdio;
>
> static this()
> {
>      writeln("module ctor");
> }
>
> static ~this()
> {
>      writeln("module dtor");
> }
>
> class A
> {
>      private string text;;
>      this(string text)
>      {
>          writeln("class ctor");
>          this.text = text;
>      }
>      void tell()
>      {
>          writeln(this.text);
>      }
>      ~this()
>      {
>          writeln(this.text);
>          writeln("dtor");
>      }
>      static this()
>      {
>          writeln("static ctor");
>      }
>      static ~this()
>      {
>          writeln("static dtor");
>      }
> }
> ---------------
> -----main.d----
> import lib;
>
> void main()
> {
>      auto a = new A("some text");
>      a.tell();
> }
> ---------------
>
> dmd -c -fPIC lib.d
> gcc -shared lib.o -o liblib.so
> dmd -c main.d
> gcc main.o -llib -lphobos2 -lrt -lpthread -L. -Wl,-rpath=.
> ./a.out
> ldd a.out
>      linux-vdso.so.1 (0x00007fff703ff000)
>      liblib.so => ./liblib.so (0x00007f48158f1000)
>      librt.so.1 => /lib64/librt.so.1 (0x00007f48156cd000)
>      libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f48154b1000)
>      libc.so.6 => /lib64/libc.so.6 (0x00007f481510c000)
>      /lib64/ld-linux-x86-64.so.2 (0x00007f4815af4000)

1. Does this actually run?

2. This is statically linked with druntime and Phobos. What happens when 
you create an executable that links with the D dynamic library?

Last time I tried this (on Mac OS X) I got several symbols missing. This 
was all symbols that are usually pointing to the executable, inserted by 
the compiler. One of them would be "main" and symbols like these:

https://github.com/D-Programming-Language/druntime/blob/master/src/rt/deh2.d#L27

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list