Linux Dynamic Loading of shared libraries

Steve Teale steve.teale at britseyeview.com
Sun Mar 9 23:38:34 PDT 2014


On Sunday, 9 March 2014 at 14:09:28 UTC, Tolga Cakiroglu wrote:

>
> For this, you create an "Interface" that matches to the method 
> declaration of your class. But notice that instead of defining 
> methods, you will define attributes those types' match to that 
> class's methods. I did this before and it works. At least with 
> Posix "dlsym" function's help.

OK, so then what goes wrong here:

module exta;

class ExtA
{
    int n;
    this(int _n) { n = _n; }

    int foo() { return ++n; }
}

ExtA getInstance(int n)
{
    return new ExtA(n);
}

compiled with:
dmd exta.d -c -fPIC -shared
dmd exta.o -shared -defaultlib=libphobos2.so -L-rpath=.

module main;
import core.runtime;
import std.stdio;

extern(C) void* dlsym(void*, const char*);
extern(C) void dlclose(void*);

interface ExtA
{
    int foo();
}

void main() {
    void* lib = Runtime.loadLibrary("exta.so");
    if (lib is null)
    {
       writeln("library not loaded");
       return;
    }
    writeln("loaded");

    void* vp = dlsym(lib, 
"_D4exta11getInstanceFiZC4exta4ExtA\0".ptr);
    if (vp is null)
    {
       writeln("symbol not found");
       return;
    }
    writeln("got symbol");
    ExtA function(int) f = cast(ExtA function(int)) vp;
    ExtA x = f(42);
    if (x is null)
    {
       writeln("no class object");
       return;
    }
    int n = x.foo();
    writefln("n = %d", n);
    Runtime.unloadLibrary(lib);
}

compiled with:
dmd -c main.d
dmd main.o -L-ldl -defaultlib=libphobos2.so -L-rpath=.

output:
loaded
got symbol
n = 9
Segmentation fault (core dumped)

The answer should be 43. The segfault happens on the 
Runtime.unloadLibrary(lib); call.

Any ideas?

Steve




More information about the Digitalmars-d-learn mailing list