Plugins and D programs

Tolga Cakiroglu tcak at pcak.com
Thu Mar 13 14:18:15 PDT 2014


Hi Steve. Well, I had so many experience with this and after many 
tries, I gave up unfortunately. It continuous giving Segmentation 
error.

What I have found is that while the main programme is closing, it 
tries to call "rt_finalize" to remove that object from memory, 
then it says that method is not defined. I complied programme in 
Debug version and used GDB to understand above situation.

(Linux x64, DMD 2.065)

On Thursday, 13 March 2014 at 13:22:55 UTC, Steve Teale wrote:
> One of the primary uses of dynamic loading of libraries might 
> well be to provide plugins. By plugins I mean extensions to an 
> existing program that can be added to the program at run-time, 
> and can be written by separate authors who don't necessarily 
> have access to the source code of the program, but who do 
> understand the rules provided by the program documentation as 
> to what capabilities the plugin must have.
>
> The most obvious way to allow a D program to cope with plugins, 
> is to specify an interface to which the plugin is expected to 
> conform. Communication between the program and the plugin, 
> after the latter is loaded would then be restricted to calls 
> provided by that interface.
>
> One further library method would likely be necessary to allow 
> for the acquisition of an instance of the plugin, and its 
> attachment to the program.
>
> So, we could have
>
> module ifd;
> interface I
> {
>    string saySomething();
> }
>
> The plugin could then be:
>
> module plugin;
> import ifd;
> import std.stdio;
>
> class Plugin: I
> {
>    this() { writeln("plugin ctor"); }
>
>    string saySomething() { return "I am plugin"; }
> }
>
> I getInstance()
> {
>    return new Plugin();
> }
>
> And our program could be:
>
> module main;
> import core.runtime;
> import std.stdio;
> import ifd;
>
> extern(C) void* dlsym(void*, const char*);
> extern(C) void* dlopen(const char*, int);
>
> alias I function() pfi;
>
> I getPlugin(string name)
> {
>    // Take your pick from these two - makes no odds
>    //void* lib = dlopen("plugin.so\0".ptr, 1);
>    void* lib = Runtime.loadLibrary(name~".so");
>
>    if (lib is null)
>    {
>       writeln("failed to load plugin shared object");
>       return null;
>    }
>
>    void* vp = dlsym(lib, 
> "_D6plugin11getInstanceFZC3ifd1I\0".ptr);
>    if (vp is null)
>    {
>       writeln("plugin creator function not found");
>       return null;
>    }
>    pfi f = cast(pfi) vp;
>    I x = f();
> 	if (x is null)
> 	{
> 		writeln("creation of plugin failed");
> 		return null;
> 	}
> 	return x;
> }
>
> void main()
> {
>    I x = getPlugin("plugin");
>    writeln(x.saySomething());
> }
>
> Unfortunately, the result of running the program is:
>
> steve at steve-desktop:~/scratch/piif$ ./main
> plugin ctor
>
> Segmentation fault (core dumped)
>
> Which suggests that the library was loaded, the symbol found, 
> and an instance of plugin created.
>
> The two pieces were built using dmd2.064 with:
>
> main : ifd.d main.d
> 	dmd -c ifd.d
> 	dmd -c main.d
> 	dmd main.o ifd.o -L-ldl -defaultlib=libphobos2.so -L-rpath=.
>
> plugin : plugin.d
> 	dmd -c -shared -fPIC plugin.d
> 	dmd plugin.o -shared -defaultlib=libphobos2.so -map
>
> clean :
> 	rm *.o
> 	rm main
> 	rm plugin.so
>
> Does anyone have any suggestions as to what might be going 
> wrong here? I have further examples, but I guess I should do 
> them one at a time.
>
> Steve



More information about the Digitalmars-d mailing list