| ファイル名拡張子 |
なし、.axf、.bin、.elf、.o、.out、.prx、.puff、.ko、.mod、および.so |
|---|---|
| 魔法の数字 | 0x7F 'E' 'L' 'F' |
| 開発者 | Unixシステム研究所[1] : 3 |
| フォーマットの種類 | バイナリ、実行可能、オブジェクト、共有ライブラリ、コアダンプ |
| コンテナ用 | 多くの実行可能なバイナリ形式 |

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

セグメントにはファイルの実行時に必要な情報が含まれており、セクションにはリンクと再配置のための重要なデータが含まれています。ファイル全体の任意のバイトは最大 1 つのセクションによって所有され、どのセクションにも所有されない孤立バイトが発生する可能性があります。
ELF ヘッダー
ELF ヘッダーは、 32 ビット アドレスを使用するか64 ビットアドレスを使用するかを定義します。ヘッダーには、この設定によって影響を受け、それに続く他のフィールドをオフセットする 3 つのフィールドが含まれます。ELF ヘッダーの長さは、32 ビット バイナリの場合は 52 バイト、64 ビット バイナリの場合は 64 バイトです。
プログラムヘッダー
プログラム ヘッダー テーブルは、プロセス イメージの作成方法をシステムに指示します。これはファイル オフセットe_phoffにあり、各エントリのサイズがe_phentsizeであるe_phnumエントリで構成されています。32ビットELF と64 ビットELFではレイアウトが若干異なります。これは、アライメント上の理由からp_flagsが別の構造体の場所にあるためです。各エントリは次のように構成されます。
セクションヘッダー
ツール
readelfは、1 つ以上の ELF ファイルに関する情報を表示する Unix バイナリ ユーティリティです。フリー ソフトウェア実装はGNU Binutilsによって提供されています。elfutils純粋にLinux向けのGNU Binutilsの代替ツールを提供します。 [10]elfdumpは、ELF ファイル内の ELF 情報を表示するためのコマンドであり、Solaris およびFreeBSDで使用できます。objdumpELF ファイルやその他のオブジェクト形式に関する幅広い情報を提供します。ELFデータを構造化するために、バックエンドとしてバイナリ ファイル記述子ライブラリをobjdump使用します。- Unix
fileユーティリティは、再配置可能、実行可能、または共有オブジェクト ファイル内のコードが対象としている命令セット アーキテクチャや、ELFコア ダンプが生成された命令セット アーキテクチャなど、ELF ファイルに関するいくつかの情報を表示できます。
アプリケーション
Unix系システム
ELF 形式は、さまざまな環境で古い実行形式に取って代わりました。Unix系オペレーティング システムでは、 a.out 形式とCOFF形式に取って代わりました。
- リナックス
- ソラリス/イルモス
- アイリックス
- フリーBSD [11]
- ネットBSD
- オープンBSD
- 酸化還元
- ドラゴンフライBSD
- 音節
- HP-UX ( SOM を引き続き使用する 32 ビット PA-RISC プログラムを除く)
- QNXニュートリノ
- ミニックス[12]
非Unixの採用
ELF は、次のような Unix 以外のオペレーティング システムでも採用されています。
- OpenVMSのItanium版とamd64版[13]
- x86ベースのコンピュータ用のBeOSリビジョン 4 以降( Portable Executable形式に代わるものです。PowerPCバージョンではPreferred Executable 形式のままです)
- Haiku、BeOS のオープンソース再実装
- RISC OS [14]
- Stratus VOS、PA-RISC および x86 バージョン
- スカイOS
- フクシアOS
- Z/TPF
- HPEノンストップOS [15]
- デオス
Microsoft WindowsもELF形式を使用していますが、これはWindows Subsystem for Linux互換システムのみに使用されています。[16]
ゲーム機
一部のゲームコンソールでも ELF が使用されています。
- プレイステーション・ポータブル、[17]プレイステーション・ヴィータ、プレイステーション、プレイステーション2、プレイステーション3、プレイステーション4、プレイステーション5
- GP2X
- ドリームキャスト
- ゲームキューブ
- ニンテンドー64
- ウィイ
- WiiU について
パワーPC
ELF を使用する PowerPC 上で実行されるその他の (オペレーティング) システム:
- AmigaOS 4 では、ELF 実行ファイルが、PPC プロセッサ拡張カードを搭載した Amiga で使用されていた以前のExtended Hunk Format (EHF) に代わるものです。
- モルフォOS
- アロス
- Café OS (Wii U で動作するオペレーティングシステム)
携帯電話
携帯電話やモバイル デバイスの一部のオペレーティング システムでは ELF が使用されています。
- Symbian OS v9はELFファイル形式をベースにしたE32Image [18]形式を使用します。
- たとえば、Sony Ericsson の W800i、W610、W300 など。
- Siemens、SGOLD および SGOLD2 プラットフォーム: Siemens C65 から S75 および BenQ-Siemens E71/EL71。
- たとえば、Motorola の E398、SLVR L7、v360、v3i (およびパッチが適用されたすべての LTE2 電話)。
- たとえば、Samsung Wave S8500 などの Bada です。
- Maemo または Meego OS を実行する Nokia の携帯電話またはタブレット (例: Nokia N900)。
- Androidは、Java Native InterfaceにELF .so(共有オブジェクト[19] )ライブラリを使用します。[要出典] Android 5.0 "Lollipop"以降のデフォルトであるAndroid Runtime (ART)では、すべてのアプリケーションはインストール時にネイティブELFバイナリにコンパイルされます。[20]また、TermuxなどのパッケージマネージャーからネイティブLinuxソフトウェアを使用することも、リポジトリで利用可能なClangまたはGCCを介してソースからコンパイルすることもできます。
一部の携帯電話では、メインファームウェアにアセンブリコードを追加するパッチを使用することでELFファイルを実行できます。これは、アンダーグラウンドの改造文化ではELFPackと呼ばれる機能です。ELFファイル形式は、Atmel AVR(8ビット)、AVR32 [21] 、およびTexas Instruments MSP430マイクロコントローラアーキテクチャでも使用されています。Open Firmwareの実装の中には、ELFファイルを読み込むことができるものもあります。最も有名なのは、Appleの実装で、同社が製造したほぼすべてのPowerPCマシンで使用されています。
ブロックチェーンプラットフォーム
- Solanaはオンチェーンプログラム(スマートコントラクト)にELF形式を使用しています。プラットフォームはBPF(Berkeley Packet Filter)バイトコードにコンパイルされたELFファイルを処理し、共有オブジェクトとして展開され、Solanaのランタイム環境で実行されます。BPFローダーは、プログラムの展開中にこれらのELFファイルを検証して処理します。[22]
86開く
86openは、一般的なPC互換のx86アーキテクチャ上のUnixおよびUnix系オペレーティングシステム用の共通バイナリファイル形式について合意を形成し、ソフトウェア開発者にアーキテクチャへの移植を促すプロジェクトでした。[23]当初のアイデアは、Single UNIX仕様の前身であるSpec 1170の小さなサブセットとGNU Cライブラリ(glibc)を標準化して、変更されていないバイナリをx86 Unix系オペレーティングシステムで実行できるようにすることでした。このプロジェクトは当初「Spec 150」と呼ばれていました。
最終的に選択されたフォーマットは ELF、具体的には ELF の Linux 実装であり、関係するすべてのベンダーとオペレーティング システムによってサポートされる事実上の標準であることが判明しました。
このグループは 1997 年に電子メールによる議論を開始し、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の公式サポートを発表しました。サンマイクロシステムズは1999年初頭にSolaris用のlxrunの公式サポートを開始し、[24]後にSolaris Containers for Linux Applicationsを介してLinuxバイナリ形式の統合サポートに移行しました。
BSD は長い間 Linux バイナリをサポートしており (互換性レイヤーを通じて)、主要な x86 Unix ベンダーもこの形式のサポートを追加していたため、プロジェクトは Linux ELF が業界が選択した形式であると決定し、1999 年 7 月 25 日に「解散を宣言」しました。[25]
FatELF: Linux 用のユニバーサルバイナリ
FatELFは、ファットバイナリ機能を追加するELFバイナリ形式の拡張です。[26] Linuxやその他のUnix系オペレーティングシステムを対象としています。CPUアーキテクチャの抽象化(バイトオーダー、ワードサイズ、CPU命令セットなど)に加えて、複数のカーネルABIバージョンをサポートするバイナリなど、ソフトウェアプラットフォームの抽象化の潜在的な利点があります。2021年現在[アップデート]、FatELFはメインラインのLinuxカーネルに統合されていません。[27] [28] [29]
参照
- アプリケーションバイナリインターフェース
- 実行ファイル形式の比較
- DWARF – デバッグデータ用のフォーマット
- Intel バイナリ互換性標準
- ポータブル実行可能ファイル – Windowsで使用される形式
- vDSO – 仮想 DSO
- 位置独立コード
参考文献
- ^ ab ツール インターフェース標準 (TIS)実行可能およびリンク形式 (ELF) 仕様バージョン 1.2 (1995 年 5 月)
- ^ ツール インターフェース標準 (TIS)ポータブル フォーマット仕様バージョン 1.1 (1993 年 10 月)
- ^ System V アプリケーションバイナリインタフェースエディション 4.1 (1997-03-18)
- ^ 「ELF ヘッダー」。Sco.com。2000 年 7 月。2014 年 2 月 7 日閲覧。
- ^ "LXR linux/include/linux/elf.h". linux.no . 2015年4月27日閲覧。
- ^ 「glibc 2.12 の発表」。
- ^ 「sourceware.org Git - glibc.git/blob - libc-abis」。
- ^ “sourceware.org Git - glibc.git/blob - sysdeps/gnu/ldsodefs.h”. 2021年3月7日時点のオリジナルよりアーカイブ。2019年10月28日閲覧。
- ^ 「プログラムヘッダー」。Sco.com。2000年7月。2017年4月5日閲覧。
- ^ "elfutils". sourceware.org . 2017年4月30日閲覧。
- ^ 「バイナリ形式」。2019年3月31日時点のオリジナルよりアーカイブ。2019年3月31日閲覧。
- ^ 「MinixReleases – Minix Wiki」。Wiki.minix3.org。2013年3月30日時点のオリジナルよりアーカイブ。2014年1月19日閲覧。
- ^ 「アーカイブコピー」(PDF) 。 2020年9月15日時点のオリジナル(PDF)からアーカイブ。 2016年10月19日閲覧。
{{cite web}}: CS1 maint: アーカイブされたコピーをタイトルとして (リンク) - ^ 「GCCSDK – RISC OS」Riscos.info。2012年4月22日。2014年2月19日時点のオリジナルよりアーカイブ。2014年1月19日閲覧。
- ^ 「Guardian Programmer's Guide」(PDF) 。Hewlett Packard Enterprise。 2018年5月30日時点のオリジナル(PDF)からアーカイブ。2018年5月30日閲覧。p. 44 2018-5-30 にオリジナルからアーカイブ
- ^ Foley, Mary Jo. 「Microsoft の Linux 用 Windows サブシステムの内部」ZDNet 。2016年 8 月 19 日閲覧。
- ^ PlayStation Portableは暗号化され再配置されたELFを使用: PSP
- ^ Symbian OS 実行ファイル形式
- ^ Rosen, Kenneth; Host, Douglas; Klee, Rachel; Rosinski, Richard (2007). UNIX: The Complete Reference (第 2 版). McGraw Hill Professional. p. 707. ISBN
9780071706988. 2017-06-08取得。
動的にリンクされたライブラリは、共有オブジェクト (.so) とも呼ばれます。
- ^ Thomas, Romain. 「Androidフォーマット」。Quarks Lab。2023年2月16日時点のオリジナルよりアーカイブ。2023年1月17日閲覧。
- ^ 「第 4 章: オブジェクト ファイル」、System V アプリケーション バイナリ インターフェイス、2009-10-26、e_machine
- ^ 「Solana プログラム」。Solana Foundation。2024 年 11 月 11 日。2024年 11 月 11 日に取得。Solana
は LLVM コンパイラ インフラストラクチャを活用して、プログラムを実行可能およびリンク可能な形式 (ELF) ファイルにコンパイルします。
- ^ Leibovitch, Evan (1997-12-23). 「86Open よくある質問」。2007-03-11 時点のオリジナルよりアーカイブ。2007-06-06閲覧。
- ^ Record, Ronald (1998-05-21). 「SCO における 86open の現状に関する速報」。2008 年 12 月 8 日時点のオリジナルよりアーカイブ。2008年 5 月 6 日閲覧。
- ^ Leibovitch, Evan (1999-07-25). 「The86open プロジェクト – 最終更新」。2007-02-27 時点のオリジナルよりアーカイブ。2007-05-06閲覧。
- ^ Gordon, Ryan. 「fatelf-specification v1」. icculus.org . 2010年7月25日閲覧。
- ^ Gordon, Ryan. 「FatELF: 結局、不確実性の方が気に入った」 icculus.org 。 2010 年 7 月 13 日閲覧。
- ^ ホルウェルダ、トム (2009-11-03)。 「ライアン・ゴードン、FatELFプロジェクトを停止」。 osnews.com 。2010 年 7 月 5 日に取得。
- ^ Brockmeier, Joe (2010 年 6 月 23 日)。「SELF: (疑惑の) 失敗の分析」Linux Weekly News。2011年 2 月 6 日閲覧。
[1]
さらに読む
- Levine, John R. (2000) [ 1999年 10 月]。リンカーとローダー。Morgan Kaufmann ソフトウェア エンジニアリングおよびプログラミング シリーズ (第 1 版)。サンフランシスコ、米国: Morgan Kaufmann。ISBN 1-55860-496-0. OCLC 42413382. 2012年12月5日にオリジナルからアーカイブ。2020年1月12日閲覧。コード: [1][2] エラッタ: [3]
- Ulrich Drepper、「共有ライブラリの書き方」バージョン 4.1.2 (2011)。著者の Web ページ https://www.akkadia.org/drepper で公開されています。
- 知られざる英雄: 勤勉な ELF、ピーター・シーバッハ著、2005 年 12 月 20 日、2007 年 2 月 24 日のオリジナルからアーカイブ
- LibElf と GElf – Wayback Machineで ELf ファイルを操作するライブラリ(2004 年 2 月 25 日アーカイブ)
- ELF オブジェクト ファイル形式: 概要、Dissection による ELF オブジェクト ファイル形式、 Eric Youngdale (1995-05-01)
- Linux 用の本当に小さな ELF 実行ファイルを作成するための駆け足のチュートリアル ( Brian Raiter 著)
- ELF 再配置不可能なオブジェクトへの再配置 (Julien Vanegue 著、2003-08-13)
- ELFsh チームによる ptrace なしの組み込み ELF デバッグ (2005-08-01)
- ELF 負荷と再配置に関する研究(Pat Beirne 著、1999-08-03)
外部リンク
- FreeBSD ハンドブック: バイナリ形式 (アーカイブ版)
- FreeBSD elf(5) マニュアルページ
- NetBSD ELF FAQ
- Linux elf(5) マニュアルページ
- Oracle Solaris リンカーおよびライブラリ ガイド
- ERESI プロジェクト: ELF ベースのオペレーティング システムのリバース エンジニアリング 2021-03-14 にWayback Machineでアーカイブされました
- 86open の Linux Today 記事 1999 年 7 月 26 日
- Debian Announce メーリングリストでの 86open の発表 1997 年 10 月 10 日、Bruce Perens
- SCO グループ対IBMにおけるウルリッヒ・ドレッパーの宣誓供述書 (PDF) 、2006 年 9 月 19 日
- 86open と ELF の議論は、2006 年 8 月 13 日、GroklawのWayback Machineに 2019 年 2 月 1 日にアーカイブされました。
- ^ いいえ
