実行ファイル、オブジェクト コード、共有ライブラリ、コア ダンプの標準ファイル形式
ELF ファイルには 2 つのビューがあります。プログラム ヘッダーには実行時に使用される セグメント が表示され、セクション ヘッダーには セクション のセットがリストされます。
コンピューティング において 、 実行可能およびリンク可能フォーマット [3] ( ELF 、以前は 拡張リンクフォーマットと呼ばれていました)は、 実行可能 ファイル、 オブジェクトコード 、 共有ライブラリ 、 デバイスドライバ 、 コアダンプ の 共通の標準 ファイルフォーマットです 。最初に Unix オペレーティングシステムのバージョン System V Release 4 (SVR4)の アプリケーションバイナリインタフェース (ABI)の仕様で公開され、 [4] 後 にツールインタフェース標準で公開され、 Unix システムのさまざまなベンダーの間ですぐに受け入れられました。1999年に、 86openプロジェクトによって
x86 プロセッサ上のUnixおよび Unix系 システムの標準バイナリファイルフォーマットとして選ばれました。
ELFフォーマットは、設計上、柔軟性、拡張性、そして クロスプラットフォーム性を 備えています。例えば、様々な エンディアンやアドレスサイズをサポートしているため、特定の CPU や 命令セットアーキテクチャを 排除することはありません。これにより 、様々なハードウェア プラットフォーム上の様々な オペレーティングシステム で採用されています 。
ファイルレイアウト
各ELFファイルは、1つのELFヘッダーとそれに続くファイルデータで構成されます。ファイルデータには以下が含まれます。
0個以上のメモリセグメント を記述するプログラムヘッダーテーブル
0個以上のセクションを記述するセクションヘッダーテーブル
プログラムヘッダーテーブルまたはセクションヘッダーテーブルのエントリによって参照されるデータ
キーエントリが強調表示された ELF ファイルの構造
セグメントに はファイルの実行に必要な情報が含まれており、セクションにはリンクと再配置に必要な重要なデータが含まれています。ファイル全体のどの バイト も 最大1つのセクションによって所有され、どのセクションにも所有されない孤立バイトが発生する場合があります。
ELFヘッダーは、 32ビット アドレスと 64ビット アドレスのどちらを使用するかを定義します 。ヘッダーには、この設定の影響を受ける3つのフィールドと、それに続く他のフィールドのオフセットが含まれます。ELFヘッダーの長さは、32ビットバイナリの場合は52バイト、64ビットバイナリの場合は64バイトです。
16進ダンプの例
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@..... |
[10]
プログラムヘッダーテーブルは、プロセスイメージの作成方法をシステムに指示します。これはファイルオフセット e_phoff にあり、 e_phnum 個 のエントリで構成され、各エントリのサイズは e_phentsizeです。32 ビット ELFと 64ビット ELF ではレイアウトが若干異なります。これは、アライメント上の理由から p_flags が構造体内の異なる位置に配置されているためです。各エントリは次のように構成されます。
アプリケーション
Unix系システム
ELF形式は、様々な環境で古い実行形式に取って代わりました。Unix 系 オペレーティングシステム
では、 a.out形式 と COFF 形式に取って代わりました。
非Unixの採用
ELF は、次のような Unix 以外のオペレーティング システムでも採用されています。
Microsoft Windows もELF形式を使用していますが、これは Windows Subsystem for Linux 互換性システムにのみ使用されています。 [18]
ゲーム機
一部のゲームコンソールでも ELF が使用されます。
プレイステーション・ポータブル、 [19] プレイステーション・ヴィータ、プレイステーション、プレイステーション2、プレイステーション3、プレイステーション4、プレイステーション5
GP2X
ドリームキャスト
ゲームキューブ
ニンテンドー64
Wii
WiiU
パワーPC
ELF を使用する PowerPC 上で実行されるその他の (オペレーティング) システム:
携帯電話
携帯電話やモバイルデバイスの一部のオペレーティング システムでは ELF が使用されています。
Symbian OS v9は ELFファイル形式をベースにしたE32Image [20]形式を使用します。
Sony Ericsson、たとえば W800i、W610、W300 など。
Siemens、SGOLD および SGOLD2 プラットフォーム: Siemens C65 から S75 および BenQ-Siemens E71/EL71。
たとえば、Motorola の E398、SLVR L7、v360、v3i (およびパッチが適用されたすべての LTE2 電話)。
たとえば、Bada の Samsung Wave S8500 などです。
Maemo または Meego OS を実行する Nokia の携帯電話またはタブレット (例: Nokia N900)。
Androidは 、Java Native Interface に ELF .so (共有オブジェクト [21] )ライブラリを使用します。 [ 引用が必要 ] Android 5.0 "Lollipop"以降のデフォルトである Android Runtime (ART)では 、すべてのアプリケーションはインストール時にネイティブELFバイナリにコンパイルされます。 [22] また、TermuxなどのパッケージマネージャーからネイティブLinuxソフトウェアを使用することも、リポジトリで利用可能なClangまたはGCCを介してソースからコンパイルすることもできます。
一部の携帯電話では、メインファームウェアにアセンブリコードを追加するパッチを使用することでELFファイルを実行できます。これは、アンダーグラウンドの改造文化では ELFPack として知られる機能です。ELFファイル形式は、 Atmel AVR (8ビット)、AVR32 [23]
、そしてTexas Instruments MSP430マイクロコントローラアーキテクチャでも使用されています。Open Firmwareの一部の実装もELFファイルを読み込むことができ、特にAppleの実装は同社が製造するほぼすべてのPowerPCマシンで使用されています。
Solanaは、オンチェーンプログラム(スマートコントラクト)にELF形式を使用しています。プラットフォームは、BPF(Berkeley Packet Filter)バイトコードにコンパイルされたELFファイルを処理し、共有オブジェクトとして展開され、Solanaのランタイム環境で実行されます。BPFローダーは、プログラムの展開中にこれらのELFファイルを検証および処理します。 [24]
86開く
86openは 、PC互換のx86アーキテクチャ上で動作するUnixおよびUnix系オペレーティングシステム用の共通バイナリファイル形式に関する合意形成を目的としたプロジェクトであり、ソフトウェア開発者によるx86アーキテクチャへの移植を促進することを目的としていました。 [25] 当初のアイデアは、Single UNIX Specの前身であるSpec 1170とGNU Cライブラリ(glibc)の小さなサブセットを標準化することで、変更されていないバイナリをx86 Unix系オペレーティングシステム上で実行できるようにすることでした。このプロジェクトは当初「Spec 150」と命名されていました。
最終的に選択されたフォーマットは ELF、具体的には Linux の ELF 実装であり、これは 関係するすべてのベンダーとオペレーティング システムによってサポートされる
事実上の標準であることが判明したためです。
このグループは 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の公式サポートを開始し、 [26] 後にSolaris Containers for Linux Applicationsを通じてLinuxバイナリ形式の統合サポートに移行しました。
BSDは長らくLinuxバイナリをサポートしており(互換性レイヤーを通じて)、主要なx86 Unixベンダーもこのフォーマットのサポートを追加していたため、プロジェクトはLinux ELFが業界で選択されたフォーマットであると決定し、1999年7月25日に「解散を宣言」しました。 [27]
FatELF: Linux 用ユニバーサルバイナリ
FatELFは、ファットバイナリ 機能を追加するELFバイナリ形式拡張です 。 [28] Linuxやその他のUnix系オペレーティングシステムを対象としています。CPUアーキテクチャの抽象化(バイトオーダー、ワードサイズ、 CPU 命令セットなど)に加えて、ソフトウェアプラットフォームの抽象化(例えば、複数のカーネルABIバージョンをサポートするバイナリなど)の利点も得られます。2021年現在 [update] 、FatELFはメインラインLinuxカーネルに統合されていません。 [29] [30] [31]
参照
参考文献
^ ab ツールインタフェース標準(TIS) 実行可能およびリンク形式(ELF)仕様バージョン1.2 (1995年5月)
^ ELF オブジェクトファイル形式: 付録 C: 改訂履歴
^ ツールインターフェース標準(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日 閲覧。
^ 「利用可能なレクサー — Pygments」. pygments.org . 2024年12月19日 閲覧 。
^ 「プログラムヘッダー」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: archived copy as title (link )
^ "GCCSDK – RISC OS". Riscos.info. 2012年4月22日. 2014年2月19日時点のオリジナルよりアーカイブ 。 2014年1月19日 閲覧。
^ 「Guardianプログラマーズガイド」 (PDF) . Hewlett Packard Enterprise. 2018年5月30日時点の オリジナル (PDF)からアーカイブ。 2018年5月30日 閲覧 。 p. 44 オリジナルからアーカイブ 2018年5月30日、 Wayback Machine で 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年6月8日 閲覧 。 動的リンクライブラリは共有オブジェクト(.so)とも呼ばれます。
^ Thomas, Romain. 「Android formats」. 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年3月11日時点のオリジナルよりアーカイブ。 2007年6月6日 閲覧 。
^ Record, Ronald (1998年5月21日). 「SCOにおける86openの現状に関する速報」. 2008年12月8日時点のオリジナルよりアーカイブ 。 2008年5月6日 閲覧。
^ Leibovitch, Evan (1999年7月25日). 「The86openプロジェクト – 最終更新」. 2007年2月27日時点のオリジナルよりアーカイブ 。 2007年5月6日 閲覧。
^ Gordon, Ryan. 「fatelf-specification v1」. icculus.org . 2010年7月25日 閲覧 。
^ ゴードン、ライアン. 「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日 閲覧。
さらに読む
ELF オブジェクト ファイル形式の進化 (Fangrui Song 著)。
Levine, John R. (2000) [1999年10月]. リンカーとローダー. モーガン・カウフマン著『ソフトウェア工学とプログラミング』(第1版). サンフランシスコ, 米国: Morgan Kaufmann . ISBN 1-55860-496-0 . OCLC 42413382. 2012年12月5日にオリジナルからアーカイブ 。 2020年1月12日 閲覧。 コード: [1] [1] [ リンク切れ ] エラッタ: [2]
Ulrich Drepper, How To Write Shared Libraries, Version 4.1.2 (2011). 著者のウェブページ 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年8月3日)
外部リンク
ELF オブジェクトファイル形式仕様
GitHub の ELF オブジェクトファイル形式
System V アプリケーションバイナリインターフェースとインターフェース定義
FreeBSD ハンドブック: バイナリ形式 (アーカイブ版)
FreeBSD elf(5) マニュアルページ
NetBSD ELF FAQ
Linux elf(5) マニュアルページ
Oracle Solaris リンカーおよびライブラリガイド
ERESIプロジェクト:ELFベースのオペレーティングシステムのリバースエンジニアリング 2021年3月14日アーカイブ - Wayback Machine
Linux Todayの86openの記事は、 Wayback Machine で2021年3月8日にアーカイブされています。 1999年7月26日
Debian Announce メーリングリストにおける 86open の発表 1997 年 10 月 10 日、 Bruce Perens
SCOグループ 対 IBM訴訟 におけるウルリッヒ・ドレッパーの陳述書(PDF) 、2006年9月19日
86openとELFに関する Groklaw での議論、2006年8月13日
^ https://archive.today/20200114225034/https://linker.iecc.com/code.html [ 裸のURL ]