「ld-サポート」インタフェースはすべて、ヘッダーファイル link.h に定義されています。インタフェース引数はすべて、基本的な C タイプまたは ELF タイプです。 ELF データタイプは、ELF アクセスライブラリ libelf を使用して確認できます。libelf の詳細は、elf(3ELF) を参照してください。次のインタフェース関数が「ld-サポート」インタフェースにより提供されます。各インタフェース関数は、使用順序に従って記載されています。
この関数は、リンカーとサポートライブラリとの間の初期ハンドシェークを提供します。
uint_t ld_version(uint_t version);
リンカーは、サポート可能な最新バージョンの「ld-サポート」インタフェースを使用して、このインタフェースを呼び出します。サポートライブラリは、このバージョンが使用するのに十分かどうかを確認して、使用する予定のバージョンを返すことができます。通常、このバージョンは LD_SUP_VCURRENT です。
サポートライブラリがこのインタフェースを提供しない場合、初期サポートレベルは LD_SUP_VERSION1 と見なされます。
サポートライブラリがゼロのバージョン、またはリンカーがサポートする「ld-サポート」インタフェースよりも大きい値を返す場合、サポートライブラリは使用されません。
この関数は、リンカーコマンド行の初期妥当性検査の後に呼び出されて、入力ファイル処理の開始を示します。
void ld_start(const char * name, const Elf32_Half type, const char * caller); void ld_start64(const char * name, const Elf64_Half type, const char * caller); |
name は、作成される出力ファイル名を示します。type は出力ファイルタイプであり、sys/elf.h に定義されている ET_DYN、ET_REL、ET_EXEC のいずれかです。caller は、インタフェースを呼び出すアプリケーションを示します。これは通常、/usr/ccs/bin/ld です。
この関数は、ファイルデータの処理が実行される前に、各入力ファイルに対して呼び出されます。
void ld_file(const char * name, const Elf_Kind kind, int flags, Elf * elf); void ld_file64(const char * name, const Elf_Kind kind, int flags, Elf * elf);
name は処理される入力ファイルを示します。kind は入力ファイルのタイプを示し、libelf.h に定義されているように ELF_K_AR または ELF_K_ELF のいずれかになります。flags は、リンカーによるファイルの取得方法を示し、次の 1 つまたは複数の定義にすることができます。
LD_SUP_DERIVED – ファイル名はコマンド行に明示的に指定されていない。-l の拡張から派生するか、または抽出されたアーカイブ構成要素を示す
LD_SUP_EXTRACTED – ファイルは、アーカイブから抽出される
LD_SUP_INHERITED – ファイルは、コマンド行共有オブジェクトの依存関係として取得される
flags 値が指定されていない場合、入力ファイルはコマンド行に明示的に指定されています。elf は、ファイル ELF 記述子へのポインタです。
この関数は、入力ファイルの各セクションに対して呼び出されます。この関数は、リンカーがそのセクションを出力ファイルに送信することを決定する前に呼び出されます。これは、出力ファイルに寄与するセクションに対してのみ呼び出される、ld_section() 処理とは異なります。
void ld_input_section(const char * name, Elf32_Shdr ** shdr, Elf32_Word sndx, Elf_Data * data, Elf * elf, unit_t flags); void ld_input_section64(const char * name, Elf64_Shdr ** shdr, Elf64_Word sndx, Elf_Data * data, Elf * elf, uint_t flags);
name は、入力セクション名を示します。shdr は、関連のセクションヘッダーへのポインタを示します。sndx は、入力ファイル内のセクションインデックスです。data は、関連データバッファへのポインタを示します。elf は、ファイル ELF 記述子へのポインタです。flags は、将来の使用のために予約されています。
セクションヘッダーの再割り当ておよび *shdr への代入によるセクションヘッダーの変更は許されています。リンカーは、ld_input_section() から戻った後で、*shdr が指し示すセクションヘッダー情報を使用して、セクションを処理します。
データを再割り当てし、Elf_Data バッファの d_buf ポインタに代入してデータを変更できます。データを変更する場合、Elf_Data バッファの d_size 要素を正しく設定しなければなりません。出力イメージの一部になる入力セクションでは、d_size 要素をゼロに設定すると、出力イメージからデータが実際に削除されます。
flags フィールドは、初期値にゼロが設定される uint_t データフィールドを指します。フラグは、将来のアップデートでリンカーやサポートライブラリが割り当てできるように提供はされていますが、現在のところは割り当てられていません。
出力ファイルに送信される入力ファイルのセクションごとにこの関数が呼び出されてから、セクションデータの処理が実行されます。
void ld_section(const char * name, Elf32_Shdr * shdr, Elf32_Word sndx, Elf_Data * data, Elf * elf); void ld_section64(const char * name, Elf64_Shdr * shdr, Elf64_Word sndx, Elf_Data * data, Elf * elf);
name は、入力セクション名を示します。shdr は、関連のセクションヘッダーへのポインタを示します。sndx は、入力ファイル内のセクションインデックスです。data は、関連データバッファへのポインタを示します。elf は、ファイル ELF 記述子へのポインタです。
データ自体を再割り当てし、Elf_Data バッファの d_buf ポインタに代入してデータを変更できます。データを変更する場合、Elf_Data バッファの d_size 要素を正しく設定しなければなりません。出力イメージの一部になる入力セクションでは、d_size 要素をゼロに設定すると、出力イメージからデータが実際に削除されます。
リンカーの -s オプションによって取り除かれるセクション、または SHT_SUNW_COMDAT 処理や SHF_EXCLUDE の識別によって破棄されるセクションは、ld_section() に報告されません。「COMDAT」セクションと 表 7–14 を参照してください。
この関数は、入力ファイルの処理が完了し、出力ファイルの配置が実行される前に呼び出されます。
void ld_input_done(uint_t flags);
flags フィールドは、初期値にゼロが設定される uint_t データフィールドを指します。フラグは、将来のアップデートでリンカーやサポートライブラリが割り当てできるように提供はされていますが、現在のところは割り当てられていません。
void ld_atexit(int status); void ld_atexit64(int status);
status は、リンカーによって返される exit(2) コードであり、stdlib.h に定義されているように、EXIT_FAILURE または EXIT_SUCCESS のいずれかになります。