2003-07-12 00:13:16 +02:00
|
|
|
This directory contains the libffi package, which is not part of GCC but
|
|
|
|
shipped with GCC as convenience.
|
|
|
|
|
|
|
|
Status
|
|
|
|
======
|
1999-08-08 15:27:18 +02:00
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
libffi-3.0.8 was released on December 19, 2008. Check the libffi web
|
|
|
|
page for updates: <URL:http://sourceware.org/libffi/>.
|
1999-08-08 15:27:18 +02:00
|
|
|
|
|
|
|
|
|
|
|
What is libffi?
|
|
|
|
===============
|
|
|
|
|
|
|
|
Compilers for high level languages generate code that follow certain
|
|
|
|
conventions. These conventions are necessary, in part, for separate
|
|
|
|
compilation to work. One such convention is the "calling
|
|
|
|
convention". The "calling convention" is essentially a set of
|
|
|
|
assumptions made by the compiler about where function arguments will
|
|
|
|
be found on entry to a function. A "calling convention" also specifies
|
|
|
|
where the return value for a function is found.
|
|
|
|
|
|
|
|
Some programs may not know at the time of compilation what arguments
|
|
|
|
are to be passed to a function. For instance, an interpreter may be
|
|
|
|
told at run-time about the number and types of arguments used to call
|
|
|
|
a given function. Libffi can be used in such programs to provide a
|
|
|
|
bridge from the interpreter program to compiled code.
|
|
|
|
|
|
|
|
The libffi library provides a portable, high level programming
|
|
|
|
interface to various calling conventions. This allows a programmer to
|
|
|
|
call any function specified by a call interface description at run
|
|
|
|
time.
|
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
FFI stands for Foreign Function Interface. A foreign function
|
1999-08-08 15:27:18 +02:00
|
|
|
interface is the popular name for the interface that allows code
|
|
|
|
written in one language to call code written in another language. The
|
|
|
|
libffi library really only provides the lowest, machine dependent
|
|
|
|
layer of a fully featured foreign function interface. A layer must
|
|
|
|
exist above libffi that handles type conversions for values passed
|
|
|
|
between the two languages.
|
|
|
|
|
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
Supported Platforms
|
|
|
|
===================
|
|
|
|
|
|
|
|
Libffi has been ported to many different platforms, although this
|
|
|
|
release was only tested on:
|
|
|
|
|
|
|
|
arm oabi linux
|
|
|
|
arm eabi linux
|
|
|
|
hppa linux
|
|
|
|
mips o32 linux (little endian)
|
|
|
|
powerpc darwin
|
|
|
|
powerpc freebsd
|
|
|
|
powerpc64 linux
|
|
|
|
sparc solaris
|
|
|
|
sparc64 freebsd
|
|
|
|
sparc64 solaris
|
|
|
|
x86 cygwin
|
|
|
|
x86 darwin
|
|
|
|
x86 freebsd
|
|
|
|
x86 linux
|
|
|
|
x86 openbsd
|
|
|
|
x86 solaris
|
[multiple changes]
2009-06-12 Andrew Haley <aph@redhat.com>
* ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c,
testsuite/libffi.call/cls_align_uint64.c,
testsuite/libffi.call/cls_ulonglong.c,
testsuite/libffi.call/return_ll1.c,
testsuite/libffi.call/stret_medium2.c: Fix printf format
specifiers.
testsuite/libffi.special/unwindtest.cc: include stdint.h.
2009-06-11 Timothy Wall <twall@users.sf.net>
* Makefile.am,
configure.ac,
include/ffi.h.in,
include/ffi_common.h,
src/closures.c,
src/dlmalloc.c,
src/x86/ffi.c,
src/x86/ffitarget.h,
src/x86/win64.S (new),
README: Added win64 support (mingw or MSVC)
* Makefile.in,
include/Makefile.in,
man/Makefile.in,
testsuite/Makefile.in,
configure,
aclocal.m4: Regenerated
* ltcf-c.sh: properly escape cygwin/w32 path
* man/ffi_call.3: Clarify size requirements for return value.
* src/x86/ffi64.c: Fix filename in comment.
* src/x86/win32.S: Remove unused extern.
* testsuite/libffi.call/closure_fn0.c,
testsuite/libffi.call/closure_fn1.c,
testsuite/libffi.call/closure_fn2.c,
testsuite/libffi.call/closure_fn3.c,
testsuite/libffi.call/closure_fn4.c,
testsuite/libffi.call/closure_fn5.c,
testsuite/libffi.call/closure_fn6.c,
testsuite/libffi.call/closure_stdcall.c,
testsuite/libffi.call/cls_12byte.c,
testsuite/libffi.call/cls_16byte.c,
testsuite/libffi.call/cls_18byte.c,
testsuite/libffi.call/cls_19byte.c,
testsuite/libffi.call/cls_1_1byte.c,
testsuite/libffi.call/cls_20byte.c,
testsuite/libffi.call/cls_20byte1.c,
testsuite/libffi.call/cls_24byte.c,
testsuite/libffi.call/cls_2byte.c,
testsuite/libffi.call/cls_3_1byte.c,
testsuite/libffi.call/cls_3byte1.c,
testsuite/libffi.call/cls_3byte2.c,
testsuite/libffi.call/cls_4_1byte.c,
testsuite/libffi.call/cls_4byte.c,
testsuite/libffi.call/cls_5_1_byte.c,
testsuite/libffi.call/cls_5byte.c,
testsuite/libffi.call/cls_64byte.c,
testsuite/libffi.call/cls_6_1_byte.c,
testsuite/libffi.call/cls_6byte.c,
testsuite/libffi.call/cls_7_1_byte.c,
testsuite/libffi.call/cls_7byte.c,
testsuite/libffi.call/cls_8byte.c,
testsuite/libffi.call/cls_9byte1.c,
testsuite/libffi.call/cls_9byte2.c,
testsuite/libffi.call/cls_align_double.c,
testsuite/libffi.call/cls_align_float.c,
testsuite/libffi.call/cls_align_longdouble.c,
testsuite/libffi.call/cls_align_longdouble_split.c,
testsuite/libffi.call/cls_align_longdouble_split2.c,
testsuite/libffi.call/cls_align_pointer.c,
testsuite/libffi.call/cls_align_sint16.c,
testsuite/libffi.call/cls_align_sint32.c,
testsuite/libffi.call/cls_align_sint64.c,
testsuite/libffi.call/cls_align_uint16.c,
testsuite/libffi.call/cls_align_uint32.c,
testsuite/libffi.call/cls_align_uint64.c,
testsuite/libffi.call/cls_dbls_struct.c,
testsuite/libffi.call/cls_double.c,
testsuite/libffi.call/cls_double_va.c,
testsuite/libffi.call/cls_float.c,
testsuite/libffi.call/cls_longdouble.c,
testsuite/libffi.call/cls_longdouble_va.c,
testsuite/libffi.call/cls_multi_schar.c,
testsuite/libffi.call/cls_multi_sshort.c,
testsuite/libffi.call/cls_multi_sshortchar.c,
testsuite/libffi.call/cls_multi_uchar.c,
testsuite/libffi.call/cls_multi_ushort.c,
testsuite/libffi.call/cls_multi_ushortchar.c,
testsuite/libffi.call/cls_pointer.c,
testsuite/libffi.call/cls_pointer_stack.c,
testsuite/libffi.call/cls_schar.c,
testsuite/libffi.call/cls_sint.c,
testsuite/libffi.call/cls_sshort.c,
testsuite/libffi.call/cls_uchar.c,
testsuite/libffi.call/cls_uint.c,
testsuite/libffi.call/cls_ulonglong.c,
testsuite/libffi.call/cls_ushort.c,
testsuite/libffi.call/err_bad_abi.c,
testsuite/libffi.call/err_bad_typedef.c,
testsuite/libffi.call/float2.c,
testsuite/libffi.call/huge_struct.c,
testsuite/libffi.call/nested_struct.c,
testsuite/libffi.call/nested_struct1.c,
testsuite/libffi.call/nested_struct10.c,
testsuite/libffi.call/nested_struct2.c,
testsuite/libffi.call/nested_struct3.c,
testsuite/libffi.call/nested_struct4.c,
testsuite/libffi.call/nested_struct5.c,
testsuite/libffi.call/nested_struct6.c,
testsuite/libffi.call/nested_struct7.c,
testsuite/libffi.call/nested_struct8.c,
testsuite/libffi.call/nested_struct9.c,
testsuite/libffi.call/problem1.c,
testsuite/libffi.call/return_ldl.c,
testsuite/libffi.call/return_ll1.c,
testsuite/libffi.call/stret_large.c,
testsuite/libffi.call/stret_large2.c,
testsuite/libffi.call/stret_medium.c,
testsuite/libffi.call/stret_medium2.c,
testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead
of checking for MMAP. Use intptr_t instead of long casts.
2009-06-12 Andrew Haley <aph@redhat.com>
* Makefile.am: Remove info_TEXINFOS.
From-SVN: r148433
2009-06-12 17:57:58 +02:00
|
|
|
x86-64 mingw
|
2009-06-08 19:16:16 +02:00
|
|
|
x86-64 darwin
|
|
|
|
x86-64 linux
|
|
|
|
x86-64 OS X
|
|
|
|
x86-64 freebsd
|
|
|
|
x86-64 solaris
|
|
|
|
|
|
|
|
Please send additional platform test results to
|
|
|
|
libffi-discuss@sourceware.org.
|
1999-08-08 15:27:18 +02:00
|
|
|
|
|
|
|
Installing libffi
|
|
|
|
=================
|
|
|
|
|
|
|
|
[Note: before actually performing any of these installation steps,
|
|
|
|
you may wish to read the "Platform Specific Notes" below.]
|
|
|
|
|
|
|
|
First you must configure the distribution for your particular
|
|
|
|
system. Go to the directory you wish to build libffi in and run the
|
|
|
|
"configure" program found in the root directory of the libffi source
|
|
|
|
distribution.
|
|
|
|
|
|
|
|
You may want to tell configure where to install the libffi library and
|
|
|
|
header files. To do that, use the --prefix configure switch. Libffi
|
|
|
|
will install under /usr/local by default.
|
|
|
|
|
|
|
|
If you want to enable extra run-time debugging checks use the the
|
|
|
|
--enable-debug configure switch. This is useful when your program dies
|
|
|
|
mysteriously while using libffi.
|
|
|
|
|
|
|
|
Another useful configure switch is --enable-purify-safety. Using this
|
|
|
|
will add some extra code which will suppress certain warnings when you
|
|
|
|
are using Purify with libffi. Only use this switch when using
|
|
|
|
Purify, as it will slow down the library.
|
|
|
|
|
|
|
|
Configure has many other options. Use "configure --help" to see them all.
|
|
|
|
|
|
|
|
Once configure has finished, type "make". Note that you must be using
|
2009-06-08 19:16:16 +02:00
|
|
|
GNU make. You can ftp GNU make from prep.ai.mit.edu:/pub/gnu.
|
1999-08-08 15:27:18 +02:00
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
To ensure that libffi is working as advertised, type "make check".
|
|
|
|
This will require that you have DejaGNU installed.
|
1999-08-08 15:27:18 +02:00
|
|
|
|
|
|
|
To install the library and header files, type "make install".
|
|
|
|
|
|
|
|
|
|
|
|
Platform Specific Notes
|
|
|
|
=======================
|
|
|
|
|
|
|
|
MIPS - Irix 5.3 & 6.x
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
Irix 6.2 and better supports three different calling conventions: o32,
|
|
|
|
n32 and n64. Currently, libffi only supports both o32 and n32 under
|
|
|
|
Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be
|
|
|
|
configured for whichever calling convention it was built for.
|
|
|
|
|
|
|
|
By default, the configure script will try to build libffi with the GNU
|
|
|
|
development tools. To build libffi with the SGI development tools, set
|
|
|
|
the environment variable CC to either "cc -32" or "cc -n32" before
|
|
|
|
running configure under Irix 6.x (depending on whether you want an o32
|
|
|
|
or n32 library), or just "cc" for Irix 5.3.
|
|
|
|
|
|
|
|
With the n32 calling convention, when returning structures smaller
|
|
|
|
than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned.
|
|
|
|
Here's one way of forcing this:
|
|
|
|
|
|
|
|
double struct_storage[2];
|
|
|
|
my_small_struct *s = (my_small_struct *) struct_storage;
|
|
|
|
/* Use s for RVALUE */
|
|
|
|
|
|
|
|
If you don't do this you are liable to get spurious bus errors.
|
|
|
|
|
|
|
|
"long long" values are not supported yet.
|
|
|
|
|
|
|
|
You must use GNU Make to build libffi on SGI platforms.
|
|
|
|
|
|
|
|
|
|
|
|
PowerPC System V ABI
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
There are two `System V ABI's which libffi implements for PowerPC.
|
|
|
|
They differ only in how small structures are returned from functions.
|
|
|
|
|
|
|
|
In the FFI_SYSV version, structures that are 8 bytes or smaller are
|
|
|
|
returned in registers. This is what GCC does when it is configured
|
|
|
|
for solaris, and is what the System V ABI I have (dated September
|
|
|
|
1995) says.
|
|
|
|
|
|
|
|
In the FFI_GCC_SYSV version, all structures are returned the same way:
|
|
|
|
by passing a pointer as the first argument to the function. This is
|
|
|
|
what GCC does when it is configured for linux or a generic sysv
|
|
|
|
target.
|
|
|
|
|
|
|
|
EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a
|
|
|
|
inconsistency with the SysV ABI: When a procedure is called with many
|
|
|
|
floating-point arguments, some of them get put on the stack. They are
|
|
|
|
all supposed to be stored in double-precision format, even if they are
|
|
|
|
only single-precision, but EGCS stores single-precision arguments as
|
|
|
|
single-precision anyway. This causes one test to fail (the `many
|
|
|
|
arguments' test).
|
|
|
|
|
|
|
|
|
|
|
|
History
|
|
|
|
=======
|
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
3.0.7 Nov-11-08
|
|
|
|
Fix for ppc FreeBSD.
|
|
|
|
(thanks to Andreas Tobler)
|
|
|
|
|
|
|
|
3.0.6 Jul-17-08
|
|
|
|
Fix for closures on sh.
|
|
|
|
Mark the sh/sh64 stack as non-executable.
|
|
|
|
(both thanks to Kaz Kojima)
|
|
|
|
|
|
|
|
3.0.5 Apr-3-08
|
|
|
|
Fix libffi.pc file.
|
|
|
|
Fix #define ARM for IcedTea users.
|
|
|
|
Fix x86 closure bug.
|
|
|
|
|
|
|
|
3.0.4 Feb-24-08
|
|
|
|
Fix x86 OpenBSD configury.
|
|
|
|
|
|
|
|
3.0.3 Feb-22-08
|
|
|
|
Enable x86 OpenBSD thanks to Thomas Heller, and
|
|
|
|
x86-64 FreeBSD thanks to Björn König and Andreas Tobler.
|
|
|
|
Clean up test instruction in README.
|
|
|
|
|
|
|
|
3.0.2 Feb-21-08
|
|
|
|
Improved x86 FreeBSD support.
|
|
|
|
Thanks to Björn König.
|
|
|
|
|
|
|
|
3.0.1 Feb-15-08
|
|
|
|
Fix instruction cache flushing bug on MIPS.
|
|
|
|
Thanks to David Daney.
|
|
|
|
|
|
|
|
3.0.0 Feb-15-08
|
|
|
|
Many changes, mostly thanks to the GCC project.
|
|
|
|
Cygnus Solutions is now Red Hat.
|
|
|
|
|
|
|
|
[10 years go by...]
|
|
|
|
|
1999-08-08 15:27:18 +02:00
|
|
|
1.20 Oct-5-98
|
|
|
|
Raffaele Sena produces ARM port.
|
|
|
|
|
|
|
|
1.19 Oct-5-98
|
|
|
|
Fixed x86 long double and long long return support.
|
|
|
|
m68k bug fixes from Andreas Schwab.
|
|
|
|
Patch for DU assembler compatibility for the Alpha from Richard
|
|
|
|
Henderson.
|
|
|
|
|
|
|
|
1.18 Apr-17-98
|
|
|
|
Bug fixes and MIPS configuration changes.
|
|
|
|
|
|
|
|
1.17 Feb-24-98
|
|
|
|
Bug fixes and m68k port from Andreas Schwab. PowerPC port from
|
|
|
|
Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes.
|
|
|
|
|
|
|
|
1.16 Feb-11-98
|
|
|
|
Richard Henderson produces Alpha port.
|
|
|
|
|
|
|
|
1.15 Dec-4-97
|
|
|
|
Fixed an n32 ABI bug. New libtool, auto* support.
|
|
|
|
|
|
|
|
1.14 May-13-97
|
|
|
|
libtool is now used to generate shared and static libraries.
|
|
|
|
Fixed a minor portability problem reported by Russ McManus
|
|
|
|
<mcmanr@eq.gs.com>.
|
|
|
|
|
|
|
|
1.13 Dec-2-96
|
|
|
|
Added --enable-purify-safety to keep Purify from complaining
|
|
|
|
about certain low level code.
|
|
|
|
Sparc fix for calling functions with < 6 args.
|
|
|
|
Linux x86 a.out fix.
|
|
|
|
|
|
|
|
1.12 Nov-22-96
|
|
|
|
Added missing ffi_type_void, needed for supporting void return
|
|
|
|
types. Fixed test case for non MIPS machines. Cygnus Support
|
|
|
|
is now Cygnus Solutions.
|
|
|
|
|
|
|
|
1.11 Oct-30-96
|
|
|
|
Added notes about GNU make.
|
|
|
|
|
|
|
|
1.10 Oct-29-96
|
|
|
|
Added configuration fix for non GNU compilers.
|
|
|
|
|
|
|
|
1.09 Oct-29-96
|
|
|
|
Added --enable-debug configure switch. Clean-ups based on LCLint
|
|
|
|
feedback. ffi_mips.h is always installed. Many configuration
|
|
|
|
fixes. Fixed ffitest.c for sparc builds.
|
|
|
|
|
|
|
|
1.08 Oct-15-96
|
|
|
|
Fixed n32 problem. Many clean-ups.
|
|
|
|
|
|
|
|
1.07 Oct-14-96
|
|
|
|
Gordon Irlam rewrites v8.S again. Bug fixes.
|
|
|
|
|
|
|
|
1.06 Oct-14-96
|
|
|
|
Gordon Irlam improved the sparc port.
|
|
|
|
|
|
|
|
1.05 Oct-14-96
|
|
|
|
Interface changes based on feedback.
|
|
|
|
|
|
|
|
1.04 Oct-11-96
|
|
|
|
Sparc port complete (modulo struct passing bug).
|
|
|
|
|
|
|
|
1.03 Oct-10-96
|
|
|
|
Passing struct args, and returning struct values works for
|
|
|
|
all architectures/calling conventions. Expanded tests.
|
|
|
|
|
|
|
|
1.02 Oct-9-96
|
|
|
|
Added SGI n32 support. Fixed bugs in both o32 and Linux support.
|
|
|
|
Added "make test".
|
|
|
|
|
|
|
|
1.01 Oct-8-96
|
|
|
|
Fixed float passing bug in mips version. Restructured some
|
|
|
|
of the code. Builds cleanly with SGI tools.
|
|
|
|
|
|
|
|
1.00 Oct-7-96
|
|
|
|
First release. No public announcement.
|
|
|
|
|
|
|
|
|
|
|
|
Authors & Credits
|
|
|
|
=================
|
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
libffi was originally written by Anthony Green <green@redhat.com>.
|
|
|
|
|
|
|
|
The developers of the GNU Compiler Collection project have made
|
|
|
|
innumerable valuable contributions. See the ChangeLog file for
|
|
|
|
details.
|
1999-08-08 15:27:18 +02:00
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
Some of the ideas behind libffi were inspired by Gianni Mariani's free
|
|
|
|
gencall library for Silicon Graphics machines.
|
1999-08-08 15:27:18 +02:00
|
|
|
|
|
|
|
The closure mechanism was designed and implemented by Kresten Krab
|
|
|
|
Thorup.
|
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
Major processor architecture ports were contributed by the following
|
|
|
|
developers:
|
|
|
|
|
|
|
|
alpha Richard Henderson
|
|
|
|
arm Raffaele Sena
|
|
|
|
cris Simon Posnjak, Hans-Peter Nilsson
|
|
|
|
frv Anthony Green
|
|
|
|
ia64 Hans Boehm
|
|
|
|
m32r Kazuhiro Inaoka
|
|
|
|
m68k Andreas Schwab
|
|
|
|
mips Anthony Green, Casey Marshall
|
|
|
|
mips64 David Daney
|
|
|
|
pa Randolph Chung, Dave Anglin, Andreas Tobler
|
|
|
|
powerpc Geoffrey Keating, Andreas Tobler,
|
|
|
|
David Edelsohn, John Hornkvist
|
|
|
|
powerpc64 Jakub Jelinek
|
|
|
|
s390 Gerhard Tonn, Ulrich Weigand
|
|
|
|
sh Kaz Kojima
|
|
|
|
sh64 Kaz Kojima
|
|
|
|
sparc Anthony Green, Gordon Irlam
|
|
|
|
x86 Anthony Green, Jon Beniston
|
|
|
|
x86-64 Bo Thorsen
|
1999-08-08 15:27:18 +02:00
|
|
|
|
|
|
|
Jesper Skov and Andrew Haley both did more than their fair share of
|
|
|
|
stepping through the code and tracking down bugs.
|
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
Thanks also to Tom Tromey for bug fixes, documentation and
|
|
|
|
configuration help.
|
1999-08-08 15:27:18 +02:00
|
|
|
|
|
|
|
Thanks to Jim Blandy, who provided some useful feedback on the libffi
|
|
|
|
interface.
|
|
|
|
|
2009-06-08 19:16:16 +02:00
|
|
|
Andreas Tobler has done a tremendous amount of work on the testsuite.
|
|
|
|
|
|
|
|
Alex Oliva solved the executable page problem for SElinux.
|
|
|
|
|
|
|
|
The list above is almost certainly incomplete and inaccurate. I'm
|
|
|
|
happy to make corrections or additions upon request.
|
|
|
|
|
1999-08-08 15:27:18 +02:00
|
|
|
If you have a problem, or have found a bug, please send a note to
|
2009-06-08 19:16:16 +02:00
|
|
|
green@redhat.com.
|