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

印刷ビューの終了

更新: 2015 年 10 月
 
 

リンカーオプションの指定

通常、リンカーはコマンド行オプションを使って完全に指定されます。ただし、コマンド行処理を強化する目的でさまざまな環境変数が用意されています。これらの変数を使えば、コンパイラオプションと衝突する可能性のあるオプションを指定できます。これらの変数を使えば、スクリプト内やビルド環境内に埋め込まれたコマンド行オプションの上書きまたは設定解除も行えます。

各コマンド行オプションの間に 1 つでも矛盾があると、致命的エラーの状態になります。環境変数から提供されたオプションに関する不整合が検出されると、警告が発行され、最初のオプションが優先されます。UNSET 操作時には必ず警告が通知されます。

環境やコマンド行からのオプションは、次の順番で解釈されます。

  • LD_OPTIONS 環境変数から。

  • コマンド行から。

  • LD_UNSET 環境変数から。

LD_OPTIONS は、その他の場合ではコンパイラドライバが解釈する引数を、リンカーに渡すために使用できます。たとえば、リンカーに関連した診断は、–D オプションを使用して取得できます。このオプションは通常、コンパイラプリプロセッサで解釈されます。

$ LD_OPTIONS=-Dargs  cc -o main main.c
...
debug: arg[0]  option=-D:  option-argument: args  (LD_OPTIONS)
debug:
debug: arg[0]  /usr/ccs/bin/ld
debug: arg[2]  option=-o:  option-argument: main
debug: arg[3]  option=-Q:  option-argument: y
debug: arg[4]  option=-l:  option-argument: c

LD_OPTIONS はまた、一連のバリエーションのあるオプションをオーバーライドするために使用できます。たとえば、埋め込まれた –z text オプションは –z textoff オプションでオーバーライドできます。

$ LD_OPTIONS=-ztextoff  cc -ztext -G null.o
ld: warning: option '-ztextoff' and option '-ztext' are incompatible, \
    first option taken

オプションの中には、代替のバリエーションがないため、オーバーライドできないものもあります。ただし、設定解除は行えます。たとえば、標準のリンク編集で次のセクションを作成できます。

$ cc -o main main.c
$ elfdump -c main | egrep "symtab|debug"
Section Header[19]:  sh_name: .symtab
Section Header[22]:  sh_name: .debug_info
Section Header[23]:  sh_name: .debug_line

これらのセクションは、–z strip-class オプションで削除できます。

$ cc -o main -zstrip-class=symbol -zstrip-class=debug main.c
$ elfdump -c main | egrep "symtab|debug"
$

個々の除外オプションを設定解除できます。次の例は、デバッグセクションの除外を設定解除します。

$ LD_UNSET=-zstrip-class=debug  cc -o main -zstrip-class=symbol \
    -zstrip-class=debug main.c
ld: warning: unsetting option '-zstrip-class=debug': LD_UNSET directed
$ elfdump -c main | egrep "symtab|debug"
Section Header[20]:  sh_name: .debug_info
Section Header[21]:  sh_name: .debug_line

さらに、–z strip-class など複数のインスタンスに対応したオプションは、修飾オプション文字列を使用せずにオプションを指定することによって、すべてのファミリメンバーを設定解除できます。次の例は、デバッグおよびシンボルテーブルセクションの除外を設定解除します。

$ LD_UNSET=-zstrip-class  cc -o main -zstrip-class=symbol \
    -zstrip-class=debug main.c
ld: warning: unsetting option '-zstrip-class': LD_UNSET directed
$ elfdump -c main | egrep "symtab|debug"
Section Header[19]:  sh_name: .symtab
Section Header[22]:  sh_name: .debug_info
Section Header[23]:  sh_name: .debug_line

出力オブジェクトタイプは、LD_OPTIONS、および LD_UNSET コンポーネントから決定されます。次にそのオブジェクトタイプに基づいて LD_{object-type}_UNSET および LD_{object-type}_OPTIONS 環境変数が調査され、構築中のオブジェクトタイプに固有のオプションが削除または追加されます。object-type は、–z type オプションによって定義されるタイプ (大文字) であり、EXECPIERELOCSHARED のいずれかになります。たとえば、出力ファイルのタイプが動的実行可能ファイルであれば、LD_EXEC_OPTIONS のオプションが解釈されます。これらの環境変数は次の順番で処理されます。

  • LD_{object-type}_UNSET 環境変数から。

  • LD_{object-type}_OPTIONS 環境変数から。

たとえば、動的実行可能ファイルと共有オブジェクトの両方を作成する構築環境では、LD_EXEC_OPTIONS 環境変数を使用して、すべての動的実行可能ファイルに対しアドレス空間レイアウトのランダム化を有効にすることができます。

$ LD_EXEC_OPTIONS=-zaslr  build.sh

この出力オブジェクトタイプと矛盾するコマンド行オプションが含まれていると、致命的エラーの状態になります。環境変数から提供されたオプションで不整合が検出されると、警告が発行され、そのオプションは無視されます。

もっとも標準的に使用されるリンカーオプションについては、Chapter 5, リンカーのクイックリファレンスを参照してください。また、すべてのリンカーオプションについての詳しい説明については、ld(1) を参照してください。