Thread overview
libffi-d: D binding to libffi
Dec 09, 2011
Andrej Mitrovic
December 08, 2011
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
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
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
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