0から作るソフトウェア開発

日々勉強中。。。

0から作るOS開発

環境準備

環境設定

ブートローダ

カーネルローダ

GRUB

カーネル

ドライバーその他

Tips ELFフォーマットその1 ELFフォーマットについて

ELFフォーマット

ここでは、実行バイナリのオブジェクトフォーマットのうちELFフォーマット

(Executable and Linking Format)を補足資料としてみていきます。


それでは、順番に見ていきます。

  1. (現在のページ) ELFフォーマットその1 ELFフォーマットについて


  2. ELFフォーマットその2 CPU依存部分について(IntelのCPU)


  3. ELFフォーマットその3 OS依存部分について(UNIX System V Release4)


実行バイナリ

実行バイナリはCPUが実行する命令と命令が使用するデータの集まりとなります。

コンピューターが実行ファイルを実行するときにはまず、ファイルの命令とデータをメモリーに

置いて最初の命令を実行する必要があります。このとき最初の命令がどこにあるのかが

分かっていないと実行できません。このためどこから命令を実行するのかといった情報を

実行バイナリにヘッダーをつけたものが実行フォーマットとなります。昔のパソコンで使用していた

MS-DOSの.COMフォーマットの場合、単純に.COMイメージの256バイト目が開始アドレスで

単純な構造でした。

実行フォーマットとオブジェクトフォーマット

プログラムを実行するときに必要な情報をヘッダーとしてつけるといった取り決めが

フォーマットとなります。プログラムでは実行フォーマットやオブジェクトフォーマットという言葉が

よく出てきます。実行フォーマットもオブジェクトフォーマットも格納されている機械語が

どんなCPUで動かすのかといった情報を、リンカーなどのプログラムが利用できるように

取り決めた決まり事となります。オブジェクトフォーマットはリンキングするときに

使用する情報を持ったフォーマットで、実行フォーマットは実行時に必要な

情報を持ったフォーマットとなります。実行フォーマットとオブジェクトフォーマットは

コンピューターの進化とともに色々な種類のフォーマットが開発されてきました。



ELFフォーマットでは実行フォーマットとオブジェクトフォーマットの両方を

オブジェクトフォーマットと言います。

ELFフォーマットができるまで

オブジェクトフォーマットには色々な種類があります。主なフォーマットとして3種類ほど

あります。


COFFフォーマットとELFフォーマットはフォーマットの違いはありますがだいたい似たような

情報を持っています。(ELFフォーマットの方が新しいフォーマットとなります)。


Linux、BSDではデフォルトのフォーマットとしてELFフォーマットが採用されています。

WindowsはPEフォーマット(COFFフォーマット)で、AppleはMach-Oフォーマットを

使っています。


ELFフォーマットはもともとUSL(UNIX System Laboratories)が開発していた

フォーマットですが、1990年代に各社共同でTIS(Tool Interface Standard)

委員会を立ち上げ正式なフォーマットを決めました。TIS委員会にはコンパイラ開発会社

(Watcom、Borlandなど)、CPU開発会社(IBM、Intelなど)、OS開発会社

(IBS、Microsoftなど)が参加しています。そして、1995年には、更に委員会社が増え、

Tool Interface Standard(TIS) Executable and Linking Format(ELF)

Specification Version1.2(TIS ELF仕様 バージョン1.2)
が発行されました。


前置きはこれぐらいで、いよいよEFLフォーマットの詳細について見ていきます。

ELFフォーマット仕様

このサイトでは、ELF(Executable and Linking Format)を”ELFフォーマット”と

しています。(Formatとフォーマットが重複していますが、ご容赦ください。。。)

1.オブジェクトファイル

はじめに

まずは、ELFフォーマットであるオブジェクトファイルのフォーマットについて見ていきます。

ELFフォーマットのオブジェクトファイルとして3種類あります。

オブジェクトファイルフォーマット

オブジェクトファイルはオブジェクトファイル同士のリンクや実行ファイルの実行時に使用されます。

リンク時や実行時に必要なオブジェクトファイルの情報は次のようなフォーマットになっています。

オブジェクトファイルフォーマット

ELFヘッダーはオブジェクトファイルの先頭にあり、ELFフォーマットの情報が記録されています。

セクションにはリンクに必要なオブジェクトファイルの情報(命令コード、データ、シンボルテーブル、

再配置情報など)が記録されています。そして、セクションには特別なセクションがあります。


プログラムヘッダーテーブルは、オブジェクトファイルに無い場合もありますが、OSがプロセスを

起動するときに必要な情報が記録されています。(プロセスとして起動する実行ファイルには

必ずプログラムヘッダーテーブルが必要です)。セクションヘッダーテーブルにはオブジェクトファイルの

セクション情報が記録されています。各セクションはテーブルになっていて、テーブルが持つ各

エントリーにはセクション名、セクションのサイズなどが記録されています。リンクするオブジェクト

ファイルにはセクションヘッダーテーブルが必ず必要です。リンクしないオブジェクトファイルは

無くても問題ありません。

補足
図ではELFヘッダーの直ぐ後に、プログラムヘッダーテーブルとセクションヘッダーテーブルが

ありますが、実際のオブジェクトファイルでは違う場合があります。更に、セクションの

並び順とセグメントの並び順は、どんな順番でも問題ありません。ELFヘッダーに位置が

記録されています。


データ型について

ELFフォーマットのオブジェクトファイルは8ビットCPUから32ビットCPUのアーキテクチャーを想定して

います。(64ビットアーキテクチャーにも拡張可能です)。アーキテクチャーが違うと同じデータ型でも

表現できる値の範囲も違ってきますのでデータの型式を定義します。(フォーマット以外の実行

時に必要な命令やデータなどはもちろん実行させるアーキテクチャーにあわせたデータ型を使用

します)。

32ビットのデータ型
名前 サイズ(バイト) アライメント 目的
Elf32_Addr 4 4 符号無しのプログラムアドレスに使用します
Elf32_Half 2 2 符号無しの16ビット整数に使用します。
Elf32_Off 4 4 符号無しのオフセットに使用します。
Elf32_Sword 4 4 符号付きの32ビット整数に使用します。
Elf32_Word 4 4 符号無しの32ビット整数に使用します。
unsigned char 1 1 符号無しの8ビット整数に使用します。


ELFフォーマットで定義しているデータ型は上記表のサイズを定義し、データをアライメントする

ようにしています。4バイトのデータを4バイト境界にアライメントできない場合にはパディング

します。例えば、Elf32_Addrデータはオブジェクトファイルの中に4バイト境界で格納されて

