名前
getauxval -
補助ベクトルから値を取得する
書式
#include <sys/auxv.h>
unsigned long getauxval(unsigned long type);
説明
getauxval()
関数は補助ベクトル
(auxiliary vector)
から値を取得する。
補助ベクトルは、
プログラムが実行される際に、
カーネルの ELF
バイナリーローダーがユーザー空間にある種の情報を渡すのに使われる仕組みである。
補助ベクトルの各エントリーは、
このエントリーを示すタイプとそのタイプの値のペアで構成される。
引き数 type
が指定されると、
getauxval()
は対応する値を返す。
それぞれの type
に対して返される値の詳細を以下に示す。
すべてのアーキテクチャーですべて
type
値が存在するわけではない。
- AT_BASE
- プログラムインタープリター
(通常は動的ローダー)
のベースアドレス。
- AT_BASE_PLATFORM
- 実プラットフォームを示す文字列。
AT_PLATFORM
と異なる値の場合がある。
(PowerPC のみ)
- AT_CLKTCK
- times(2)
のカウントが行われる周波数。
この値は sysconf(_SC_CLK_TCK)
でも取得できる。
- AT_DCACHEBSIZE
- データキャッシュのブロックサイズ。
- AT_EGID
- このスレッドの実効グループ
ID。
- AT_ENTRY
- 実行ファイルのエントリーアドレス。
- AT_EUID
- このスレッドの実効ユーザー
ID。
- AT_EXECFD
- プログラムのファイルディスクリプター。
- AT_EXECFN
- 実行プログラムに使用されたパス名。
- AT_FLAGS
- フラグ (未使用)。
- AT_FPUCW
- 使用された FPU
制御ワード (SuperH
アーキテクチャーのみ)。
カーネルが実行した
FPU
初期化に関する情報を提供するためのものである。
- AT_GID
- このスレッドの実グループ
ID。
- AT_HWCAP
- プロセッサーの詳細な機能
(capabilities)
を示す複数バイトからなるビットマスクへのポインターである。
このビットマスクの内容はハードウェア依存である
(例えば、 Intel x86
アーキテクチャーに関する詳細はカーネルのソースファイル
arch/x86/include/asm/cpufeature.h を参照)。
同じ情報を人が読みやすい形になっているのが
/proc/cpuinfo である。
- AT_ICACHEBSIZE
- 命令キャッシュのブロックサイズ。
- AT_PAGESZ
- システムページサイズ
(sysconf(_SC_PAGESIZE)
が返す値と同じ)。
- AT_PHDR
- 実行プログラムのプログラムヘッダーのアドレス。
- AT_PHENT
- プログラムヘッダーエントリーのサイズ。
- AT_PHNUM
- プログラムヘッダー数。
- AT_PLATFORM
- このプログラムが実行されているハードウェアプラットフォームを特定する文字列へのポインター。
動的リンカーは rpath
値の解釈を行う際にこの値を使用する。
- AT_RANDOM
- ランダム値が入った
16
バイトがあるアドレス。
- AT_SECURE
- この実行ファイルを安全に扱う必要がある場合に
0 以外の値になる。
一番よくある場合としては、
0
以外の値になるのは、
そのプロセスが set-user-ID
か set-group-ID
されたプログラムを実行している場合である。
他の場合としては、
Linux Security Module
が有効になっている場合にも
0 以外の値となる。
この値が 0
以外の場合、
動的リンカーは特定の環境変数の使用を無効化し
(ld-linux.so(8) 参照)、 glibc
はそのプロセスの動作を別の観点で変更する
(secure_getenv(3) 参照)。
- AT_SYSINFO
- vDSO
のシステムコール関数へのエントリーポイント。すべてのアーキテクチャーで存在するわけではなく、
また必要というわけでもない
(例えば x86-64
には存在しない)。
- AT_SYSINFO_EHDR
- 仮想動的共有オブジェクト
(vDSO; virtual Dynamic Shared Object)
が入ったページのアドレス。
vDSO は、
特定のシステムコールの高速な実装を提供するためにカーネルが作成する共有オブジェクトである。
- AT_UCACHEBSIZE
- ユニファイド (unified)
キャッシュのブロックサイズ。
- AT_UID
- このスレッドの実ユーザー
ID。
返り値
成功すると、
getauxval() は type
に対応する値を返す。
type
が見つからない場合には
0 を返す。
バージョン
getauxval() 関数は glibc
バージョン 2.16
で追加された。
属性
関数 getauxval()
はスレッドセーフである。
準拠
この関数は非標準で
glibc
による拡張である。
注意
補助ベクトルの情報を主に使用するのは、
動的ローダー ld-linux.so(8)
である。
補助ベクトルは、
カーネルが動的リンカーが通常もしくは常に必要とするある意味標準的な情報を伝えるための便利で効率的なショートカットである。
いくつかの場合では、
同じ情報がシステムコール経由でも取得できるが、
補助ベクトルを使う方がコストがかからない。
補助ベクトルには、
単に、
プロセスのアドレス空間の引き数リストと環境上に存在するだけである。
プログラム実行時に
LD_SHOW_AUXV
環境変数を設定すると、
プログラムに渡された補助ベクトルを表示することができる。
$ LD_SHOW_AUXV=1 sleep 1
任意のプロセスの補助ベクトルは
(ファイルのアクセス許可があれば)
/proc/PID/auxv
経由で取得できる。
詳細は proc(5) を参照。
バグ
glibc 2.19 で ENOENT
エラーが追加される前は、
type
が見つからなかった場合と
type に対応する値が 0
だった場合を明確に区別する方法がなかった。
この文書について
この man ページは Linux
man-pages
プロジェクトのリリース
3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。