libffi-3.0.13 于 2013 年 3 月 17 日发布。请查看 libffi 网页以获取更新:URL:http://sourceware.org/libffi/。
高级语言的编译器会生成遵循一定规范的代码。这些规范对于分离编译的正常运行是必要的。其中之一就是“调用约定”。所谓的“调用约定”本质上是一系列编译器关于函数参数在函数进入时所在位置的假设。一个“调用约定”还指定了函数的返回值在哪里可以找到。
有些程序可能在编译时不知道要传给函数哪些参数。例如,解释器可能在运行时被告知有关调用特定函数所用参数的数量和类型。在 such programs 中,libffi 可以用来提供一个从解释器程序到编译代码的桥梁。
libffi 库提供了一个可移植的、高级的编程接口,用于各种调用约定。这允许程序员在运行时调用由调用接口描述指定的任何函数。
FFI 表示外部函数接口。外部函数接口是允许一种语言编写的代码调用另一种语言编写的代码的接口的通称。libffi 库实际上只为一个完整功能的外部函数接口提供最底层、机器相关的层。必须存在于 libffi 之上的另一层来处理两个语言之间传递的值的类型转换。
libffi 已被移植到许多不同的平台。有关特定的配置细节和测试状态,请参阅此处的维基页面
http://www.moxielogic.org/wiki/index.php?title=Libffi_3.0.13
在发布时,以下基本配置已经被测试
|-----------------+------------------+-------------------------| | 架构 | 操作系统 | 编译器 | |-----------------+------------------+-------------------------| | AArch64 | Linux | GCC | | Alpha | Linux | GCC | | Alpha | Tru64 | GCC | | ARM | Linux | GCC | | ARM | iOS | GCC | | AVR32 | Linux | GCC | | Blackfin | uClinux | GCC | | HPPA | HPUX | GCC | | IA-64 | Linux | GCC | | M68K | FreeMiNT | GCC | | M68K | Linux | GCC | | M68K | RTEMS | GCC | | Meta | Linux | GCC | | MicroBlaze | Linux | GCC | | MIPS | IRIX | GCC | | MIPS | Linux | GCC | | MIPS | RTEMS | GCC | | MIPS64 | Linux | GCC | | Moxie | 硬件裸机 | GCC | PowerPC 32-bit | AIX | IBM XL C | | PowerPC 64-bit | AIX | IBM XL C | | PowerPC | AMIGA | GCC | | PowerPC | Linux | GCC | | PowerPC | Mac OS X | GCC | | PowerPC | FreeBSD | GCC | | PowerPC 64-bit | FreeBSD | GCC | | PowerPC 64-bit | Linux | GCC | | S390 | Linux | GCC | | S390X | Linux | GCC | | SPARC | Linux | GCC | | SPARC | Solaris | GCC | | SPARC | Solaris | Oracle Solaris Studio C | | SPARC64 | Linux | GCC | | SPARC64 | FreeBSD | GCC | | SPARC64 | Solaris | Oracle Solaris Studio C | | TILE-Gx/TILEPro | Linux | GCC | | X86 | FreeBSD | GCC | | X86 | GNU HURD | GCC | | X86 | Interix | GCC | | X86 | kFreeBSD | GCC | | X86 | Linux | GCC | | X86 | Mac OS X | GCC | | X86 | OpenBSD | GCC | | X86 | OS/2 | GCC | | X86 | Solaris | GCC | | X86 | Solaris | Oracle Solaris Studio C | | X86 | Windows/Cygwin | GCC | | X86 | Windows/MingW | GCC | | X86-64 | FreeBSD | GCC | | X86-64 | Linux | GCC | | X86-64 | Linux/x32 | GCC | | X86-64 | OpenBSD | GCC | | X86-64 | Solaris | Oracle Solaris Studio C | | X86-64 | Windows/MingW | GCC | | Xtensa | Linux | GCC | |-----------------+------------------+-------------------------|
请将附加的平台测试结果发送到 [email protected],并自由地更新上面的wiki页面。
首先,你必须为你的系统配置分发版。访问你希望在其中构建libffi的目录,并运行libffi源分发版根目录中的"configure"程序。
你也许希望指定安装libffi库和头文件的位置。要做到这一点,使用--prefix配置程序选项。默认情况下,Libffi将安装在/usr/local下。
如果你想要启用额外的运行时调试检查,请使用–enable-debug配置程序选项。当你使用libffi时,如果你的程序神秘地终止,这将非常有用。
另一个有用的配置程序选项是–enable-purify-safety。使用这个选项会在使用libffi的同时添加一些额外的代码,这将抑制某些警告。仅当你使用Purify时才使用此选项,因为它会减慢库的运行速度。
在Windows平台上使用Microsoft的Visual C++编译器构建libffi也是可能的。在这种情况下,配置期间使用msvcc.sh包装脚本,如下所示:
path/to/configure CC=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\"
对于64位Windows构建,使用CC="path/to/msvcc.sh -m64"。你可能还需要适当地指定--build。在MingW环境下使用MSVC构建时,你可能需要移除配置中设置'fix_srcfile_path'为'cygpath'命令的那一行。('cygpath'不在MingW中,且在使用MingW风格路径时不需要。)
对于iOS构建,'libffi.xcodeproj' Xcode项目可用。
配置程序还有许多其他选项。使用"configure --help"查看所有选项。
配置完成后,请键入"make"。注意,您必须使用GNU make。您可以从ftp.gnu.org:/pub/gnu/make下载GNU make。
为确保libffi按预期工作,请键入"make check"。这将需要您已安装DejaGNU。
要安装库和头文件,请键入"make install"。
详细信息请参阅ChangeLog文件。
3.0.13 Mar-17-13 添加Meta支持。添加缺失的Moxie位。修复32位x86的栈对齐错误。为m68000目标构建修复。为软浮点Power目标构建修复。在GCC构建时修复一些平台上的安装目录位置(OS X,Solaris)。修复Cygwin回归。
3.0.12 Feb-11-13 添加Moxie支持。添加AArch64支持。添加Blackfin支持。添加TILE-Gx/TILEPro支持。添加MicroBlaze支持。添加Xtensa支持。为启用MPROTECT的PaX内核添加支持。在Solaris和AIX上为本地供应商编译器添加支持。解决x86_64上LLVM/GCC互操作性问题。
3.0.11 Apr-11-12 许多构建修复。添加Amiga和新版MacOS支持。添加对可变函数(ffi_prep_cif_var)的支持。添加Linux/x32支持。在Windows上添加thiscall,fastcall和MSVC cdecl支持。添加Amiga和新版MacOS支持。添加m68k FreeMiNT支持。与iOS的xcode构建工具集成。修复Octeon和MC68881支持。修复代码乐观化问题。
3.0.10 Aug-23-11 添加对Apple's iOS的支持。添加对ARM VFP ABI的支持。添加MIPS和M68K的RTEMS支持。修复ARM和SPARC上的指令缓存清除问题。修复mips-sgi-irix6.5上的N64构建。启用Microsoft的编译器构建。启用Oracle的Solaris编译器的x86构建。修复使用Oracle Sparc Solaris编译器编译的调用代码的支持。修复Tru64 Unix的测试套件。添加更多平台支持。
3.0.9 Dec-31-09 添加AVR32和win64端口。添加ARM软fp支持。对AIX、Solaris、HP-UX、*BSD的大量修复。一些PowerPC和x86-64错误修复。为Windows构建DLL。
3.0.8 Dec-19-08 添加*BSD、BeOS和PA-Linux支持。
3.0.7 Nov-11-08修复ppc FreeBSD。(感谢Andreas Tobler)
3.0.6 Jul-17-08修复sh上的闭包。将sh/sh64堆标记为不可执行。(都感谢Kaz Kojima)
3.0.5 Apr-3-08修复libffi.pc文件。修复IcedTea用户中ARM的定义。修复x86闭包错误。
3.0.4 Feb-24-08修复x86 OpenBSD配置。
3.0.3 Feb-22-08借助于Thomas Heller启用x86 OpenBSD,以及借助于Björn König和Andreas Tobler启用x86-64 FreeBSD。清理README中的测试指令。
3.0.2 Feb-21-08改进了对x86 FreeBSD的支持。感谢Björn König。
3.0.1 Feb-15-08修复MIPS上指令缓存刷新错误。感谢David Daney。
3.0.0 Feb-15-08许多更改,主要归功于GCC项目。Cygnet Solutions现在是Red Hat。
十年后...
1.20 Oct-5-98 Raffaele Sena制作ARM端口。
1.19 Oct-5-98修复x86长双精度和长长返回支持。来自Andreas Schwab的m68k错误修复。来自Richard Henderson的Alpha汇编器兼容性补丁。
1.18 Apr-17-98错误修复和MIPS配置更改。
1.17 Feb-24-98错误修复和来自Andreas Schwab的m68k端口。来自Geoffrey Keating的PowerPC端口。x86、Sparc和MIPS的各种错误修复。
1.16 Feb-11-98 Richard Henderson制作Alpha端口。
1.15 Dec-4-97修复n32 ABI错误。新的libtool,auto*支持。
1.14 May-13-97现在使用libtool生成共享和静态库。修复了Russ McManus报告的轻微的可移植性问题[email protected]。
1.13 Dec-2-96添加--enable-purify-safety以防止Purify对某些底层代码发出抱怨。为Sparc修复了使用< 6个参数调用函数的问题。Linux x86 a.out修复。
1.12 1996年11月22日 添加了缺失的ffi_type_void,用于支持void返回类型。修复了非MIPS机器的测试用例。Cygnus支持现在称为Cygnus Solutions。
1.11 1996年10月30日 添加了关于GNU make的说明。
1.10 1996年10月29日 为非GNU编译器添加了配置修复。
1.09 1996年10月29日 添加了--enable-debug配置开关。基于LCLint反馈进行了清理。总是在ffi_mips.h中安装。许多配置修复。修复了ffitest.c在sparc编译时的错误。
1.08 1996年10月15日 修复了n32问题。许多清理。
1.07 1996年10月14日 Gordon Irlam再次重写了v8.S。修复了错误。
1.06 1996年10月14日 Gordon Irlam改进了sparc平台。
1.05 1996年10月14日 根据反馈进行了接口更改。
1.04 1996年10月11日 Sparc平台完成(除了struct传递错误外)。
1.03 1996年10月10日 对于所有架构/调用约定,传递结构体参数和返回结构体值都可行。扩展了测试。
1.02 1996年10月9日 添加了SGI n32支持。修复了o32和Linux支持中的错误。添加了"make test"。
1.01 1996年10月8日 修复了mips版本中的浮点分配错误。重构了一些代码。使用SGI工具模块化构建。
1.00 1996年10月7日 第一次发布。没有公开宣传。
libffi最初由Anthony Green编写。
GNU编译器集合项目的开发人员做出了数不清的有价值贡献。请参阅ChangeLog文件以获取详细信息。
libffi背后的某些想法得到了Gianni Mariani为Silicon Graphics机器编写的免费gencall库的启发。
闭包机制由Kresten Krab Thorup设计和实现。
以下开发人员为以下主要处理器架构端口做出了贡献
aarch64 Marcus Shawcroft, James Greenhalgh alpha Richard Henderson arm Raffaele Sena blackfin Alexandre Keunecke I. de Mendonca cris Simon Posnjak, Hans-Peter Nilsson frv Anthony Green ia64 Hans Boehm m32r Kazuhiro Inaoka m68k Andreas Schwab microblaze Nathan Rossi mips Anthony Green, Casey Marshall mips64 David Daney moxie Anthony Green 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 tile-gx/tilepro Walter Lee x86 Anthony Green, Jon Beniston x86-64 Bo Thorsen xtensa Chris Zankel
Jesper Skov和Andrew Haley都超出他们应有的份额去检查代码和寻找错误。
还要感谢Tom Tromey的错误修复、文档和配置帮助。
感谢Jim Blandy,他为libffi界面提供了有用的反馈。
Andreas Tobler在测试套件上做了大量工作。
Alex Oliva解决了SElinux的可执行页面问题。
上面列出的列表可能几乎不完整和不准确。我很乐意根据要求进行更正或添加。
如果您有问题或找到了错误,请向作者发送邮件到[email protected],或者向项目邮件列表[email protected]。