January 19, 2010 dlopen() with GDC | ||||
---|---|---|---|---|
| ||||
After a good deal of fiddling about, I got a shared library generated from D to load using dlopen() in a D program. The shared library was built from: int foo() { return 42; } gdc -c loaded.d gcc -shared -o liblddd.so loaded.o -lc The loader was - excluding a lot of error checking code: import std.stdio; import std.c.linux.linux; enum { RTLD_LAZY = 1, RTLD_NOW = 2, RTLD_GLOBAL = 4 } extern (C) { int errno; // Where is this in Phobos? } void main() { void* handle = dlopen("./liblddd.so\0".ptr, RTLD_LAZY); int function() fp = cast(int function()) dlsym(handle, ("_D6loaded3fooFZi\0").ptr); int n = fp(); writefln("n = %d", n); dlclose(handle); } Finally it worked, and I was just patting myself on the back when I realized I had missed out the -fPIC in the compilation of the library. So I did: gdc -fPIC -c loaded.d gcc -shared -o liblddd.so loaded.o -lc and then it stopped working - dlopen() returning null. Has anyone any idea why this should be so? Dumps from readelf of the header and symbols are quite similar except that the symbols for the version compiled with -fPIC has a line: 9: 0000200c 4 OBJECT LOCAL HIDDEN 22 DW.ref.__gdc_personality_ |
Copyright © 1999-2021 by the D Language Foundation