日曜日, 5月 24, 2009

幾つかのgccオプション

リンクオプション

  • -fno-builtin

     名前の先頭が__builtin__で始まらない組み込み関数を認識しません.影響を受ける関数には,abort,abs,alloca,cos,exit,fabs,ffs,labs,memcmp,memcpy,sin,
    sqrt,strcmp,strcpy,strlenがあります.

     通常,GCCは特定の組み込み関数をより効率的に処理するために特殊なコードを生成します.たとえばallocaの呼び出しは,スタックを直接調整する単一の命令になることがあります.

     また,memcpyの呼び出しは,コピー命令のループをインライン展開したものになることがあります.結果として生成されるコードは,多くの場合,より小さくかつより速いものになりますが,関数を呼び出している部分が,実際にはもはや関数呼び出しには見えなくなるため,その関数呼び出しに対してブレークポイントを設定することができなくなるうえ,異なるライブラリとリンクすることによって関数のふるまいを変更することもできなくなります.

     -ansiオプションを指定すると,allocaとffsは組み込み関数ではなくなります.これらの関数はANSI規格では規定されていないからです.

  • -ffreestanding

     このオプションは組み込み環境や,カーネルをコンパイルする際に使用します.標準ライブラリが存在しない環境や,プログラムのスタートが__mainではない環境において使用します.

     これを指定すると同時に-fno-builtinオプションを指定したことになります.連載第3回で-fno-builtinオプションの解説をしましたが,GCC3.3になって,その意味が変わっています.これも後述します.

  • -nostartfiles

     リンク時に標準システムスタートアップファイルを使いません.標準システムライブラリは,-nostdlibや-nodefaultlibsが使用されない限り,通常は使用されます.

     組み込みなどの用途で標準スタートアップを使用しない場合に指定します.

  • -nostdlib

     リンク時に標準システムスタートアップファイルや標準システムライブラリを使用しません.スタートアップファイルはいっさいリンカに渡されません.指定されたライブラリだけがリンカに渡されます.

     -nostartfilesと同様に,組み込みなどの用途で標準スタートアップを使用しない場合に指定します.

0 件のコメント: