On 03/13/2014 02:22 PM, Steve Teale wrote:

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

One problem here is that main and the plugin share the definitions in ifd.d. Therefor you need to move the interface into it's own shared library and link both (main and any plugin) against the interface definition.

main : main.d ifd
     dmd -c main.d
     dmd main.o -L-ldl -defaultlib=libphobos2.so -L-rpath=. -L./ifd.so

plugin : plugin.d ifd
     dmd -c -shared -fPIC plugin.d
     dmd plugin.o -shared -defaultlib=libphobos2.so -L./ifd.so

ifd : ifd.d
     dmd -c -shared -fPIC ifd.d
     dmd ifd.o -shared -defaultlib=libphobos2.so

clean :
     rm *.o
     rm main ifd.so plugin.so

Note that it was possible to load plugin.so even though it has undefined symbols because we link with -L--export-symbols (for backtrace symbols). This linker flag causes the main executable to export it's symbols, so the plugin will resolve it's undefined symbols by using the ones from main. I'm still investigating why it crashes when using --export-dynamic though.

Reply via email to