います。また、移植性を高めるためにELFフォーマットではビットフィールドを使用しません。

文字列について

ELFフォーマットで使用する文字には7ビットASCIIコードを使用します。文字として7ビット

ASCIIコード(0から127)の範囲以外の値を使用しても問題はありません。この場合には、

次のガイドラインに従うようにします。

このガイドラインは特に多言語を扱うアプリケーションに関係してきます。

補足
ELFフォーマットでは従来から使用している名前の付け方があります。DT_、PT_から

はじまる名前がそうで、特にCPUを特定してDT_M32_SPECIALといったように名前を

つけています。しかし、ELFフォーマットではこのような名前の付け方はこれ以上しない

ようにしています。

それでは、ELFフォーマットについて詳細を見ていきます。

ELFヘッダー

ELFヘッダーにはオブジェクトファイルのセクションやセグメントがいくつあっても問題ない

ように、各情報のサイズが記録されています。ELFフォーマットが変更されてしまうと

各情報のサイズがわからなくなってしまいますので、ELFフォーマットを扱うプログラムは

”余分な”情報を無視するようにしておきます。また、ELFフォーマットの拡張などで

”無くなってしまう”情報については、何時フォーマットの拡張が定義されるのか

または定義されるのかどうかは告知されます。


ELFヘッダーのフォーマットは次のようになります。


#define EI_NIDENT        16

typedef struct
{
    unsigned char    e_ident[ EI_NIDENT ];
    Elf32_Half       e_type;
    Elf32_Half       e_machine;
    Elf32_Word       e_version;
    Elf32_Addr       e_entry;
    Elf32_Off        e_phoff;
    Elf32_Off        e_shoff;
    Elf32_Word       e_flags;
    Elf32_Half       e_ehsize;
    Elf32_Half       e_phentsize;
    Elf32_Half       e_phnum;
    Elf32_Half       e_shentsize;
    Elf32_Half       e_shnum;
    Elf32_Half       e_shstrndx;
} Elf32_Ehdr;



ELFヘッダー
メンバー 説明
e_ident ELFフォーマットのオブジェクトファイルであるということと、 どのCPUに依存しているかを示すIDが格納されます。 詳細はe_identについてを参照してください。
e_type オブジェクトファイルのタイプを指定します。

e_type
タイプ名 説明
ET_NONE 0 不明。どのファイルタイプでもありません。
ET_REL 1 再配置可能なファイルです。
ET_EXEC 2 実行ファイルです。
ET_DYN 3 共有オブジェクトファイルです。
ET_CORE 4 コアファイルです。
ET_LOPROC 0xFF00 プロセッサー依存です。
ET_HIPROC 0xFFFF プロセッサー依存です。

コアファイルについては特に定義はありませんが、ET_COREは予約として定義しています。 ET_LOPROCからET_HIPROC(0xFF00-0xFFFF)はCPU依存のタイプとして予約されています。 上記表以外の値は将来定義されるオブジェクトファイル用に予約されています。
e_machine オブジェクトファイルに必要なアーキテクチャーを指定します。

e_machine
マシン名 説明
EM_NONE 0 不明。どのアーキテクチャーでもありません。
EM_M32 1 AT&T WE 32100です。
EM_SPARC 2 SPARCです。
EM_386 3 インテルアーキテクチャーです。
EM_68K 4 モトローラ68000です。
EM_88K 5 モトローラ88000です。
ET_860 7 インテル80860です。
EM_MIPS 8 MIPS RS3000ビッグエンディアンです。
EM_MIPS_RS4_BE 10 MIPS RS4000ビッグエンディアンです。
RESERVED 11-16 予約されています。

上記表以外の値は予約されていて、これから出てくるアーキテクチャーに 割り当てられます。命名規則としてはEF_の後にアーキテクチャー名が付きます。 例えば、アーキテクチャー名がXYZでフラグ名がWIDGETの場合、 EM_XYZ_WIDGETとなります。
e_version オブジェクトファイルのバージョンが格納されます。

e_version
バージョン名 説明
EV_NONE 0 無効なバージョンです。
EV_CURRENT 1 現在のバージョンです。

値1は元々のファイルフォーマットのバージョン番号となります。 この値はフォーマットが変わるごとに大きな数字となっていきます。 ですので、EV_CURRENTは1以上の数字で将来的にフォーマットが 変わるとEV_CURRENTはそのフォーマットのバージョン番号となります。
e_entry OSがプロセスを実行する時に一番最初に実行する仮想アドレスが格納されます。 オブジェクトファイルが実行ファイルでない場合は、0が格納されます。
e_phoff オブジェクトファイルに格納されている プログラムヘッダーテーブル のオフセット(単位はバイト)が格納されます。 オブジェクトファイルにプログラムヘッダーテーブルが無い場合には、 0が格納されます。
e_shoff オブジェクトファイルに格納されている セクションヘッダーテーブル のオフセット(単位はバイト)が格納されます。 オブジェクトファイルにセクションヘッダーテーブルが無い場合には、 0が格納されます。
e_flags オブジェクトファイルにプロセッサー固有の情報(命令など)が 格納されていることを示すフラグとなります。フラグ名は EF_machine_flagとなります。
e_ehsize ELFヘッダーのサイズ(単位はバイト)が格納されます。
e_phentsize オブジェクトファイルに格納されている プログラムヘッダーテーブル の1つのエントリーのサイズ(単位はバイト)が格納されます。 テーブルの各エントリーは全て同じサイズです。
e_phnum プログラムヘッダーテーブル のエントリー数が格納されます。 e_phentsize とe_phnumを掛ければプログラムヘッダーテーブルのサイズ(単位はバイト)となります。 オブジェクトファイルにプログラムヘッダーテーブルが無い場合、0が格納されます。
e_shentsize セクションヘッダー のサイズ(単位はバイト)が格納されます。 セクションヘッダーは セクションヘッダーテーブル の1つのエントリーです。 各セクションヘッダーは全て同じサイズとなります。
e_shnum セクションヘッダーテーブル のエントリー数が格納されます。 e_shentsize とe_shnumを掛ければセクションヘッダーテーブルのサイズ(単位はバイト)となります。 オブジェクトファイルにセクションヘッダーテーブルが無い場合、0が格納されます。
e_shstrndx セクションヘッダーテーブル のエントリーである セクション名文字列テーブル を指すインデックス値となります。 オブジェクトファイルにセクション名文字列テーブルが無い場合、 SHN_UNDEFとなります。


e_ident(配列)について

