リンク処理のオプションについて説明と検証を行います.
最初にリンクとは何か?を簡単に説明します.
たとえば,プログラムソース中で使用している標準関数としてprintfなどがありますが,その実行コードはライブラリの中にあります.これを共有ライブラリと呼んでいます.
プログラムソース(hoge.c)で定義される変数や関数は,オブジェクトファイル中(hoge.o)では「シンボル」として管理されます,オブジェクトファイルの内部では実際にアドレスは決定されないので,リンク処理において,シンボルへの最終的なアドレス割り付けが行われます.
前項の説明で作成した実行形式ファイルであるa.outが,どのようなライブラリに依存しているかを見るには以下のコマンドを打鍵します.
$ ldd a.out
libc.so.6 => /lib/libc.so.6 (0x4002a000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$
この結果からわかるとおり,/lib/libc.so.6と/lib/ld-linux.so.2を実行時にロードしています.
このような方式はダイナミックリンクと呼ばれています.実行形式ファイルのプログラムサイズは小さくなりますが,実行時に呼び出されるため,実行速度が要求される場合には不利になります.
後述する-staticというオプションをリンク時に使用した場合には,実行形式ファイルにライブラリを取り込んでしまいます.プログラムサイズは大きくなりますが,実行速度は改善されます.このような方式はスタティックリンクと呼ばれています.
そのどちらを使用するかは,システムの用途に依存します.
● 任意のファイル名をオプション指定
gccを実行する際,コマンドライン上にある特別に認識される接尾語で終わらないファイル名は,オブジェクトファイルの名前,もしくはライブラリの名前とみなされます.リンク処理が行われる場合,これらのオブジェクトファイルはリンカへの入力として使われます.
● -llibrary
リンク時にlibraryにより指定される名前のライブラリを探します.リンカは,ライブラリとオブジェクトファイルを,それらが指定された順番に探して処理します.
たとえばtcl/tkのライブラリは/usr/libにありますが,それをリンクする場合には-l/usr/libと指定します.
● -lobjc
Objective Cの関連なので,ここでは触れません.
● -nostartfiles
リンク時に標準システムスタートアップファイルを使いません.標準システムライブラリは,-nostdlibや-nodefaultlibsが使用されない限り,通常は使用されます.
組み込みなどの用途で標準スタートアップを使用しない場合に指定します.
● -nostdlib
リンク時に標準システムスタートアップファイルや標準システムライブラリを使用しません.スタートアップファイルはいっさいリンカに渡されません.指定されたライブラリだけがリンカに渡されます.
-nostartfilesと同様に,組み込みなどの用途で標準スタートアップを使用しない場合に指定します.
● -s
実行可能ファイルからすべてのシンボルテーブルと再配置情報を削除します.この情報はリンク時に使用されるもので,通常,実行には必要ありません.それを削除して実行形式ファイルを小さくするために使用します.GDBを使う際には使用してはいけません.
● -static
これを指定すると,実行形式ファイルにライブラリをコピーして取り込んでしまいます.プログラムサイズは大きくなりますが,実行速度は改善されます.ただし対象のライブラリが更新された場合には再度リンクしなければなりません.
● -shared
後に他のオブジェクトファイルとリンクして実行可能ファイルを作成することのできる共用オブジェクトを作成します.
● -symbolic
共用オブジェクトをビルドする際に,グローバルなシンボルへの参照を結合します.未解決の参照について警告を出力します.
● -Xlinker option
optionをリンカへのオプションとして渡します.このオプションを使って,GCCが認識する術をもたないシステム固有のリンカオプションを与えることができます.引き数を取るオプションを渡したいのであれば,-Xlinkerを2回使われなければなりません.1回目はオプションを指定するため,2回目は引き数を指定するためです.
● -Wl,option
optionをリンカへのオプションとして渡します.optionにカンマが含まれる場合は,カンマで分割されて複数のオプションとして渡されます.
● -u symbol
シンボルsymbolが未定義であるものとしてふるまいます.
|