Creating and loading D plugins in D app

H. S. Teoh via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Jun 2 09:36:34 PDT 2017


On Fri, Jun 02, 2017 at 12:19:48PM +0000, Adam D. Ruppe via Digitalmars-d-learn wrote:
> On Friday, 2 June 2017 at 11:09:05 UTC, aberba wrote:
> > 1. Get shared libs to work in D (the best approach for all D code)
> 
> I have done very little with this myself but other people have so it is
> doable.
[...]

This is not directly related to the OP's question, but recently I wrote
a program that, given a user-specified string, transforms it into D code
using a code template, invokes dmd to compile it into a shared object,
loads the shared object using dlopen(), and looks up the generated
function with dlsym() to obtain a function pointer that can be used for
calling the function. The shared object is unloaded after it's done.

So it's definitely doable, in the sense that I've successfully generated
D code, compiled it into a shared library, loaded it into the running
executable, and can call the code.  Of course, in my case, the code
template is relatively simple so I don't have to worry about things like
module ctors, shared data, non-TLS globals, or GC use.  If you're
planning to support those features, you might need to do a bit more work
after calling dlopen(). At the very least you'd have to use dlsym() to
look up module ctor symbols and run them before calling any other
functions in the shared object, and you may have to initialize druntime
in the shared object too, if it's statically linked.  I'm not sure what
happens if it's dynamically linked, or if it uses its own copy of the
GC.

In any case, this is all possible, it just takes someone to dig into the
details and write the code to make it all work.  Then publish it on
github or dub, and the rest of us can reap the benefits too. ;-)


T

-- 
PNP = Plug 'N' Pray


More information about the Digitalmars-d-learn mailing list