ELFフォーマットでは、複数のプロセッサー、複数のデータエンコーディング、32ビット

と64ビットプロセッサーに対応しています。このためe_identの値からオブジェクト

ファイルにマシン固有の情報があるかどうか判断します。(例えば、64ビット命令

が含まれている実行ファイルの場合32ビットのプロセッサーでは実行することが

できませんので、プロセスを実行する前にe_identの値で判断します)。

e_identはオブジェクトファイルのELFヘッダーの先頭にあります。

e_ident配列のインデックス
インデックス名 インデックス値 e_ident配列に格納される内容
EI_MAG0 0 マジックナンバーその1が格納されます。
EI_MAG1 1 マジックナンバーその2が格納されます。
EI_MAG2 2 マジックナンバーその3が格納されます。
EI_MAG3 3 マジックナンバーその4が格納されます。
EI_CLASS 4 ファイルクラスが格納されます。
EI_DATA 5 データエンコーディングが格納されます。
EI_VERSION 6 ファイルバージョンが格納されます。
EI_PAD 7 パディングの開始インデックス値が格納されます。
EI_NIDENT 16 配列e_ident[]のサイズです。


上記表のインデックスで配列e_ident[ EI_NIDENT ]にアクセスします。

EI_MAG0 - EI_MAG3

オブジェクトファイルの先頭の4バイトはELFフォーマットであることを特定するための、

マジックナンバーが格納されます。

EI_MAG0 - EI_MAG3
名前 マジックナンバー 説明
ELFMAG0 0x7F e_ident[ EI_MAG0 ]
ELFMAG1 'E' e_ident[ EI_MAG1 ]
ELFMAG2 'L' e_ident[ EI_MAG2 ]
ELFMAG3 'F' e_ident[ EI_MAG3 ]


EI_CLASS

EI_MAG0 - EI_MAG3の次のバイトがe_ident[ EI_CLASS ]です。

ファイルのクラスまたはキャパシティを特定できます。

EI_CLASS
名前 クラス値 説明
ELFCLASSNONE 0 無効なクラスです。
ELFCLASS32 1 32ビットオブジェクトです。
ELFCLASS64 2 64ビットオブジェクトです。


ELFフォーマットは、64ビットマシンで使用するサイズを最小ビットマシンのサイズに

無理やり適用させることなく、各種のビットサイズのマシン間で移植できるように

設計されています。クラスELFCLASS32のマシンではファイルのサイズと仮想アドレス

空間が4GBまでとなっています。現在クラスELFCLASS32が基本クラスとなります。


現在のところ、クラスELFCLASS64は64ビットアーキテクチャーのマシンを対象として

いますが、まだ未完成のクラスでオブジェクトファイルが変更される可能性があります。

その他のクラスは必要に応じて仕様化していきます。

EI_DATA

e_ident[ EI_DATA ]はオブジェクトファイルに格納されているプロセッサー固有データの

データエンコーディングを指定します。次のエンコーディングが現在定義されています。

EI_DATA
名前 エンコーディング値 説明
ELFDATANONE 0 無効なデータエンコーディングです。
ELFDATA2LSB 1 データはLSBで格納されています。
ELFDATA2MSB 2 データはMSBで格納されています。
その他 その他の値 新しいデータエンコーディングが出てきた時に、必要に応じて仕様化していきます。


ファイルのデータエンコーディングはデータの格納方法について指定します。

(リトルエンディアンかビッグエンディアン)。クラスELFCLASS32のデータは、1バイトデータ、

2バイトデータ、4バイトデータがあります。32ビットのデータエンコーディングは次のように

なります。図の左上の小さい番号がデータの格納順となります。



エンコーディングELFDATA2LSBではLSB(Least Significant Byte:最下位バイト)

が最下位アドレスに格納されます。

LSBのデータエンコーディング


エンコーディングELFDATA2MSBではLSB(Most Significant Byte:最上位バイト)

が最下位アドレスに格納されます。

LMBのデータエンコーディング

EI_VERSION

e_ident[ EI_VERSION ]はELFヘッダーのバージョン番号が格納されます。

現在、この値は EV_CURRENT となります。(この定義はe_versionで出て来ました)

EI_PAD

e_ident配列で使用していない要素の開始インデックスが格納されています。

使用していない要素は予約されていて値は0となります。オブジェクトファイルを

扱うプログラムはEI_PAD以降の値は無視するようにします。ELFフォーマット仕様が

変更されるとEI_PADの値も変更される可能性があります。

セクションヘッダーテーブル

オブジェクトファイルにセクションヘッダーは1つだけあります。セクションヘッダーに

オブジェクトファイルのすべてのセクションの位置が記録されています。セクションヘッダー

テーブルは Elf32_Shdr 構造体の配列で、その配列の添字をセクションヘッダーテーブル

インデックスと言います。セクションヘッダーテーブルのオブジェクトファイルの先頭からの

位置は、 ELFヘッダーe_shoff メンバーにオフセット値として格納されています。

そして、e_shnum にはセクションヘッダーテーブルのエントリー数が格納されていて、

e_shentsize は各エントリーのサイズが格納されています。


セクションヘッダーテーブルインデックスには予約されているインデックス値があります。

予約されているインデックスが指すセクションは、オブジェクトファイルに無いようにします。

セクションヘッダーテーブルの配列

予約されているインデックス値

予約されているインデックス値は次の値となります。

予約されているインデックス値
名前 インデックス値 説明
SHN_UNDEF 0 この値は、未定義、無くなってしまった、関係無い、またはその他の理由により 意味がなくなってしまったセクションの参照に使用されます。例えば、 SHN_UNDEF値のセクションのシンボル定義は未定義のシンボルとなります。

補足
インデックス値0は予約されていますが、セクションヘッダーテーブルには インデックス0のエントリーがあります。例えば、 ELFヘッダーe_shnumの値が6の場合、 インデックス値の範囲は0-5となります。 インデックス0のセクションについて は後述します。

SHN_LORESERVE 0xFF00 この値は、予約インデックス値の一番小さいインデックス値となります。
SHN_LOPROC 0xFF00 この値からSHN_HIPROCまでは、プロセッサー固有のセクションとして 予約されています。
SHN_HIPROC 0xFF1F SHN_LOPROCからこの値までは、プロセッサー固有のセクションとして 予約されています。
SHN_ABS 0xFFF1 このインデックス値のセクションは、参照アドレスの絶対値が定義されています。 例えば、SHN_ABSのセクションに定義されたシンボルはアドレスの絶対値を持ち、 再配置による影響を受けることはありません。
SHN_COMMON 0xFFF2 このインデックス値を持つセクションは、参照アドレスがこのセクションからの 相対アドレスが定義されています。例えば、FORTRANのCOMMON宣言や、 C言語のexternal変数があります。
SHN_HIRESERVE 0xFFFF この値は、予約インデックス値の一番大きいインデックス値となります。 OSはSHN_LORESERVEからSHN_HHIRESERVEまでおを予約インデックスとして扱います。 セクションヘッダーテーブルは予約インデックス値のエントリーが無いようにします。


