0
Help us understand the problem. What are the problem?

posted at

updated at

bashのコンパイルについて

この記事は、bashのソースを読みたいがコンパイルの仕方を知らない人向けに書きます。

bashは以下の手順でコンパイルできます。

$ wget https://ftp.gnu.org/gnu/bash/bash-5.1.tar.gz
$ tar -xzf bash-5.1.tar.gz
$ cd bash-5.1
$ CFLAGS="-g -O0" ./configure
$ make -j 7

この手順が完了すると、カレントディレクトリ内にbashという実行ファイルができています。


[追記]
akinomyogaさんから教えていただきました。
ソースを読むには、開発版のほうが適しているそうです。
(デバッグ用のコードやデバッグ用のmallocが有効になる。)

上記のコードの以下のように変更します。

$ git clone git://git.savannah.gnu.org/bash.git
$ cd bash
$ CFLAGS="-g -O0" ./configure
$ make -j 7

以下に各行の大まかな意味を書きます。

$ wget https://ftp.gnu.org/gnu/bash/bash5.1.tar.gz

このコマンドでbashのソースをダウンロードします。
wgetとはnetwork downloaderです。
詳しくはman wgetとかで調べるといいと思いますが、

適当に

$ wget https://google.com

とかをやってみると、何をやっているのか解ると思います。

$ tar -xzf bash-5.1.tar.gz

これでファイルを展開します。(man tarを参照)

$ cd bash-5.1

カレントディレクトリを変更します。

$ CFLAGS="-g -O0" ./configure

このコマンドで、Makeというビルドツールに使う
Makefileというファイルを生成します。
Makeは内部でgccを呼び出しています。

$ ./configure

だけでもMakefileは生成されますが、
コンパイル時に使うフラグを指定するために

$ CFLAGS="-g -O0" ./configure

とします。
フラグ -g を使うことで、コンパイルされるオブジェクトファイルにデバッグ情報を埋め込みます。
フラグ -O0 を使うことで、最適化レベルを最低にします。
gccはコンパイル時に最適化という処理を行っており、
このフラグがない場合、ソースコードとオブジェクトファイルの対応が
変わってしまい、ソースの追跡が難しいです。

$ make -j 7

ビルドします。
フラグ" -j n "を使うことで、マルチプロセスでビルドしてくれるため、ビルドが早く終わります。nは整数です
この場合は7を指定することで7つのプロセスで分割してビルドしています。

以上が終わると、カレントディレクトリ内にbashという実行ファイルができています。

すべてをもとに戻したい場合は

$ make clean

とすれば、実行ファイル、Makefileなどがすべて消えるので、またはじめからやり直せます。
適当なフラグを指定して、実験してみると何が起こっているのかわかります。

ビルド   = コンパイルやリンクなど様々な処理を経て、実行ファイルを生成すること
コンパイル = ソースコードからリンクする前のオブジェクトファイルを生成すること

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?