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