セクションヘッダー

セクションには、ELFヘッダープログラムヘッダーセクションヘッダーテーブル 以外の

オブジェクトファイルの情報が格納されています。更に言えば、次の条件を満たしています。

セクションヘッダーの構造体は次のようになります。


typedef struct
{
   Elf32_Word sh_name;
   Elf32_Word sh_type;
   Elf32_Word sh_flags;
   Elf32_Addr sh_addr;
   Elf32_Off  sh_offset;
   Elf32_Word sh_size;
   Elf32_Word sh_link;
   Elf32_Word sh_info;
   Elf32_Word sh_addralign;
   Elf32_Word sh_entsize;
}Elf32_Shdr;



セクションヘッダー
メンバー 説明
sh_name セクション名を指定します。セクション名は セクション(ヘッダー)名文字列テーブル に格納されていますので、テーブルに格納されているインデックス値が格納されています。
sh_type セクションに格納されている情報の セクションタイプが格納されています。
sh_flags セクションの属性を指定します。
sh_addr オブジェクトファイルがプロセスとして実行される場合に、 OSがこのセクションをメモリーに置くときのセクションの先頭アドレスとなります。 それ以外の場合、0が格納されます。
sh_offset オブジェクトファイルの先頭からのこのセクションのオフセット値が格納されます。 sh_typeがSHT_NOBITSのセクションの場合、 オブジェクトファイルにこのセクションはありませんが、オブジェクトファイル中の 仮想オフセット値が格納されます。
sh_size このセクションのサイズ(単位はバイト)が格納されます。 sh_typeがSHT_NOBITS で無い限りsh_sizeのセクションがオブジェクトファイルに存在しています。 SHT_NOBITSのセクションの場合は、 値が0ではないことがありますが、オブジェクトファイルには存在していません。
sh_info エキストラ情報が格納されます。 詳細はsh_infoを参照してください。
sh_addralign 特定のセクションはメモリーアライメントの制約があります。 例えば、ダブルワード値が格納されれいるセクションでは、 OSはそのセクション全体をダブルワードでアライメントする必要があります。 この場合、sh_addrの値はsh_addralignの値で割って商が0か、 正の2の乗数になっている必要があります。sh_addralignが 0または1の場合、このセクションにはアライメント制約が無いことを 意味しています。
sh_entsize シンボルテーブルのようなテーブルのエントリーは固定となります。 このようなセクションの場合、 sh_entsizeの固定サイズ(単位はバイト)となります。


セクションタイプ sh_type

セクションタイプsh_typeには次の値が指定されます。

セクションヘッダーのセクションタイプ sh_type
タイプ名 説明
SHT_NULL 0 この値がセクションタイプとして格納されているセクションヘッダーは使用しません。 (セクションヘッダーに対応するセクションがありません)。 この場合、セクションヘッダーのその他のメンバーは未定義値となります。
SHT_PROGBITS 1 プログラムによって定義された情報が格納されているセクションとなります。 格納されている情報はプログラムがフォーマットを決めて格納しています。
SHT_SYMTAB 2 このセクションにはシンボルテーブルがあります。
SHT_STRTAB 3 このセクションには文字列テーブルがあります。
SHT_RELA 4 このセクションには明確に定義された再配置エントリーが格納されています。 (再配置エントリーは32ビットのオブジェクトファイルの場合Elf32_Rela構造体となります。) 詳細は、 再配置エントリー をご参照ください。
SHT_HASH 5 このセクションにはシンボルハッシュテーブルがあります。
SHT_DYNAMIC 6 このセクションには動的リンク時に必要な情報があります。
SHT_NOTE 7 このセクションには、なんらかの方法でオブジェクトファイルに記録された情報があります。
SHT_NOBITS 8 オブジェクトファイルのなかに、このセクションのスペースが無いということ以外は、 SHT_PROGBITS とよく似ています。 このセクションにはデータが記録されていませんが、 sh_offset には仮想ファイルオフセット値が格納されています。
SHT_REL 9 このセクションには曖昧に定義された再配置エントリーが格納されています。 (再配置エントリーはElf32_Rela構造体ではありません。) 詳細は、 再配置エントリー をご参照ください。
SHT_SHLIB 10 このセクションタイプは予約されていますが、仕様化されていない用途に 使用されます。
SHT_DYNSYM 11 このセクションには動的リンク時に必要なシンボルテーブルがあります
SHT_LOPROC 0x70000000 この値からSHT_HIPROCまでの範囲は プロセッサー固有情報のために予約されています。
SHT_HIPROC 0x7FFFFFFF SHT_LOPROCからこの値までの範囲は プロセッサー固有情報のために予約されています。
SHT_LOUSER 0x80000000 この値からSHT_HIUSERまでは、 アプリケーションプログラムで使用できます。
SHT_HIUSER 0x8FFFFFFF SHT_LOUSERからこの値までは、 アプリケーションプログラムで使用できます。 (アプリケーションプログラムは、 将来システムで定義されるセクションとは重複しないようにしておきます)。


その他のセクションタイプについては予約されています。

インデックス0のセクションについて

インデックス0のセクションヘッダーにはSHN_UNDEFが 指定されていて、

未定義のセクションとなりますが、実際にはオブジェクトファイル中に存在しています。

セクションヘッダーヘッダーテーブルのインデックス0のエントリーは次のようなエントリー

となります。

インデックス0のセクションヘッダーのエントリー
メンバー名 説明
sh_name 0 名前はありません。
sh_type SHT_NULL 使用しないセクションです。
sh_flags 0 フラグはありません。
sh_addr 0 アドレスはありません。
sh_offset 0 ファイルのオフセットはありません。
sh_size 0 サイズはありません。
sh_LINK SHN_UNDEF リンク情報はありません。
sh_info 0 補助情報はありません。
sh_addralign 0 アライメントはありません。
sh_entsize 0 エントリーはありません。


sh_flags

セクションヘッダーのsh_flagsnにはセクションの属性フラグビットが格納されます。

