Skip to content

libffi

ポータブルな外部関数インターフェイスライブラリ

libffi-3.4.4は2022年10月23日にリリースされた。githubからダウンロードしてください。: https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz.

libffiはフリーソフトウェアです。非常に自由なライセンスです。

libffiとは?

高級言語用のコンパイラーは、特定の規約に従ったコードを生成する。これらの規約は、部分的には、個別コンパイルが機能するために必要なものである。そのような規約のひとつが「呼び出し規約」である。呼び出し規約」とは、関数の引数が関数に入るときにどこにあるかについて、コンパイラが仮定したものです。呼び出し規約」はまた、関数の戻り値がどこにあるかについても指定します。

プログラムによっては、関数にどのような引数が渡されるのか、コンパイル時には分からないものもある。例えば、ある関数を呼び出すときに使われる引数の数と種類を、実行時にインタプリタに知らせることがあります。Libffiはそのようなプログラムで、インタプリタ・プログラムからコンパイルされたコードへの橋渡しをするために使うことができます。

libffiライブラリーは、様々な呼び出し規約に対する移植性の高い高レベルプログラミングインターフェースを提供します。これにより、プログラマーは、呼び出しインターフェイス記述によって指定された任意の関数を実行時に呼び出すことができます。

FFIとは、Foreign Function Interface(外部関数インターフェース)の略である。外部関数インターフェースは、ある言語で書かれたコードが別の言語で書かれたコードを呼び出すことを可能にするインターフェースの一般的な名称です。libffiライブラリーは、実際には、完全な機能を持つ外部関数インターフェースの、最も低い、マシン依存のレイヤーを提供するだけである。libffiの上には、2つの言語間で渡される値の型変換を処理する層が存在しなければならない。

誰が使うのか?

libffiライブラリーは、インタープリタ型コードとネイティブ・コンパイル型コードの間のブリッジを構築しようとするすべての人に有用である。代表的なユーザーは以下の通り。:

  • CPython - Pythonプログラミング言語のデフォルトで最も広く使われている実装では、標準ctypesライブラリのlibffiが使われている。
  • OpenJDK - Java Platform Standard Editionのオープンソース実装では、いくつかのプラットフォームでインタプリタとネイティブコード間のブリッジにlibffiが使われている。
  • js-ctypes - MozillaがFirefox 3.6で提供する予定のjavascript用の外部関数インターフェース。
  • Dalvik - Dalvikは、Androidモバイル・デバイス上でJavaプラットフォームを実行する仮想マシンである。libffiは、カスタム・ブリッジング・コードが書かれていないAndroidポートで使用される。
  • Java Native Access (JNA) - Javaからネイティブ・コードを呼び出すJNIフリーの方法。
  • Ruby-FFI - Ruby の Foreign Function Interface 拡張。
  • fsbv - Foreign Structure By Valueは、Common Lispの外部関数インターフェース・ライブラリで、標準のCFFIパッケージを拡張し、構造体の引数を値で渡す機能をサポートしています。
  • JSCocoa - Mac OSXとiPhone(libffi-iphoneポート経由)でjavascriptからObjective-Cコードを呼び出す。
  • PyObjC - Mac OSX上でPythonからObjective-Cのコードを呼び出す。
  • RubyCocoa - Mac OSX上のRubyからObjective-Cのコードを呼び出す。
  • The Glasgow Haskell Compiler - この人気のあるHaskell実装からCコードを呼び出す。
  • Racket - この有名なScheme処理系からCコードを呼び出す。
  • gcj - Javaプログラミング言語用GNUコンパイラのランタイム・ライブラリであるlibffiは、解釈されたコードとネイティブにコンパイルされたコードとの間を行き来するコールを処理するために使われる。 gcjはGCC(GNU Compiler Collection)の一部である。

対応プラットフォーム

Libffiは多くの異なるプラットフォームに移植されています。具体的な設定の詳細とテスト状況については、READMEファイルを参照してください。リリース時点では、以下の基本構成がテストされています:

