D shared libraries
BB
b.buderman at gmail.com
Sat Apr 12 07:02:49 PDT 2008
Thanks very much, that worked.
After being able to call into the .so, I see a segmentation fault at the
end of main(). Through gdb I see it's crashing in _d_callfinalizer().
Locally explicitly deleting the object allocated by the .so also results
in a sigsegv. However, calling into the .so to delete the object works
fine.
What is the reasoning for this - is it that the gc is statically linked
into both the .so and the executable, so sharing a reference causes the
local gc to try and clean it up? If so, what are the guidelines/rules
to use?
Thanks again.
Unknown W. Brackets wrote:
> To compile a shared library, Linux using gdc:
>
> gdmd -op -oflibxyz.so.1.0.1 lib.d -fPIC -q,-rdynamic,-shared
> gdmd -op main.d -fPIC -q,-rdynamic -L-ldl
>
> Compiling a shared library on Windows is a bit more complicated
> (although possible with dmd and phobos as they are.) It involves DllMain
> and def files...
>
> Please note, if you have selinux you may have have to run chcon.
>
> -[Unknown]
>
>
> BB wrote:
>> Tried this on D.gnu but didn't get an answer. Any feedback here?
>> ------------------------------------------------------------------
>>
>>
>> From what I read on newsgroups, this should be possible with gdc on
>> linux? Goal is a plugin type solution. With the following code, I
>> compile intf.d and lib.d together into a shared library, and intf.d
>> and main.d into an executable. Compiles/links fine. When I run it, I
>> get a message like:
>>
>> Null library handle: libxyz.so.1.0.1: undefined symbol: __data_start
>>
>> I compiled the .d files with -fPIC and the .so with:
>> gcc -shared -Wl,-soname,libxyz.so.1 -fPIC.
>>
>> Is this definitely possible, and if so, what am I doing wrong? I tried
>> gdc 0.24 and the latest off svn with the same results.
>>
>> TIA.
>>
>> -------------------------------------------------------------
>>
>> intf.d:
>> =========
>> module intf;
>> public interface I { public int getId(); }
>>
>> lib.d:
>> =========
>> module lib;
>> import intf;
>> class A : I { public int getId() { return 42; } }
>> extern (C) { I getObj() { return new A(); } }
>>
>> main.d:
>> ==========
>> ...
>> void main(char[][] args)
>> {
>> void* hnd = dlopen(toStringz("libxyz.so.1.0.1"), RTLD_NOW);
>> if (hnd == null) {
>> printf("Null library handle: %s\n", dlerror());
>> return 0;
>> }
>> ...
>> }
>>
>>
>>
More information about the Digitalmars-d
mailing list