フラグには次のような値が格納されます。該当フラグに1がセットされていれば、その

属性が有効となります。0であれば無効または適用されません。下記表以外の

未定義フラグビットは全て0がセットされます。

セクション属性フラグ sh_flags
フラグ名 説明
SHF_WRITE 0x1 このセクションのデータはプロセス実行中に書き込みが可能です。
SHF_ALLOC 0x2 このセクションはプロセス実行中にメモリーにロードされます。 オブジェクトファイル中の管理用セクションはメモリーに ロードしませんので、このフラグを0にセットします。
SHF_EXECINSTR 0x4 このセクションは実行コードが格納されています。
SHF_MASKPROC 0xF0000000 このマスクビットが1になっているビットはプロセッサー固有情報に 使用するため予約されています。


sh_link sh_info

sh_link sh_info メンバーにはセクションタイプ sh_typeによって、意味が変わる特殊情報が

格納されます。

sh_linkとsh_infoの意味解釈
sh_typeの値 sh_linkの説明 sh_infoの説明
SHT_DYNAMIC このセクションのエントリーで使用されるセクションヘッダーインデックス値となります。 0
SHT_HASH ハッシュテーブルとして使用されるシンボルテーブルのセクションヘッダーインデックス値となります。 0
SHT_REL シンボルテーブルで使用するセクションヘッダーインデックス値となります。 再配置で使用するセクションのヘッダーインデックス値となります。
SHT_RELA
SHT_SYMTAB OS固有の情報が格納されます。 OS固有の情報が格納されます。
SHT_DYNSYM
その他 SHN_UNDEF 0


特殊なセクション

ELFフォーマットの通常のセクションはあらかじめ定義されていてい、プログラムや管理情報が

格納されています。通常のセクションはOSが使用します。また、様々なタイプと属性があり、

他のプラットフォームのOSにも使用されます。


実行ファイルは、リンカーがオブジェクトファイルとライブラリーから生成します。リンカーは複数の

オブジェクトファイルにまたがって、参照アドレス(サブルーチンとデータ参照)をオブジェクト

ファイル内の絶対値アドレスに置き換えたり、命令を置き換えたりします。リンキングと

プロセスのロードには、オブジェクトファイルに定義されている情報が必要です。そして、

この情報は.dynamicのような特殊なセクションに格納されています。


OSは次のような2つのカテゴリーに分類されるリンクモデルが実装されています。


特殊なセクションは下記となります。

特殊なセクション
セクション名 タイプ 属性
.bss SHT_NOBITS SHF_ALLOC + SHF_WRITE
説明
このセクションはプログラムが使用するメモリーのうちの未初期化データが格納されます。 ANSI規格では、システムはプログラムの実行前に未初期化データを 0クリアーしておく必要があります。このセクションはメモリーに存在しますが、 オブジェクトファイルの中にはありません。セクションタイプとして SHT_NOBITSを指定します。
.comment SHT_PROGBITS なし
説明
このセクションはバージョン管理情報が格納されます。
.data SHT_PROGBITS SHF_ALLOC + SHF_WRITE
説明
このセクションはプログラムが使用するメモリーのうちの初期値付きデータ が格納されます。
.datal SHT_PROGBITS SHF_ALLOC + SHF_WRITE
説明
このセクションはプログラムが使用するメモリーのうちの初期値付きデータ が格納されます。
.debug SHT_PROGBITS なし
説明
このセクションはデバッグ時に使用するシンボル情報が格納されます。 内容特に規定されていません。.debugから始まるセクション名は 将来使用することがあるため予約されています。
.dynamic SHT_DYNAMIC 説明に記載しています
説明
このセクションは動的リンク情報や SHF_ALLOCSHF_WRITEのような 属性が格納されます。 SHF_WRITEビットが セットされるかどうかは、OSやプロセッサーの種類によって 決まります。
.hash SHT_HASH SHF_ALLOC
説明
このセクションはシンボルハッシュテーブルが格納されます。
.line SHT_PROGBITS なし
説明
このセクションはデバッグ時に使用する プログラムソースとマシン語を対応させた シンボルの行番号が格納されます。 内容は特に規定されていません。
.note SHT_NOTE なし
説明
このセクションはELFフォーマットについての情報が格納されます。 詳細は ノートセクション を参照してください。
.rodata SHT_PROGBITS SHF_ALLOC
説明
このセクションは読み込み専用のデータが格納されます。 詳細はプログラムヘッダー を参照してください。
.rodatal SHT_PROGBITS SHF_ALLOC
説明
このセクションは読み込み専用のデータが格納されます。 詳細はプログラムヘッダー を参照してください。
.shstrtab SHT_STRTAB なし
説明
このセクションはセクション名が格納されています。
.strtab SHT_STRTAB 説明に記載しています。
説明
このセクションは文字列が格納されています。 だいたいの共通文字列はシンボルテーブルエントリーに関連する名前となります。 オブジェクトファイルにシンボル文字列テーブルが格納されているローダブルセグメント がある場合、そのセクションの属性はSHF_ALLOC ビットが1となり、その他のビットは0となります。
.symtab SHT_SYMTAB 説明に記載しています。
説明
このセクションはシンボルテーブルが格納されています。 オブジェクトファイルにシンボルテーブルが格納されているローダブルセグメント がある場合、そのセクションの属性はSHF_ALLOC ビットが1となり、その他のビットは0となります。
.text SHT_PROGBITS SHF_ALLOC + SHF_EXECINSTR
説明
このセクションは"テキスト"またはプログラムの命令が格納されています。


ドット(.)が頭に付くセクション名はシステム用に予約されていますが、アプリケーションでも

使用できます。アプリケーションで使用する場合は、システムのセクション名と衝突して

しまわないように、ドットを付けないで使用します。オブジェクトファイルフォーマットは

上記表のセクション名以外のセクション名を複数のセクションに付けることができます。

オブジェクトファイルは同じ名前の1つ以上のセクションを持っている場合があります。

文字列テーブル

文字列テーブルセクションはNull(\0)で終わる文字列が格納されています。

オブジェクトファイルのシンボルやセクション名は文字列テーブルに格納されています。

文字列の参照には文字列テーブルセクションのインデックス値を指定して参照します。

最初のバイト(インデックス0)は、Null(\0)が格納されています。同様に、文字列テーブル

の最終バイトもNull(\0)が格納されています。オブジェクトファイルには空の文字列

テーブルセクションがある場合がありますが、この場合セクションヘッダーの sh_size

0となります。空の文字列テーブルでは、0以外のインデックス値は無効となります。


