ld-サポートインタフェースはすべて、ヘッダファイル link.h に定義されています。インタフェース引数はすべて、基本的な C タイプまたは ELF タイプです。ELF データタイプは、ELF アクセスライブラリ libelf によって調べることができます (libelf の内容については、elf(3ELF) を参照)。次のインタフェース関数は、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 は出力ファイルタイプであり、ET_DYN、ET_REL、ET_EXEC のどれかです (sys/elf.h に定義)。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 は入力ファイルのタイプを示し、 ELF_K_AR または ELF_K_ELF のどちらかになります (libelf.h に定義)。flags は、リンカーによるファイルの取得方法を示し、次の 1 つまたは複数の定義にすることができます。
LD_SUP_DERIVED - ファイル名はコマンド行に明示的に指定されていない。 -l の拡張から派生するか、または抽出されたアーカイブ構成要素を示す
LD_SUP_INHERITED - ファイルは、コマンド行共有オブジェクトの依存関係として取得される
LD_SUP_EXTRACTED - ファイルは、アーカイブから抽出される
flags 値が指定されていない場合、入力ファイルはコマンド行に明示的に指定されています。elf は、ファイル ELF 記述子へのポインタです。
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 オプションによって取り除かれるセクションは、ld_section() に報告されません。