【※ 当記事は2020年7月2日時点の情報です】
ペイヴメント(@pavement1234)です。
普段漫然と使っているgcc。
そろそろちゃんと覚えたいので基本オプションを試してみたい。
ひとりごと
かつて私がプログラマーになったばかりの頃。
仕事ではSunのSolarisを使ってたのでコンパイラは商用のccを使ってました。
家でもプログラミングを勉強したいと思いましたが
商用UNIXを個人持ちするのは現実的ではありません。
そこでLinux、FreeBSDに関心を持ちました。
fips.exeていうDOSのパーティション分割ソフトで
Windows98、Linux、FreeBSDをマルチブートさせ
自宅に環境を作り夜な夜なプログラミング。
現在は組み込みLinuxでプログラム開発をしているので
gccを当たり前のように使っています。
そんなgccに初心に戻って触れてみたいと思います。
とにかくコンパイルして実行ファイルを作る
$ gcc test.c
とやると”a.out”という実行ファイルが生成されます。
readelfでヘッダを見るとこんな感じ。
$ readelf -h ./a.out
ELF ヘッダ:
マジック: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
クラス: ELF64
データ: 2 の補数、リトルエンディアン
バージョン: 1 (current)
OS/ABI: UNIX – System V
ABI バージョン: 0
型: EXEC (実行可能ファイル)
マシン: Advanced Micro Devices X86-64
バージョン: 0x1
エントリポイントアドレス: 0x400440
プログラムの開始ヘッダ: 64 (バイト)
セクションヘッダ始点: 4512 (バイト)
フラグ: 0x0
このヘッダのサイズ: 64 (バイト)
プログラムヘッダサイズ: 56 (バイト)
プログラムヘッダ数: 9
セクションヘッダ: 64 (バイト)
セクションヘッダサイズ: 30
セクションヘッダ文字列表索引: 27
実行ファイルに名前をつける
$ gcc -o test test.c
”test”という名前の実行ファイルが生成されました。
デバッグシンボル付き実行ファイルを生成する
$ gcc ‐g -o test test.c
”test”という名前の実行ファイルにデバッグシンボルが付加されました。
gdbなどでデバッグできます。
オブジェクトファイルのみ生成する
$ gcc ‐c test.c
”test.o”というオブジェクトファイルが生成されます。
コンパイル時にワーニングを出すようにする
$ gcc -Wall test.c
コンパイル時にワーニングが表示されるようになります。
最適化する
$ gcc -O2 test.c
コンパイル時に最適化(Optimize)します。
コードが小さくなったり、高速になったりするみたい(今度詳しく調べてみます)。
O1:最適化する。
O2:さらに最適化する。
O0:最適化しない。
の3種類あるようです。
ライブラリをリンクする
$ gcc -lxxx test.c
libxxx.aをリンクしたい場合、
libと.aを除いたxxxを-l(小文字のエル)のあとに指定します。
ライブラリパスを指定する
$ gcc -L/hoge/moge -lxxx test.c
標準のライブラリパス/usr/libなとではなく
/hoge/moge/libxxx.aをリンクしたい場合、
上記のように-L(大文字エル)の後にパスを指定します。
スペースはあけません
インクルードパスを指定する
$ gcc -I/hoge/moge test.c
標準のインクルードパス
/usr/includeなとではなく
/hoge/moge/xxx.hをインクルードしたい場合、
#include “/hoge/moge/xxx.h”
みたいにやっちゃいがちですが、
-I(大文字アイ)の後にパスを指定することで
ユーザ定義のインクルードパスを追加でき、
プログラムには以下のように書けます。
環境依存を排除する観点からもお勧めです。
#include <xxx.h>
こんな風にするのもあり
$ gcc -I/hoge test.c
#include <moge/xxx.h>
余談ですが、
こうするとソースファイルと同じディレクトリにあるヘッダを探します
#include “/xxx.h”
まとめ
普段漫然と使っているgcc。
そろそろちゃんと覚えたいと思い、
基本オプションをそれぞれ試してみました。
次回はもうちょっとマニアックなオプションの使い方をご紹介します。
関連記事(プログラミング)
【プログラミング】マルチコア環境における排他制御の課題
【プログラミング】gccの基本オプションの使い方
【C言語】デバッグのテクニック(標準関数のスタブ作成、動的ライブラリのデバッグ方法)
【プログラミング】迂回(Detours)という技術について
【プログラミング】64bit OSの32bitエミュレーションの状況