Why does object creation give segmentation fault in DLL?
Tolga Cakiroglu
tcak at pcak.com
Sat Feb 22 04:08:26 PST 2014
On Saturday, 22 February 2014 at 11:08:41 UTC, evilrat wrote:
> On Saturday, 22 February 2014 at 09:09:42 UTC, Tolga Cakiroglu
> wrote:
>> I have written a DLL file in Linux (x86_64). It is as below:
>>
>> File: lib.dll
>> =====================
>> class A{}
>>
>> extern(C) void foo(){
>> Object obj = new Object(); // test 1
>>
>> A objA = new A(); // test 2
>>
>> char[] c = new char[ 1024 ]; // test 3
>> }
>>
>>
>> Compilation code is below:
>> dmd -c lib.d -fPIC -debug
>> gcc --shared lib.o -o lib.so
>>
>>
>> Output of programme is like that:
>> library is loaded now
>> foo() function is found
>> unloading libdll.so
>> Segmentation fault (core dumped)
>>
>>
>> Situation is that if either only the `test 1` or `test 3` code
>> is available in the function, there is no error at all. But
>> once I use `test 2` code, it starts giving segmentation fault.
>> Please notice that both `test 1` and `test 2` are creating an
>> object already. And all of them allocates memory with `new`
>> keyword. But only the `test 2` fails. Why is this happening?
>
> you should init runtime in library and set gc proxy for it(if
> implemented on linux, otherwise you would have two gc's running
> simultaneously)
>
> so add following methods to your lib.
>
>
> // lib side
> void initRT()
> {
> import core.runtime();
> Runtime.initilize();
> }
>
> extern(C) void gc_setProxy(void* p);
> void setGCProxy(void* gc)
> {
> gc_setProxy(gc);
> }
>
> // executable side
>
> extern(C) void* gc_getProxy();
>
> void main()
> {
> // load lib here
> initRT();
> setGCProxy(gc_getProxy());
> // do stuff here...
> }
After doing these, even without `test 2` segmentation fault
started coming. I actually do not want to share GC between them
right now.
More information about the Digitalmars-d-learn
mailing list