rendered paste body[gregor@gdeskgor test]$ cat so.d
import std.stdio;
import std.gc;
class Foo {
this() { a = 3; }
int a;
}
extern(C) Foo mkfoo()
{
return new Foo();
}
extern(C) void foocollect()
{
std.gc.fullCollect();
}
extern(C) void usefoo(Foo a)
{
writefln("%d", a.a);
}
[gregor@gdeskgor test]$ cat getso.d
import std.stdio;
import std.string;
import std.gc;
extern (C) void *dlopen(char *, int);
extern (C) char *dlerror();
extern (C) void *dlsym(void *, char *);
extern (C) void perror(char *);
int main()
{
void *hnd = dlopen("so.d.so", 2);
Object function() mkfoo =
cast(Object function()) dlsym(hnd, "mkfoo");
void function() foocollect =
cast(void function()) dlsym(hnd, "foocollect");
void function(Object) usefoo =
cast(void function(Object)) dlsym(hnd, "usefoo");
Object foo = mkfoo();
std.gc.fullCollect();
foocollect();
usefoo(foo);
return 0;
}
[gregor@gdeskgor test]$ gdc -fPIC -shared -nostdlib so.d -o so.d.so
[gregor@gdeskgor test]$ gdc -rdynamic -ldl getso.d -o getso
[gregor@gdeskgor test]$ LD_LIBRARY_PATH=. ./getso
3