<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Feb 28, 2014 at 10:27 AM, Martin Nowak <span dir="ltr"><<a href="mailto:code@dawg.eu" target="_blank">code@dawg.eu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">On 02/26/2014 10:16 PM, Timothee Cour wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Currently (on OSX) I can runtime load a D dll from a C program, but not<br>
from a D program, which seems silly.<br>
<br>
Is it possible to runtime load a D shared library as a standalone (ie<br>
without sharing GC, runtime or any other data), treating it as if we<br>
were loading from a C program (making no attempt at sharing druntime or<br>
otherwise).<br>
<br>
What do I need to change in druntime to make this possible?<br>
<br>
</blockquote></div></div>
Depends on why it doesn't work.<br></blockquote><div><br></div><div><br></div><div>Here's an example. </div><div>If it works from inside C++ there should be a way to make it work from inside D isn't there?  (eg by isolating the GC of the shared library from the GC of the main program, etc).</div>
<div><br></div><div>main.d:</div><div>call a D shared library via dlopen/dlsym <br></div><div>foo.d:</div><div><div>extern(C) void foo(){</div><div>  printf("inside_foo\n"); //ok</div><div>  import core.runtime;</div>
<div>  bool ret=Runtime.initialize();//will segfault below with or without that</div><div>  assert(ret);//ok</div><div>  int[]a;</div><div>  a.length=2;//segfault</div></div><div>}</div><div><br></div><div><br></div><div>
dmd -g -oflibfoo.dylib -shared foo.d</div><div>dmd -g -oftest main.d</div><div>./test</div><div>#Loading shared libraries isn't yet supported on OSX.</div><div>#inside_foo</div><div>#segfault at first occurence of gc (a.length=2 above)</div>
<div><br></div><div>under lldb:</div><div><br></div><div><div>* thread #1: test D2rt12sections_osx9tlsOffsetFPvZm + 109, stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)</div><div>    frame #0: test D2rt12sections_osx9tlsOffsetFPvZm + 109</div>
<div>    frame #1:  test __tls_get_addr + 20</div><div>    frame #2:  libfoo.dylib _d_arraysetlengthT + 3701</div></div><div> ...</div><div><br></div><div><br></div><div> </div></div><br></div></div>