リンカーとライブラリ

監査インタフェースの関数

次の関数が rtld-監査インタフェースによって提供されており、予定の使用順序で記述されます。


uint_t la_version(uint_t version);
la_version()

この関数は、実行時リンカーと監査ライブラリの間に初期接続を提供します。このインタフェースを読み込むには、監査ライブラリによってこれを提供する必要があります。

実行時リンカーは、サポート可能な最上位バージョンの rtld-監査によって、このインタフェースを呼び出します。監査ライブラリは、このバージョンが十分に使用できるかどうかを確認して、使用する予定のバージョンを返すことができます。このバージョンは、通常、/usr/include/link.h に定義されている LAV_CURRENT です。

監査ライブラリがゼロのバージョン、または実行時リンカーがサポートする rtld-監査インタフェースよりも大きい値を返す場合は、監査ライブラリは使用されません。


uint_t la_objopen(Link_map * lmp, Lmid_t lmid, uintptr_t * cookie); 
la_objopen()

この関数は、新しいオブジェクトが実行時リンカーによって読み込まれるたびに呼び出されます。

lmp は、新しいオブジェクトを記述するリンクマップ構造を提供します。lmid は、オブジェクトが追加されているリンクマップリストを特定します (「名前空間の確立」 を参照)。cookie は、識別子へのポインタを提供します。この識別子は、オブジェクト lmp に初期設定されますが、監査ライブラリによって、オブジェクトを他の rtld-監査インタフェースルーチンに対して特定するように変更できます。

この関数は、このオブジェクトで問題になるシンボル結合を示す値を返します。この結果、la_symbind32/usr/include/link.h() に定義された次の値のマスクです。

  • LA_FLG_BINDTO - このオブジェクトに対する監査シンボル結合

  • LA_FLG_BINDFROM - このオブジェクトからの監査シンボル結合

これらの 2 つのフラグ使用法については、la_symbind() を参照してください。

ゼロの戻り値は、結合情報がこのオブジェクトで問題にならないことを示します。


void la_preinit(uintptr_t * cookie);
la_preinit()

この関数は、すべてのオブジェクトがアプリケーションに読み込まれた後で、アプリケーションへの制御の譲渡が発生する前に一度呼び出されます。

cookie は、プロセスを開始したプライマリオブジェクト、通常は動的実行可能プログラムを表わします。


uintptr_t la_symbind32(Elf32_Sym * sym, uint_t ndx,
        uintptr_t * refcook, uintptr_t * defcook, uint_t * flags);
 
uintptr_t la_symbind64(Elf64_Sym * sym, uint_t ndx,
        uintptr_t * refcook, uintptr_t * defcook, uint_t * flags,
	        const char * sym_name);
la_symbind32(), la_symbind64()

この関数は、結合通知のタグが付けられた 2 つのオブジェクト間で結合が発生すると呼び出されます (la_objopen()を参照)。

sym は、構築された記号構造 (/usr/include/sys/elf.h を参照) であり、sym->st_value は結合中の記号定義のアドレスを示します。la_symbind32() は、sym->st_name を調整して実際の記号名を指していますが、la_symbind64()sym->st_name を調整していません。これは、文字列テーブルのインデックスです。

ndx は、結合オブジェクト動的記号テーブル内の記号インデックスを示します。refcook は、この記号への参照を行うオブジェクトを記述します。この識別子は、LA_FLG_BINDFROM を返した la_objopen() に渡されたものと同じです。defcook は、この記号を定義するオブジェクトを記述します。この識別子は、LA_FLG_BINDTO を返した la_objopen() に渡されるものと同じです。

flags は、手続きリンクテーブル記号エントリの連続監査を変更するために使用できるデータ項目を指します。この値は、/usr/include/link.h に定義された次のフラグのマスクです。

sym_name は、結合中の記号の文字列名を指します (la_symbind64 の場合のみ)。

  • LA_SYMB_NOPLTENTER - la_*_pltenter() 関数は、この記号に対しては呼び出されない

  • LA_SYMB_NOPLTEXIT - la_pltexit() 関数は、この記号に対しては呼び出されない

  • LA_SYMB_DLSYM - dlsym(3X) を呼び出した結果発生したシンボル結合

  • LA_SYMB_ALTVALUE (LAV_VERSION2) -「la_symbind32/la_symbind64」への以前の呼び出しによって、記号値に対して代替値が返される

