Skip to main content.
Google custom search

NetBSD ドキュメンテーション: ベンダー特有の ELF 記号要素(Note Elements)


序 (トップ)

さまざまなオペレーティングシステムベンダーが 異なるシステムコールインターフェースを要求する 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 記号のフォーマットに関する情報が含まれています。

The NetBSD Project

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バイト境界まで詰め物された)

The GNU Project

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 整数。順序は以下のとおり:
  1. OS (0 = Linux, 1 = Hurd, 2 = Solaris)
  2. Major
  3. Minor
  4. Teeny
major, minor, teeny は、この ABI をサポートする OS バージョンで最も古いもののバージョン。

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 は type0x012345678 (訳注9桁???)、 name"NaMe\0" で、 desc 値は、2つの 4-byte 整数、0x765432100x89abcdef です。

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