View mode: basic / threaded / horizontal-split · Log in · Help
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
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
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
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
Top | Discussion index | About this forum | D home