セクションヘッダーsh_name は、ELFヘッダーe_shstrndxで指定される

セクションヘッダー文字列テーブルセクションのインデックス値が格納されています。

次の図は25バイトの文字列テーブル例となります。

文字列テーブルの例

文字列テーブル例のインデックス
インデックス値 参照文字列
0 文字列無し
1 .name
7 Variable
11 able
16 able
24 Null


上記表のようにインデックス値は文字列テーブル内の任意の場所を参照できます。

文字列自体は1つ以上の同じ文字列が格納されている場合があります。

また、サブ文字列の参照(例のインデックス値が11の場合)もできますし、

1文字のみを何回も参照できます。未定義の文字列も格納できます。

シンボルテーブル

オブジェクトファイルのシンボルテーブルには、プログラムのシンボル定義や参照を

メモリー上に配置または再配置するときに必要な情報が格納されています。

シンボルテーブルインデックスはシンボルテーブルを参照するときに使用します。

インデックス値が0の場合はテーブルの最初のバイトで、未定義シンボルの

インデックスとしてい使用します。最初のバイトの値は次のように定義されています。

シンボルテーブルのインデックス0に格納される値
名前
STN_UNDEF 0


シンボルテーブルのエントリーは次のようになります。


typedef struct
{
    Elf32_Word    st_name;
    Elf32_Addr    st_value;
    Elf32_Word    st_size;
    unsigned char st_info;
    unsigned char st_other;
    Elf32_Half    st_shndx
} Elf32_Sym;



シンボルテーブルエントリー
メンバー 説明
st_name オブジェクトファイルのシンボル文字列テーブルのインデックス値が格納されます。 シンボル文字列テーブルにはシンボル名が格納されています。
st_value そのシンボルに定義されている値が格納されます。コンテキストによって、 絶対値、アドレスなどの値となります。詳細はst_infoを参照してください。
st_size そのシンボルに定義されている値のサイズとなります。例えば、 データオブジェクトのバイト数はオブジェクトのサイズそのものとなります。 0の場合シンボルにサイズが無いか、未定義のサイズとなります。
st_info シンボルのタイプと属性情報が格納されています。 格納される値には次のような情報があります。
これらの値をst_infoから取得するには次のように操作します。

/* st_infoから情報を抽出する定義 */
#define ELF32_ST_BIND( i )      ( ( i ) >> 4 )
#define ELF32_ST_TYPE( i )      ( ( i ) & 0x0F)
/* st_infoに情報を設定する定義 b=ST_BIND, t=ST_TYPE */
#define ELF32_ST_INFO( b, t )   ( ( ( b ) << 4 ) ) + ( ( t ) & 0x0F ) )

st_other 現在のところ定義はありません。0が格納されます。
st_shndx シンボルテーブルエントリーは関連するいくつかのセクションに定義されています。 このメンバーにはその関連するセクションヘッダーテーブルインデックス値が格納されます。 セクションのインデックス値については セクションヘッダーテーブルを参照してください。


st_infoのELF32_ST_BIND

ELF32_ST_BIND( st_info )で取得できるELF32_ST_BINDの値で、リンク時に

このシンボルが外部参照できるかどうかが決まります。

ELF32_ST_BIND
定義名 説明
STB_LOCAL 0 このシンボルはローカルシンボルとなります。 オブジェクトファイルのローカルシンボルは 外部から参照することができません。 ローカルシンボルの名前は、複数のオブジェクトファイルで同じ名前の ローカルシンボルを定義することができます。
STB_GLOBAL 1 このシンボルはグローバルシンボルとなります。 リンクするすべてのオブジェクトファイルから参照することができます。 1つのオブジェクトファイルでグローバルシンボルを定義しておくと、 リンク前は他のオブジェクトファイルで同名のグローバルシンボルは 未定義となっていますが、リンク時にはグローバルシンボルとして 再定義されます。
STB_WEAK 2 ウィークシンボルはグローバルシンボルとほとんど同じです。 但し、グローバルシンボルより優先度が低くなります。
STB_LOPROC 13 この値からSTB_HIPROCまでの 範囲はプロセッサー固有情報として予約されています。
STB_HIPROC 15 STB_LOPROCからこの値までの 範囲はプロセッサー固有情報として予約されています。


各シンボルテーブルでは、ウィークシンボルとグローバルシンボルよりもローカルシンボルの

方が優先度が高くなります。

st_infoのELF32_ST_TYPE

ELF32_ST_TYPE( st_info )で取得できるELF32_ST_TYPEの値で、シンボルの

タイプが決まります。

ELF32_ST_TYPE
定義名 説明
STT_NOTYPE 0 シンボルのタイプは未定義です。
STT_OBJECT 1 データオブジェクトのシンボルとなります。データオブジェクトには 変数、配列などがあります。
STT_FUNC 2 関数または実行コードのシンボルとなります。
STT_SECTION 3 セクションのシンボルとなります。このシンボルタイプの シンボルテーブルのエントリーは、主に再配置に使用されます。 通常、ELF32_ST_BINDにはST_LOCAL がセットされています。
STT_FILE 4 シンボルのタイプはファイルとなります。 ファイルのシンボルのELF32_ST_BINDにはST_LOCAL がセットされていて、そのセクションのインデックス値は SHN_ABSとなります。 このセクションにシンボルがあれば、そのシンボルは 他のSTB_LOCALシンボル より優先度が高くなります。
STT_LOPROC 13 STT_LOPROCからSTT_HIPROCまでの範囲はプロセッサー固有情報として 予約されています。シンボルの値がセクションの特定位置を参照している場合、 そのセクションインデックス値st_shndxは セクションヘッダーテーブルのエントリーを指しています。 再配置によりセクションの位置が変われば、シンボルの値も変わります。 そして、プログラム中でシンボルの値が参照している場所も変わります。 いくつかの特別なセクションインデックス値の場合は、別の処理を行います。
STT_HIPROC 15


ELFオブジェクトファイルのシンボルで、リンカーやローダーに特定情報を渡します。

詳細はELFフォーマットその3 OS依存部分についてをご確認ください。

セクションインデックス値によって、リンカーやローダーに渡すシンボルは次のように

意味が変わります。

