Thread overview | ||||||
---|---|---|---|---|---|---|
|
December 08, 2011 libffi-d: D binding to libffi | ||||
---|---|---|---|---|
| ||||
Hi folks, Since I needed a way to call arbitrary C functions dynamically (while knowing their pointer + signature), I decided to write a binding to libffi for D. https://github.com/lycus/libffi-d There is heavy focus on simplicity: It is composed of 3 enums (FFIType, FFIStatus, FFIInterface), one alias (FFIFunction), and one function (ffiCall). The API is fairly self-describing, so I haven't really spent a whole lot of time on docs. For examples, see the tests sub-directory (please also read 'info libffi'). Known limitations: * No access to the closure API. * No access to the 'raw' API (which is undocumented in libffi anyway). Known issues: * Detection of soft float ABIs is not currently done (due to limitations in most D compilers). * ABI overriding for some rare Unix ABIs is not currently possible. * Currently no good way to actually use the library on Windows. Anyone who knows their stuff about DMD and DLLs on Windows, please do contribute. ;) If you run into any issues, please throw a test case at the GitHub issue tracker and I'll look into it. Enjoy! - Alex |
December 09, 2011 Re: libffi-d: D binding to libffi | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex Rønne Petersen | There's a few DLL's floating around for libffi, however none of them seem to have the symbol "ffi_prep_cif_var" which seems to be needed for variadic functions. I can version variadic support out and compile your bindings, the tests will work fine on win32. I've also tried compiling libffi on my own but had no success. I can make a pull with the import lib, the DLL (it's only 99KB), and the versioned out sections, if you'd like that. |
December 15, 2011 Re: libffi-d: D binding to libffi | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | Hi Andrej, Sorry for the late response (for some reason, my news reader had marked this thread as read). > There's a few DLL's floating around for libffi, however none of them > seem to have the symbol "ffi_prep_cif_var" which seems to be needed > for variadic functions. > > I can version variadic support out and compile your bindings, the > tests will work fine on win32. > I've also tried compiling libffi on my own but had no success. ffi_prep_cif_var doesn't seem to be available in any Windows builds (Cygwin, MinGW, or otherwise) of libffi for whatever reason. I'll version it out on Windows for now, as you suggested. I haven't managed to get a MinGW build of libffi working so far, but I did manage to get one working under Cygwin. Build libffi like this: $ ./configure --enable-static=yes --enable-shared=no $ make Now you should have i686-pc-cygwin/.libs/libffi.a. You'll also need your Cygwin installation's libgcc.a: $ cd i686-pc-cygwin/.libs $ ar -r libffi.a /lib/gcc/i686-pc-cygwin/4.5.3/libgcc.a Now you need to convert the .a to an OMF .lib. You'll need objconv.zip from this page: http://www.agner.org/optimize/ $ objconv -fomf -nu libffi.a libffi.lib libffi.lib should now be linkable with DMD. (I long for the day DMD doesn't use OMF.) > I can make a pull with the import lib, the DLL (it's only 99KB), and > the versioned out sections, if you'd like that. I prefer keeping the binaries out of Git for various portability, licensing, etc issues. That being said, I think we could upload .libs/.dlls as downloads on the GitHub page. The question is whether we should put .libs or .dlls there? Personally, I think .libs are easier to work with when using DMD. Thanks for the input! - Alex |
December 15, 2011 Re: libffi-d: D binding to libffi | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex Rønne Petersen | On 15-12-2011 09:14, Alex Rønne Petersen wrote:
> Hi Andrej,
>
> Sorry for the late response (for some reason, my news reader had marked
> this thread as read).
>
> > There's a few DLL's floating around for libffi, however none of them
> > seem to have the symbol "ffi_prep_cif_var" which seems to be needed
> > for variadic functions.
> >
> > I can version variadic support out and compile your bindings, the
> > tests will work fine on win32.
> > I've also tried compiling libffi on my own but had no success.
>
> ffi_prep_cif_var doesn't seem to be available in any Windows builds
> (Cygwin, MinGW, or otherwise) of libffi for whatever reason. I'll
> version it out on Windows for now, as you suggested.
>
> I haven't managed to get a MinGW build of libffi working so far, but I
> did manage to get one working under Cygwin. Build libffi like this:
>
> $ ./configure --enable-static=yes --enable-shared=no
> $ make
>
> Now you should have i686-pc-cygwin/.libs/libffi.a.
>
> You'll also need your Cygwin installation's libgcc.a:
>
> $ cd i686-pc-cygwin/.libs
> $ ar -r libffi.a /lib/gcc/i686-pc-cygwin/4.5.3/libgcc.a
>
> Now you need to convert the .a to an OMF .lib. You'll need objconv.zip
> from this page: http://www.agner.org/optimize/
>
> $ objconv -fomf -nu libffi.a libffi.lib
>
> libffi.lib should now be linkable with DMD.
>
> (I long for the day DMD doesn't use OMF.)
>
> > I can make a pull with the import lib, the DLL (it's only 99KB), and
> > the versioned out sections, if you'd like that.
>
> I prefer keeping the binaries out of Git for various portability,
> licensing, etc issues. That being said, I think we could upload
> .libs/.dlls as downloads on the GitHub page. The question is whether we
> should put .libs or .dlls there? Personally, I think .libs are easier to
> work with when using DMD.
>
> Thanks for the input!
>
> - Alex
Correction: It seems as though that function has disappeared on my Linux system! It has most probably been deprecated entirely, so I have just removed it from libffi-d.
- Alex
|
Copyright © 1999-2021 by the D Language Foundation