アーキテクチャOS
AArch64 (ARM64)iOS
AArch64Linux
AArch64Windows
AlphaLinux
AlphaTru64
ARCLinux
ARMLinux
ARMiOS
ARMWindows
AVR32Linux
BlackfinuClinux
CSKYLinux
HPPAHPUX
IA-64Linux
KVXLinux
LoongArch64Linux
M68KFreeMiNT
M68KLinux
M68KRTEMS
M88KOpenBSD/mvme88k
MetaLinux
MicroBlazeLinux
MIPSIRIX
MIPSLinux
MIPSRTEMS
MIPS64Linux
MoxieBare metal
Nios IILinux
OpenRISCLinux
PowerPC 32-bitAIX
PowerPC 64-bitAIX
PowerPCAMIGA
PowerPCLinux
PowerPCMac OSX
PowerPCFreeBSD
PowerPC 64-bitFreeBSD
PowerPC 64-bitLinux ELFv1
PowerPC 64-bitLinux ELFv2
RISC-V 32-bitLinux
RISC-V 64-bitLinux
S390Linux
S390XLinux
SPARCLinux
SPARCSolaris
SPARCSolaris
SPARC64Linux
SPARC64FreeBSD
SPARC64Solaris
TILE-Gx/TILEProLinux
VAXOpenBSD/vax
X86FreeBSD
X86GNU HURD
X86Interix
X86kFreeBSD
X86Linux
X86Mac OSX
X86OpenBSD
X86OS/2
X86Solaris
X86Solaris
X86Windows/Cygwin
X86Windows/MingW
X86-64FreeBSD
X86-64Linux
X86-64Linux/x32
X86-64OpenBSD
X86-64Solaris
X86-64Windows/Cygwin
X86-64Windows/MingW
X86-64Mac OSX
XtensaLinux

Please send additional platform test results to libffi-discuss@sourceware.org and feel free to update the wiki page above.

入手方法

最新版はgithubからダウンロードできます。: https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz.

http://github.com/libffi/libffi の開発用gitリポジトリから最新版をチェックすることもできます。方法は以下の通り:

sh
git clone git://github.com/libffi/libffi.git

また、http://github.com/libffi/libffi でソースを閲覧することもできる。

メーリングリスト

このような小さなソフトウェアには、たくさんのメーリングリストが用意されている。

  • libffi-announce は libffi のリリースアナウンス用の低容量メーリングリストです。
  • libffi-discuss は質問やバグ報告などのためのメーリングリストです。

著者とクレジット

libffiの原作者はAnthony Greenである。

GNUコンパイラコレクションプロジェクトの開発者は、無数の貴重な貢献をしました。詳しくは、ソース配布物のこの変更ログファイルをご覧ください。

libffiの背後にあるアイデアのいくつかは、Gianni MarianiのSilicon Graphicsマシン用のフリーなgencallライブラリに触発されたものです。

クロージャ機構は Kresten Krab Thorup が設計し実装した。

主なプロセッサアーキテクチャの移植は、以下の開発者が貢献した:

アーキテクチャ開発者
aarch64Marcus Shawcroft, James Greenhalgh
alphaRichard Henderson
arcHackers at Synopsis
armRaffaele Sena
avr32Bradley Smith
blackfinAlexandre Keunecke I. de Mendonca
crisSimon Posnjak, Hans-Peter Nilsson
cskyMa Jun, Zhang Wenmeng
frvAnthony Green
ia64Hans Boehm
kvxYann Sionneau
loongarch64Cheng Lulu, Xi Ruoyao, Xu Hao,Zhang Wenlong, Pan Xuefeng
m32rKazuhiro Inaoka
m68kAndreas Schwab
m88kMiod Vallat
metagHackers at Imagination Technologies
microblazeNathan Rossi
mipsAnthony Green, Casey Marshall
mips64David Daney
moxieAnthony Green
nios iiSandra Loosemore
openriscSebastian Macke
paRandolph Chung, Dave Anglin, Andreas Tobler
powerpcGeoffrey Keating, Andreas Tobler, David Edelsohn, John Hornkvist
powerpc64Jakub Jelinek
riscvMichael Knyszek, Andrew Waterman, Stef O'Rear
s390Gerhard Tonn, Ulrich Weigand
shKaz Kojima
sh64Kaz Kojima
sparcAnthony Green, Gordon Irlam
tile-gx/tileproWalter Lee
vaxMiod Vallat
x86Anthony Green, Jon Beniston
x86-64Bo Thorsen
xtensaChris Zankel

イェスパー・スコフとアンドリュー・ヘイリーが、コードを調べたりバグを追跡したりと、分担以上の仕事をしてくれた。

また、Tom Tromeyにはバグフィックス、ドキュメンテーション、コンフィギュレーションの手助けをしてもらった。

libffi のインターフェースについて有益なフィードバックをくれた Jim Blandy にも感謝する。

Andreas Toblerはtestsuiteに多大な労力を費やしてくれた。

Alex Oliva は SElinux の実行可能ページの問題を解決してくれた。

上記のリストはほぼ間違いなく不完全で不正確です。ご要望があれば、喜んで修正や追加を行います。

問題があったり、バグを見つけたりした場合は、issue tracker https://github.com/libffi/libffi/issues に問題を申請してください。作者への連絡先は green@moxielogic.com です。