デフォルトにより、la_*_pltenter() または la_pltexit() 関数が監査ライブラリ内に存在する場合、シンボルが参照されるたびに、これらは手続きリンクテーブル記号に対して、la_symbind32 の後で呼び出されます (「監査インタフェースの制限」も参照)。

戻り値は、この呼び出しに続いて制御を渡す必要があるアドレスを示します。シンボル結合を監視するだけの監査ライブラリは、sym->st_value の値を返すため、制御は結合記号定義に渡されます。監査ライブラリは、異なる値を返すことによって、シンボル結合を意図的にリダイレクトできます。

la_symbind64() への sym_name は、処理されるシンボルの名前を含みます。これは、32 ビットインタフェースから sym->st_name フィールドで使用できます。


uint_t la_sparcv8_pltenter(Elf32_Sym * sym, uint_t ndx,
        uintptr_t * refcook, uintptr_t * defcook,
        La_sparcv8_regs * regs, uint_t * flags);
 
uint_t la_sparcv9_pltenter(Elf64_Sym * sym, uint_t ndx,
        uintptr_t * refcook, uintptr_t * defcook,
        La_sparcv9_regs * regs, uint_t * flags,
        const char * sym_name);
 
uint_t la_i86_pltenter(Elf32_Sym * sym, uint_t ndx,
        uintptr_t * refcook, uintptr_t * defcook,
        La_i86_regs * regs, uint_t * flags);
la_sparcv8_pltenter(), la_i86_pltenter(), la_sparcv9_pltenter()

これらの関数は、結合通知のタグが付けられた 2 つのオブジェクト間の手続きリンクシンボルエントリが呼び出されると、SPARC および x86 のシステムでそれぞれ呼び出されます (la_objopen()la_symbind32() を参照)。

sym、ndx、refcook、defcook、およびsym_nameは、la_symbind32()/la_symbind64() に渡されたものと同じ情報を提供します。

regs は、/usr/include/link.h に定義されているように、SPARC システム上のout レジスタと、x86 システム上のstack およびframe レジスタを指します。

flags は、手続きリンクテーブルエントリの連続監査を変更するために使用できるデータ項目を指します。このデータ項目は、la_symbind32() から flags によって指されるものと同じです。この値は、/usr/include/link.h に定義された次のフラグのマスクです。

  • LA_SYMB_NOPLTENTER - la_sparcv8_pltenter() または la_i86_pltenter() 関数は、この記号では続いて呼び出されない

  • LA_SYMB_NOPLTEXIT - la_pltexit() 関数は、この記号では呼び出されない

戻り値は、この呼び出しに続いて制御を渡す必要があるアドレスを示します。シンボル結合を監視するだけの監査ライブラリは、sym->st_value の値を返すため、制御は結合記号定義に渡されます。監査ライブラリは、異なる値を返すことによって、シンボル結合を意図的にリダイレクトできます。

la_sparcv9_pltenter() への sym_name パラメータは、処理中のシンボルの名前を含みます。これは、32 ビットインタフェースから sym->st_name フィールドで使用できます。


uint_t la_pltexit(Elf32_Sym * sym, uint_t ndx, uintptr_t * refcook,
        uintptr_t * defcook, uintptr_t retval);
uint_t la_pltexit64(Elf64_Sym * sym, uint_t ndx, uintptr_t * refcook,
        uintptr_t * defcook, uintptr_t retval, const char * sym_name);
la_pltexit()

この関数は、結合通知のタグが付けられた 2 つのオブジェクト間の手続きリンク記号項目 (la_objopen()la_symbind32()を参照) が返されて、制御が呼び出し側に到達するまでの間に呼び出されます。

sym、ndx、refcook、および defcookは、la_symbind32() に渡されるものと同じ情報を提供します。retval は、結合関数からの戻りコードです。la_pltexit64() への sym_name パラメータは、処理中のシンボルの名前を含み、32 ビット実装状態の sym->st_name フィールドから使用できます。

シンボル結合を監視する監査ライブラリは、retval を返します。監査ライブラリは意図的に異なる値を返すことができます。


注 -

このインタフェース関数は実験的なものです 「監査インタフェースの制限」 (「初期設定および終了ルーチン」を参照)。



uint_t la_objclose(uintptr_t * cookie);
la_objclose()

この関数はオブジェクトに対する終了コードが実行されてから、オブジェクトが読み込みを解除されるまでに呼び出されます (「初期設定および終了ルーチン」 を参照)。

cookie は、以前の la_objopen() から取得されていて、オブジェクトを特定します。戻り値は、ここではすべて無視されます。