Go to main content
Oracle® Solaris 11.3 リンカーとライブラリガイド

印刷ビューの終了

更新: 2015 年 10 月
 
 

セクションのマージ

SHF_MERGE セクションフラグを使って、再配置可能オブジェクト内の SHT_PROGBITS セクションにマークすることができます。表 20 を参照してください。このフラグによって、そのセクションがほかのオブジェクトの互換セクションとマージできることがわかります。これらの再配置可能オブジェクトをマージすることによって、それらから構築される実行可能ファイルや共有オブジェクトのサイズを減らせる可能性があります。サイズを減らすことによって、最終オブジェクトの実行時パフォーマンスが向上することもあります。

セクションに SHF_MERGE フラグが付いていることは、次のような特性があることを示します。

  • セクションは読み取り専用です。このセクションを含むプログラムは、実行時にセクションデータを変更することはできません。

  • セクション内の各項目はそれぞれの再配置レコードからアクセスされます。プログラムコードは、セクション内の項目にアクセスするコードを生成するときに、それらの項目の相対位置についていかなる仮定を行なってはいけません。

  • セクションに SHF_STRINGS フラグも設定されている場合は、そのセクションには NULL で終わっている文字列だけを含めることができます。NULL 文字は文字列の最後にしか使用できません。文字列の途中に NULL 文字が現れてはいけません。

SHF_MERGE は、最適化できる可能性があることを示す、省略可能なフラグです。リンカーは、最適化を実行するか最適化を無視するかを選択できます。リンカーは、いずれの場合も有効な出力オブジェクトを作成します。リンカーは現在のところ、SHF_STRINGS フラグがマークされた文字列データを含むセクションだけに、セクションのマージを実装します。

SHF_STRINGS セクションフラグと一緒に SHF_MERGE フラグも設定されているときは、そのセクション内の文字列はほかの互換セクション内の文字列とマージできます。リンカーは、SHT_STRTAB 文字列テーブル .strtab.dynstr の圧縮に使用される文字列圧縮アルゴリズムを使用して、このようなセクションをマージします。

  • 重複する文字列は 1 つだけがコピーされます。

  • 末尾の文字列は削除されます。たとえば、入力セクションに文字列「bigdog」と「dog」が含まれる場合は、短いほうの「dog」文字列が削除され、長い文字列の末尾を使って短い文字列が表現されます。

リンカーは現在のところ、バイトサイズ文字から構成され、特殊な整列制約のない文字列だけに、文字列のマージを実装します。具体的には、セクションは次の特性を備えている必要があります。

  • sh_entsize は 0 または 1 でなければいけません。ワイド文字を含むセクションはサポートされません。

  • sh_addralign が 0、または 2 のべき乗であるセクションだけがマージされます。


注 -  リンカーの –z nocompstrtab オプションを使って文字列テーブルの圧縮を抑制できます。