
コンピューティングにおいて、実行可能ファイルおよびリンク可能フォーマット[ 3 ](ELF、以前は拡張リンクフォーマットと呼ばれていました)は、実行可能ファイル、オブジェクトコード、共有ライブラリ、デバイスドライバ、およびコアダンプの一般的な標準ファイルフォーマットです。UnixオペレーティングシステムバージョンのSystem V Release 4(SVR4)[ 4 ]のアプリケーションバイナリインターフェース(ABI)仕様で最初に公開され、後にツールインターフェース標準[ 1 ]にも掲載されたELFは、 Unixシステムのさまざまなベンダーの間で急速に受け入れられました。1999年には、 86openプロジェクトによって、 x86プロセッサ上のUnixおよびUnixライクシステムの標準バイナリファイルフォーマットとして選ばれました。
ELFフォーマットは、設計上、柔軟性、拡張性、クロスプラットフォーム性を備えています。例えば、様々なエンディアンやアドレスサイズをサポートしているため、特定のCPUや命令セットアーキテクチャを排除することはありません。この特性により、様々なハードウェアプラットフォーム上の多くのオペレーティングシステムで採用されています。
各ELFファイルは、1つのELFヘッダーとそれに続くファイルデータで構成されます。データには以下が含まれます。

セグメントにはファイルの実行時に必要な情報が含まれており、セクションにはリンクと再配置に必要な重要なデータが含まれています。ファイル全体のどのバイトも、最大で1つのセクションにしか属することができず、どのセクションにも属さない孤立バイトが発生する可能性があります。
ELFヘッダーは、 32ビットアドレスを使用するか64ビットアドレスを使用するかを定義します。ヘッダーには、この設定の影響を受ける3つのフィールドがあり、それらのフィールドは後続の他のフィールドをオフセットします。ELFヘッダーの長さは、32ビットバイナリの場合は52バイト、64ビットバイナリの場合は64バイトです。
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 | .ELF............ | 00000010 02 00 3e 00 01 00 00 00 c5 48 40 00 00 00 00 00 | ..>......H@..... |プログラムヘッダーテーブルは、プロセスイメージの作成方法をシステムに指示します。ファイルオフセットe_phoffにあり、それぞれサイズがe_phentsizeのe_phnum個のエントリで構成されています。p_flagsがアライメント上の理由から異なる構造体位置にあるため、 32 ビットELF と64 ビットELFではレイアウトが若干異なります。各エントリは次のように構成されています。
readelfは、1つまたは複数のELFファイルに関する情報を表示するUnixバイナリユーティリティです。フリーソフトウェア版はGNU Binutilsによって提供されています。elfutilsLinux専用のGNU Binutilsの代替ツールを提供する。 [ 12 ]elfdumpは、ELF ファイル内の ELF 情報を表示するためのコマンドで、Solaris およびFreeBSDで使用できます。objdumpELFファイルやその他のオブジェクトフォーマットに関する幅広い情報を提供します。バックエンドとしてバイナリファイル記述子ライブラリobjdumpを使用してELFデータを構造化します。fileユーティリティは、ELFファイルに関する情報を表示できます。これには、再配置可能ファイル、実行可能ファイル、または共有オブジェクトファイル内のコードが対象とする命令セットアーキテクチャ、あるいはELFコアダンプが生成された対象となる命令セットアーキテクチャなどが含まれます。ELF形式は、さまざまな環境で従来の実行可能ファイル形式に取って代わってきました。Unix系オペレーティングシステムでは、 a.out形式とCOFF形式に取って代わりました。
ELFは、Unix以外のオペレーティングシステムでも採用されており、例えば以下のようなものがある。
Microsoft WindowsもELF形式を使用していますが、Windows Subsystem for Linux互換システムでのみ使用されています。[ 18 ]
一部のゲーム機もELF形式を使用しています。
ELFを使用するPowerPC上で動作するその他の(オペレーティング)システム:
携帯電話やモバイルデバイス向けの一部のオペレーティングシステムはELFを使用しています。
一部の携帯電話は、メインファームウェアにアセンブリコードを追加するパッチを使用することでELFファイルを実行できます。これは、アンダーグラウンドの改造文化ではELFPackとして知られる機能です。ELFファイル形式は、Atmel AVR(8ビット)、AVR32 [ 23 ] 、およびTexas Instruments MSP430マイクロコントローラアーキテクチャでも使用されています。Open Firmwareの実装の中にはELFファイルをロードできるものもあり、最も有名なのはAppleが製造したほぼすべてのPowerPCマシンで使用されているAppleの実装です。
Linux Standard Base (LSB) は、それが規定されているアーキテクチャの上記の仕様の一部を補足します。[ 25 ]例えば、System V ABI、AMD64 Supplement がその例です。[ 26 ] [ 27 ]
86open は、共通の PC 互換の x86 アーキテクチャ上の Unix および Unix ライクなオペレーティングシステム用の共通バイナリ ファイル フォーマットについて合意を形成し、ソフトウェア開発者がそのアーキテクチャに移植することを奨励するためのプロジェクトでした。[ 28 ]当初のアイデアは、Single UNIX Specification の前身である Spec 1170 の小さなサブセットと GNU C ライブラリ (glibc) を標準化して、変更されていないバイナリが x86 Unix ライクなオペレーティングシステムで実行できるようにすることでした。このプロジェクトは当初「Spec 150」と指定されていました。
最終的に選ばれたフォーマットはELF、具体的にはLinux版のELFでした。これは、関係するすべてのベンダーとオペレーティングシステムによって事実上の標準としてサポートされていることが判明したためです。
このグループは1997年に電子メールでの議論を開始し、同年8月22日にサンタクルーズ作戦本部のオフィスで初めて会合を開いた。
運営委員会は、Marc Ewing、Dion Johnson、Evan Leibovitch、Bruce Perens、Andrew Roach、Bryan Wayne Sparks、Linus Torvalds で構成されていました。プロジェクトに参加したその他のメンバーは、Keith Bostic、Chuck Cranor、Michael Davidson、Chris G. Demetriou、Ulrich Drepper、Don Dugger、Steve Ginzburg、Jon "maddog" Hall、Ron Holt、Jordan Hubbard、Dave Jensen、Kean Johnston、Andrew Josey、Robert Lipe、Bela Lubkin、Tim Marsland、Greg Page、Ronald Joe Record、Tim Ruckle、Joel Silverstein、Chia-pi Tien、Erik Troan でした。参加したオペレーティングシステムと企業は、BeOS、BSDI、FreeBSD、Intel、Linux、NetBSD、SCO、SunSoft でした。
プロジェクトは進展し、1998 年半ばに SCO は、OpenServer、UnixWare、Solaris 上で Linux バイナリを実行できるオープンソースの互換性レイヤーである lxrun の開発を開始しました。SCO は 1999 年 3 月に LinuxWorld で lxrun の公式サポートを発表しました。Sun Microsystems は 1999 年初頭に Solaris 向け lxrun の公式サポートを開始し[ 29 ]、その後 Solaris Containers for Linux Applications を介して Linux バイナリ形式の統合サポートに移行しました。
BSD系OSが(互換性レイヤーを介して)Linuxバイナリを長年サポートし、主要なx86 Unixベンダーもこのフォーマットのサポートを追加したことから、プロジェクトはLinux ELFが業界で選ばれたフォーマットであると判断し、1999年7月25日に「解散を宣言」した。[ 30 ]
FatELFは、ファットバイナリ機能を追加するELFバイナリフォーマットの拡張です。[ 31 ]これはLinuxやその他のUnix系オペレーティングシステムを対象としています。CPUアーキテクチャの抽象化(バイト順序、ワードサイズ、CPU命令セットなど)に加えて、複数のカーネルABIバージョンをサポートするバイナリなど、ソフトウェアプラットフォームの抽象化という潜在的な利点があります。2021年現在FatELFはLinuxカーネルのメインラインには統合されていません。[ 32 ] [ 33 ] [ 34 ]
動的リンクライブラリは共有オブジェクト(.so)とも呼ばれます。
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)は LLVM コンパイラ インフラストラクチャを利用して、プログラムを実行可能リンク形式 (ELF) ファイルにコンパイルします。
{{cite book}}: CS1 maint: 非推奨のアーカイブサービス (リンク)コード: [ 1 ]訂正:{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)