Shared library in D on Linux

Timo Westkämper" <timo.westkamper at gmail.com> Timo Westkämper" <timo.westkamper at gmail.com>
Sun Apr 8 01:45:45 PDT 2012


I am still testing which setup gives me reliable shared D 
libraries which can be used from C.

Here is my latest test:

* test.d:
import std.stdio;
extern (C) {
   void hiD() {
     writeln("hi from D lib");
   }
}

* main.c
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
void main() {
     void (*hiD)(void);
     void* handle = dlopen("./libtest.so", RTLD_LAZY);
     if (handle == NULL) {
         printf("%s\n", dlerror());
         exit(1);
     }	
     hiD = dlsym(handle, "hiD");
     if (hiD != NULL) {
         hiD();
     } else {
         printf("hiD is null\n");
     }
     dlclose(handle);
}

* Makefile
#!/bin/bash
test:
	#gdc-4.6 -g -c test.d -fPIC -o test.o
	#gdc-4.6 -shared -o libtest.so -fPIC test.o -lc -nostartfiles
	dmd -g -c test.d -fPIC
	ld -shared -o libtest.so test.o -lrt -lphobos2 -lpthread
	gcc -g main.c -ldl -lpthread
	./a.out
clean:
	rm -rf *.so *.o *.out

With this setup I get

   ./libtest.so: undefined symbol: _deh_beg

With a fake main method added I get

   make: *** [test] Segmentation fault

This is what I get from gdb

   Program received signal SIGSEGV, Segmentation fault.
   0xb7fd1ed3 in std.stdio.__T7writelnTAyaZ.writeln() 
(_param_0=...) at   /usr/include/d/dmd/phobos/std/stdio.d:1550
   1550	    enforce(fprintf(.stdout.p.handle, "%.*s\n",

Event with the following startup hooks

extern(C) {

   void gc_init();
   void gc_term();

   void _init() {
     gc_init();
   }

   void _fini() {
     gc_term();
   }

}

I get the same error. I am using dmd 2.058 on Ubuntu 11.10 (32 
bit)

With gdc I get different errors, but it seems even more difficult 
to get it working.

Does anyone know what is missing to get proper shared library 
support working on Linux?




More information about the Digitalmars-d mailing list