インデックス値と、リンカーやローダーで使用されるシンボルの意味
インデックス値 説明
SHN_ABS シンボルは絶対値であり、再配置を行っても値は変わりません。
SHN_COMMON シンボルのラベルはまだ割り当てられていない共通ブロックとなります。 sh_addralignメンバーと 同様に、シンボルの値はアライメントする必要があります。 リンクエディターは(アライメントするため) st_valueの倍数の アドレスに、メモリーをシンボルに割り当てます。 割り当てるメモリーのサイズはst_size分 となります。
SHN_UNDEF このセクションテーブルインデックス値の場合、シンボルは未定義となります。 リンクエディターがこのセクションを持つオブジェクトファイルをリンクするときに、 他のセクションやオブジェクトファイルに定義(があれば)を参照するようにリンクします。


インデックス0のシンボルテーブル

インデックス0(STN_UNDEF)のシンボルテーブルエントリーは

予約されており、次のようなエントリーとなります。

インデックス0のシンボルテーブルエントリー
メンバー 説明
st_name 0 名前なし
st_value 0 値0
st_size 0 サイズなし
st_info 0 未定義のタイプ、STB_LOCAL
st_other 0 -
st_shndx SHN_UNDEF セクションなし


シンボルの値

シンボルの値st_value はオブジェクトファイルの種類によって意味が違ってきます。

再配置

”再配置”はシンボルの定義とシンボルの参照をつなぎ合わせる処理のことを言います。

例えば、関数をコールする時、コール命令は関数の最初の命令が置かれていアドレスに

制御を移す必要があります。言い換えると、再配置可能なファイルは、セクションの内容を

変更する方法の情報を持っている必要があります。このため、実行可能なファイルや

共有オブジェクトファイルはプロセスのプログラムイメージ用に適切なデータを持っておく

ことが可能となります。


”再配置”処理に必要なデータとして、ELFフォーマットでは再配置エントリーを定義

しています。再配置エントリーは次のようなフォーマットとなります。


typedef struct
{
    Elf32_Addr    r_offset;
    Elf32_Word    r_info;
} Elf32_Rel;

typedef struct
{
    Elf32_Addr    r_offset;
    Elf32_Word    r_info;
    Elf32_Sword   r_addend;
} Elf32_Rela;



