digitalmars.D - Creating a dynamic library on Linux with DMD
- Frank Benoit (5/5) Jun 07 2007 I want to call D from Java.
- Robert Fraser (4/11) Jun 07 2007 Yes; it is. Use extern(C) and don't worry too much about the calling con...
- Frank Benoit (3/3) Jun 10 2007 Hm, ppl telling me, that building a .so is possible with GDC and not
- Frits van Bommel (5/9) Jun 10 2007 IIRC, to build a .so the compiler backend needs to be able to generate
- Frank Benoit (72/72) Jun 10 2007 I found that "nm -u libT.so" tells me about lots of unresolved symbols.
- Frits van Bommel (29/32) Jun 10 2007 (This assumes GDC)
- Frank Benoit (2/2) Jun 10 2007 OK, so there is really no chance with DMD :/
- Frits van Bommel (13/15) Jun 10 2007 Now that I think about it, the D spec specifies:
- Frank Benoit (5/5) Jun 10 2007 With "I want to export only "extern(C)" functions." i meant "i do only
- Frits van Bommel (10/15) Jun 10 2007 AFAIK, what I wrote /should/ make it "impossible" to link to hidden
- Frank Benoit (1/3) Jun 10 2007 yes, same timezone *yawn*
I want to call D from Java. I think, I need a dynamic library (.so) which implements generated C stubs. The lib does only need to export those C function. The lib shall contain the needed runtime. (and i want to use tango) Is that possible?
Jun 07 2007
Yes; it is. Use extern(C) and don't worry too much about the calling convention stuff (I got it working on Linux and Windows). If you need the JNI, you need to wrap the header (I used bcd.gen and did some manual editing after that). I'm working on a transparent Java-D interop layer, but it's on hold for a while; I'll probably get back to it this fall. I can send you what I have so far if that'd be helpful. So, basically, no, you don't need a C library, just compile the D library as a standard shared object. All the best, Fraser Frank Benoit Wrote:I want to call D from Java. I think, I need a dynamic library (.so) which implements generated C stubs. The lib does only need to export those C function. The lib shall contain the needed runtime. (and i want to use tango) Is that possible?
Jun 07 2007
Hm, ppl telling me, that building a .so is possible with GDC and not well supported with DMD. What is the difference here?
Jun 10 2007
Frank Benoit wrote:Hm, ppl telling me, that building a .so is possible with GDC and not well supported with DMD. What is the difference here?IIRC, to build a .so the compiler backend needs to be able to generate position-independent code. GDC uses a GCC backend, which have no problem with this that I'm aware of (just pass -pic/-PIC on the command line). The backend DMD uses on the other hand simply can't do that at the moment.
Jun 10 2007
I found that "nm -u libT.so" tells me about lots of unresolved symbols. They prevent the .so from loading in a non D app. I want to export only "extern(C)" functions. $ nm -u libT.so U _D10ModuleInfo6__vtblZ U _D10TypeInfo_i6__initZ U _D10TypeInfo_k6__initZ U _D11TypeInfo_Aa6__initZ U _D11TypeInfo_Ag6__initZ U _D11TypeInfo_Ah6__initZ U _D11TypeInfo_Au6__initZ U _D11TypeInfo_Aw6__initZ U _D13TypeInfo_Enum6__vtblZ U _D13TypeInfo_Enum7__ClassZ U _D14TypeInfo_Tuple6__vtblZ U _D15TypeInfo_Struct6__vtblZ U _D16TypeInfo_Pointer6__vtblZ U _D16TypeInfo_Typedef6__vtblZ U _D16TypeInfo_Typedef7__ClassZ U _D17TypeInfo_Delegate6__vtblZ U _D5tango4core9Exception11IOException5_ctorMFAaZC5tango4core9Exception11IOException U _D5tango4core9Exception11IOException7__ClassZ U _D5tango4core9Exception24IllegalArgumentException5_ctorMFAaZC5tango4core9Exception24IllegalArgumentException U _D5tango4core9Exception24IllegalArgumentException7__ClassZ U _D6Object7__ClassZ U _D6object6Object5opCmpMFC6ObjectZi U _D6object6Object6toHashMFZk U _D6object6Object6toUtf8MFZAa U _D6object6Object8opEqualsMFC6ObjectZi U _D9ClassInfo6__vtblZ U _D9invariant12_d_invariantFC6ObjectZv U _Dmodule_ref w _Jv_RegisterClasses U __ULDIV__ w __cxa_finalize GLIBC_2.1.3 w __gmon_start__ U _adDupT U _d_array_bounds U _d_arrayappendT U _d_arraycatnT U _d_arraycopy U _d_arraysetlengthiT U _d_assert U _d_assert_msg U _d_delarray U _d_dynamic_cast U _d_newarrayT U _d_newclass U _d_throw 4 U _main U _memset16 U _memset32 U close GLIBC_2.0 U exit GLIBC_2.0 U fgetc GLIBC_2.0 U fgetwc GLIBC_2.2 U fputc GLIBC_2.0 U fputwc GLIBC_2.2 U getErrno U isatty GLIBC_2.0 U log10l GLIBC_2.0 U memcpy GLIBC_2.0 U onUnicodeError U read GLIBC_2.0 U setErrno U stdin GLIBC_2.0 U stdout GLIBC_2.0 U strerror GLIBC_2.0 U strlen GLIBC_2.0 U write GLIBC_2.0
Jun 10 2007
Frank Benoit wrote:I found that "nm -u libT.so" tells me about lots of unresolved symbols. They prevent the .so from loading in a non D app. I want to export only "extern(C)" functions.(This assumes GDC) You could try using visibility attributes. I've never needed them, but AFAICT this should work on ELF targets and Darwin[1]: Pass -fvisibility=hidden on the command line for all your modules (including those in the standard library; you'll have to recompile this unless you can figure out some way to apply them to the binary library). This will hide all symbols from anything outside the shared lib they're in, unless overridden for that specific symbol. The way to do that should be to either use: --- pragma(GNU_attribute, visibility("default")) { // ... declarations of exported functions ... // (The braces are optional if only one symbol is declared within) } --- or, for each function to be exported: --- pragma(GNU_set_attribute, FUNCTION_NAME, visibility("default")); --- References: Command line: http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html (at the bottom, -fvisibility) Visibility attribute: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bvisibility_007d-attribute-1980 GDC syntax for attributes: http://dgcc.sourceforge.net/gdc/manual.html (section "Declaration and Type Attributes") [1]: I have no idea if it'll work on Windows, but .so isn't typically used there so that shouldn't matter :).
Jun 10 2007
OK, so there is really no chance with DMD :/ Frits, thanks for this, i will try it with GDC.
Jun 10 2007
Frank Benoit wrote:OK, so there is really no chance with DMD :/ Frits, thanks for this, i will try it with GDC.Now that I think about it, the D spec specifies: --- Public means that any code within the executable can access the member. Export means that any code outside the executable can access the member. Export is analogous to exporting definitions from a DLL. --- So then to correctly implement this the compilers should technically already make "hidden" the default visibility, and use "default" only for symbols with the "export" attribute in D. That would be pure D, without compiler-specific attributes. I'm not sure if this is currently implemented like that though, and I don't feel like checking -- it's late over here.
Jun 10 2007
With "I want to export only "extern(C)" functions." i meant "i do only care about the C functions, the application loading the lib does not load other than extern(C) functions". Is your suggesting solving the unresolved symbols or did you get me wrong and your suggestion is hiding the other functions?
Jun 10 2007
Frank Benoit wrote:With "I want to export only "extern(C)" functions." i meant "i do only care about the C functions, the application loading the lib does not load other than extern(C) functions". Is your suggesting solving the unresolved symbols or did you get me wrong and your suggestion is hiding the other functions?AFAIK, what I wrote /should/ make it "impossible" to link to hidden functions from executables or other shared object files, as well as disabling dlsym() access to them. Other functions might still be present in the library (especially those called by your exported functions). The .so would probably still contain some unresolved symbols, especially of symbols defined in the standard C library. If I misunderstood something or was unclear then I'm sorry. Like I mentioned in my other post, it's kinda late over here (after 2 AM).
Jun 10 2007
If I misunderstood something or was unclear then I'm sorry. Like I mentioned in my other post, it's kinda late over here (after 2 AM).yes, same timezone *yawn*
Jun 10 2007