NetBSD ドキュメンテーション: ベンダー特有の ELF 記号要素(Note Elements)
- 序
- ELF Note Element のフォーマット
- 知られている ELF 記号名
- ベンダー特有 ELF 記号
- ELF PT_NOTE セクションの作成
- NetBSD ELF PT_NOTE セクションの作成
序 (トップ)
さまざまなオペレーティングシステムベンダーが
異なるシステムコールインターフェースを要求する ELF バイナリー
を出荷しています。
オペレーティングシステムが ELF プログラムが実行できるかどうか、
どうやって実行するか(例えば どの OS エミュレーションを使うのか)を
正しく決定する手助けのために、
いくつかのオペレーティングシステムのベンダーは
ELF バイナリーの PT_NOTE
セクションにベンダー特有の記号要素 (note elements)
を付け始めました。
このページは、バイナリーの PT_NOTE
セクションで
オペレーティングシステムの識別のために使われているベンダー特有の記号要素
についての知識の宝庫にしようと思います。
もし、あなたのオペレーティングシステムが ベンダー特有記号要素 をバイナリーのマークに使っていて、ここの一覧に載っていないなら、 Chris Demetriou まで、その記号の情報をメールしてください。(訳注:たぶん英文で)
ELF Note Element のフォーマット (トップ)
全ての ELF Note Element は同じ基本構造を持っていて:
Name Size
- 4 bytes (整数)
Desc Size
- 4 bytes (整数)
Type
- 4 bytes (たいてい整数として解釈されます)
Name
- 可変長, 4 byte 境界で詰め物をされた
Desc
- 可変長, 4 byte 境界で詰め物をされた
"Name" , "Desc" 各フィールドの(詰め物を除いた)サイズの決定をする "Name Size" , "Desc Size" 各フィールドは 整数型 (バイトオーダーはバイナリーの ELF ヘッダーに指定されています)です。
Name field は ベンダー が記号のフォーマットに基づいて指定します。 一般的に、 ベンダーはプロジェクトや会社名に関連した名前を使います。 例えば、 GNU project はその名前に "GNU" を使います。 ELF Note Name は、note の意味を解釈しようという時混乱するといけないので、 どの 2つの ベンダーも同じ物を使わないようにするべきです。
"Type" フィールドはベンダー特有ですが、記号の特定において、 たいてい整数型として扱われます。
"Desc" フィールドはベンダー特有で、 たいてい記号の型に依存するデータが含まれています。
知られている ELF 記号名 (トップ)
下記は ELF 記号名として使われている事が知られている文字列と それを使っている組織です。 記号名の語長が 4 の倍数で無いものは 詰め物で埋められますが、 与えられた長さだけを調べるようにするべきです。
Note Name 文字列 | 文字列のバイト毎のエンコーディング | 語長 | 組織 |
---|---|---|---|
"NetBSD\0" |
0x4e 0x65 0x74 0x42 0x53 0x44 0x00 |
7 | The NetBSD Project |
"GNU\0" |
0x47 0x4e 0x55 0x00 |
4 | The GNU Project |
ベンダー特有 ELF 記号 (トップ)
この節にはベンダーが PT_NOTE
セクションで使っていて、
ベンダー別に異なっている ELF 記号のフォーマットに関する情報が含まれています。
NetBSD には2つの ベンダー特有の ELF 記号があって、 OS バージョン記号とエミュレーション Name 記号です。 前者は、どの OS バージョンの native バイナリーかを示すのに使われ、 native バイナリーを識別するのにも使えます。 後者は、実行時にどのエミュレーションコードセットを使えば良いかを示す名前と共に、 バイナリーを (native と 非-native の)マークするのに使われます。
NetBSD OS バージョン 記号 のフォーマットは:
Name Size
- 7
Desc Size
- 4
Type
- 4-byte 整数
0x01
という値が入っている Name
-
"NetBSD\0"
(8 byte に合わせて詰め物がされています) Desc
- 4-byte 整数 NetBSD OS バージョン定数が入っている
NetBSD エミュレーション Name 記号 のフォーマットは:
Name Size
- 7
Desc Size
- variable
Type
- 4-byte 整数
0x02
という値が入っている Name
-
"NetBSD\0"
(8 byte に合わせて詰め物がされています) Desc
- バイナリーを実行するのに使うエミュレーションを表す、
ナル (
NUL
) 文字で終わる文字列 (次の4バイト境界まで詰め物された)
glibc 2.1 以降では、 GNU project は GNU オペレーティングシステム とどのバージョンのシステムで構築されたバイナリーか を示すのに、単一の ELF Note を使い、 そのフォーマットは:
Name Size
- 4
Desc Size
- 16
Type
- 4-byte 整数
0x01
という値が入っている Name
"GNU\0"
Desc
-
4 個の 4-byte 整数。順序は以下のとおり:
major, minor, teeny は、この ABI をサポートする OS バージョンで最も古いもののバージョン。
- OS (0 = Linux, 1 = Hurd, 2 = Solaris)
- Major
- Minor
- Teeny
GNU C ライブラリーでの ELF notes の使い方について、さらなるドキュメンテーションは、 abi-tags および csu/abi-note.S のソースを調べてください。
ELF PT_NOTE
セクションの作成 (トップ)
バイナリーを作るために、 GNU binutils 2.8 かそれ以降を使っていれば、
最終版のオブジェクトファイルに PT_NOTE
セクションを生成することができます。
PT_NOTE
セクションを作るには、
オブジェクトファイルの一つ
(デフォルトで PT_NOTE
エントリーを生成するシステムでは、
これは一般的にランタイムのスタートアップコードです) に
名前が ".note" で始まり "allocate" 属性セットを持つセクションをつくります。
このセクションに、 ELF Note エントリーを適切な形で書きます。
最終的なリンクが終わったとき、 ".note" で始まる名前をもち、かつ
"allocate" とマークされた全セクションは、
最終オブジェクトファイルにおいて、
PT_NOTE
セクション内に配置されるでしょう。
GNU アセンブラーの例では、
最終リンク時に PT_NOTE
セクションを作る入力物は:
.section ".note.ident", "a" .p2align 2 .long 1f - 0f # name サイズ (詰め物含まず) .long 3f - 2f # desc サイズ (詰め物含まず) .long 0x01234567 # type 0: .asciz "NaMe" # name 1: .p2align 2 2: .long 0x76543210 # desc .long 0x89abcdef 3: .p2align 2
この例では ".note.ident" と呼ばれ、 "allocate" とマークされた、
(最終リンク時に PT_NOTE
セクションと変わる)
1つの note を含むセクションを作るでしょう。
この note は type
が
0x012345678
(訳注9桁???)、 name
が
"NaMe\0"
で、
desc
値は、2つの 4-byte 整数、0x76543210
と
0x89abcdef
です。
NetBSD ELF PT_NOTE
セクションの作成 (トップ)
NetBSD カーネルは、 ELF バイナリー中に PT_NOTE
セクションが見つからない場合に
ENOEXEC を返します。通常、ネイティブ NetBSD アプリケーション用の
PT_NOTE セクションは crtbegin.c
に含まれています。以下に示す例は、 NetBSD/sparc でこのセクションを作成するものです。
(他のポート、たとえば arm では @ はコメントの開始を意味するために %note を使うなど、
アセンブラーの文法が若干異なることがありますが、
エンディアンの違いを除けば、個々の断片はすべて同じです)
.section ".note.netbsd.ident", "", @note .long 2f-1f .long 4f-3f .long 1 1: .asciz "NetBSD" 2: .p2align 2 3: .long 499003600 4: .p2align 2