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