Elf32_RelとElf32_Rela
メンバー 説明
r_offset 再配置処理のときに配置される場所が格納されます。 再配置可能なファイルの場合、値はセクションの先頭から 再配置によって影響を受けるストレージユニットまでの オフセット値(単位はバイト)となります。 実行可能なファイルや共有オブジェクトの場合、 値は再配置によって影響を受けるストレージユニットの 仮想アドレスとなります。
r_info 再配置される各シンボルテーブルインデックスと再配置処理のタイプについての 情報が格納されます。例えば、コール命令の再配置エントリーは コールされる関数シンボルテーブルインデックス値が格納されます。 インデックス値がSTN_UNDEFの場合、 再配置処理で未定義のシンボルインデックス(インデックス0)が使用 されます。再配置のタイプはプロセッサー固有情報となります。 (ELFフォーマットその2 CPU依存部分についてを参照してください。 ELFフォーマットその2では再配置エントリーの再配置タイプやシンボルテーブルインデックス値に ついて記述しております。例えば、r_infoメンバーの値として ELF32_R_TYPEELF32_R_SYMがあります。
r_infoから情報を取り出すときに下記定義を使用します。

/* r_infoから情報を抽出する定義 */
#define ELF32_R_SYM( i )       ( ( i ) >> 8 )
#define ELF32_R_TYPE( i )      ( ( unsigned char )( i ) )
/* r_infoに情報を設定する定義 s=R_SYM, t=R_TYPE */
#define ELF32_R_INFO( s, t )   ( ( s ) << 8 ) + ( unsigned char )( t ) )

r_addend 再配置可能なフィールドに格納するための値を、計算するのに使用する定数が格納されます。


エントリーElf32_Relaだけが再配置時の場所を明確に定義されています。エントリー

Elf32_Relは再配置時の場所を変更するために曖昧に定義されています。1つの

エントリーまたはもっと有効なその他の情報が必要となるかは、プロセッサーの

アーキテクチャーによって変わります。(特定のマシンに実装するときは、1つの専用

エントリーを使用するか、状況に応じてその他の情報を使用します)。


再配置セクションは他の2つのセクションを参照します。1つはシンボルテーブルで、

もう1つは再配置時に変更するセクションとなります。 セクションヘッダー

sh_info sh_link メンバーで参照するセクションを指定します。

異なるオブジェクトファイル用の再配置エントリーでは、 r_offset の意味が

次のように少し違います。

このように、ファイルによってr_offsetの意味が違ってきますが、

再配置のタイプは同じです。

2.プログラムのロードと動的リンク

プログラムヘッダー

プロセスのイメージにはテキスト、データ、スタックなどのセグメントが定義されています。

プログラムヘッダーにはプログラムを実行するための情報が格納されています。

プログラムヘッダーテーブルの情報を利用してオブジェクトファイルのセグメントを

メモリー上に配置します。OSは実行するときに実行ファイルをメモリーにロードします。

ロードした後、各オブジェクトファイルのシンボル参照アドレスを解決してプロセスの

イメージを作る必要があります。

プログラムヘッダーの構造

実行可能なファイルまたは共有オブジェクトファイルのプログラムヘッダーテーブルは

プログラムヘッダーの配列となります。プログラムヘッダーには実行するときに必要な

セグメントやその他の管理情報が格納されています。オブジェクトファイル中の

セグメントには1つ以上のセクション があります。プログラムヘッダーは

実行可能なファイルと共有オブジェクトファイルだけ使用します。プログラムヘッダー

のサイズはELFヘッダーe_phentsizee_phnumから求められます。

プログラムヘッダーのフォーマットは次のようになります。


typedef struct
{
    Elf32_Word    p_type;
    Elf32_Off     p_offset;
    Elf32_Addr    p_vaddr;
    Elf32_Addr    p_paddr;
    Elf32_Word    p_filesz;
    Elf32_Word    p_memsz;
    Elf32_Word    p_flags;
    Elf32_Word    p_align;
} Elf32_Phdr;



プログラムヘッダー Elf32_Phdr
メンバー 説明
p_type セグメントのタイプまたはプログラムヘッダーの解釈方法が格納されています。 詳細はセグメントタイプを参照してください。
p_offset ファイル先頭からセグメントまでのオフセット値が格納されます。
p_vaddr セグメントの最初のバイトがメモリー上に配置される仮想アドレスが格納されます。
p_paddr セグメントの物理アドレスが格納されます。 物理アドレスを使用するシステム用に予約されているメンバーです。 OSの詳細情報が必要となります。 詳細は ELFフォーマットその3 OS依存部分について を参照してください。
p_filesz セグメントのファイルイメージサイズが格納されます(単位はバイト)。 対応するセグメントが無い場合は0となります。
p_memsz メモリー上に配置されるセグメントのサイズが格納されます (単位はバイト)。対応するセグメントが無い場合0となります。
p_flags セグメントに関係するフラグとなります。 詳細は ELFフォーマットその3 OS依存部分について を参照してください。
p_align ロード可能なプロセスのセグメントの p_vaddrp_offsetは、 ページサイズでアライメント(mod計算)する必要があります。 そのため、メモリーアドレスとファイル内のオフセットをp_alignの値でアライメントします。 値が0または1の場合はアライメントしません。それ以外は、2の乗数の正数である 必要があります。 p_vaddrp_offset をp_alignでアライメントした値となります。


プログラムヘッダーはプロセスのセグメントについての情報を持っています。

それ以外のエントリーは、補助情報を持っているものやプロセスイメージの作成に

必要無い情報を持っているものもあります。

セグメントタイプ

セグメントタイプp_typeは次のような値をとります。

セグメントタイプ p_type
タイプ名 説明
PT_NULL 0 このセグメントタイプのプログラムヘッダーテーブルのエントリーは使用しません。 エントリーのその他のメンバーの値は未定義となります。 この値を持つプログラムヘッダーテーブルのエントリーを無視するようにします。
PT_LOAD 1 このセグメントタイプのプログラムヘッダーテーブルのエントリーは ロード可能なセグメントに ついての情報( p_fileszp_memsz)を持っています。 各メンバーに格納されている値(単位はバイト)は メモリー上に置かれたセグメントの先頭からのオフセット値となります。 セグメントのメモリーサイズp_memsz がファイルサイズp_filesz よりも大きい場合、”余った”バイトは0固定にし、セグメントの 初期化エリアの次に配置します。 ファイルサイズはメモリーサイズより大きくない場合があります。 ロード可能なセグメントのプログラムヘッダーテーブルのエントリーは p_vaddrの値をもとに 昇順に格納されています。
PT_DYNAMIC 2 このセグメントタイプのプログラムヘッダーテーブルのエントリーは 動的リンクに必要な情報が 格納されています。詳細は ELFフォーマットその3 OS依存部分について を参照してください。
PT_INTERP 3 このセグメントタイプのエントリーは インタープリターを実行するためのNullで終わるパス名の 場所とサイズについての情報が格納されています。詳細は ELFフォーマットその3 OS依存部分について を参照してください。
PT_NOTE 4 このセグメントタイプのエントリーは 補足情報の場所とサイズについての情報が格納されています。
PT_SHLIB 5 このセグメントタイプのエントリーは 予約されていますが、OSが利用することもあります。 詳細は ELFフォーマットその3 OS依存部分について を参照してください。
PT_PHDR 6 このセグメントタイプである場合、 プログラムヘッダーテーブル自体の場所とサイズについての (ファイル内とメモリーイメージの両方の)情報が格納されています。 このセグメントタイプはオブジェクトファイル内に1つしかありません。 更に言えば、プログラムヘッダーテーブルがプログラムの メモリーイメージの一部に埋め込まれる場合に存在します。 このセグメントタイプがある場合、他のロード可能なセグメントよりも 優先度が一番高くなります。 詳細は ELFフォーマットその3 OS依存部分について を参照してください。
PT_LOPROC 0x70000000 この値の範囲にあるセグメントタイプはプロセッサー固有情報のため予約されています。
PT_HIPROC 0x7FFFFFFF


補足
特に指定が無い限り、全てのプログラムヘッダーのセグメントタイプはオプションとなります

ので、ファイルのプログラムヘッダーは必要となるファイルにしか無い場合があります。


ノートセクションについて

プログラム開発会社は、プログラムがオブジェクトファイルの情報が一致しているか、互換性が

あるかなどをチェックするために、オブジェクトファイルに特別な情報を埋め込む必要があります。

SHT_NOTEのセクションと PT_NOTEの プログラムヘッダーのエントリーは特別な情報を

埋め込むときに使用します。セクションのノート情報とプログラムヘッダーのエントリーには

エントリー数が格納されています。各エントリーは4バイトワード(ターゲットプロセッサーの

ワードとなります)の配列となります。次のフォーマットはノート情報のフォーマット例となります。

例であり、仕様ではありません。

ノート情報のフォーマット

ノート情報
名前 説明
nameszとname nameszはnameのバイト数となります。nameはNullで終わる文字列で エントリーの所有者、作成者などが格納されます。 ソフトウェア開発会社は通常、”XYZコンピューター会社”などの会社名 をIDとして格納します。名前無しの場合はnameszは0となります。 パディングが必要な場合はdescを4バイト境界に格納するため descをアライメントします。パディング分のバイト数は nameszに含みません。
descszとdesc descszはdescのバイト数となります。descにはノート情報が 格納されます。ELFフォーマットでは、descについて内容について 制限は設けていません。descがない場合descszは0となります。 パディングが必要な場合は次のエントリーを4バイト境界に格納するため 次のエントリーをアライメントします。パディング分のバイト数は descszに含みません。
type descのタイプをが格納されます。作成者がノート情報を管理するために タイプをつけます。1つのタイプで複数の解釈があっても問題ありません。 プログラムはタイプと名前の両方でノート情報に何が格納されているのかを 判断します。タイプは現在のところ正数としておく必要があります。 ELFフォーマットではノート情報について特に定義はしません。


次の図はノート情報が格納されるセグメント例となります。

ノートセグメント例

補足
名前無し(namesz=0)と名前サイズが0(name[ 0 ]='\0')のノート情報は予約と

なり、タイプ無しとなります。その他の名前は全てNullで終わるようにします。


補足
ノート情報はオプションとなります。ノート情報によっていELFフォーマットに従った

プログラムやその動作に影響がないようにします。影響がある場合はELFフォーマットの

仕様を満たしていないオブジェクトファイルとなり、予期しない動作となります。


プログラムのロード

プログラムのロードとは、OSがプロセスイメージを作成する処理のことを言います。

プロセスイメージの作成方法とプロセスに割り当てるページ管理はOSとプロセッサーが

主に行います。詳細は ELFフォーマットその3 OS依存部分について を参照してください。

動的リンク

動的リンクの処理はプロセスの初期化時や実行時に、参照アドレスを解決します。

動的リンクを行うために、ELFセクションとヘッダーがフォーマット化されています。

動的リンクはOSが行いますので、その内容については

ELFフォーマットその3 OS依存部分について を参照してください。

inserted by FC2 system