>  > 【2017年製 17週以降】265/40R21 (105Y) XL B【ピレリ ピーゼロ ラグジュアリー】【PIRELLI NEW P ZERO LUXURY NCS PZ4】【Bentley承認】【新品】
ただいま工事中につき、ご協力ください

【2017年製 17週以降】265/40R21 (105Y) XL B【ピレリ ピーゼロ ラグジュアリー】【PIRELLI NEW P ZERO LUXURY NCS PZ4】【Bentley承認】【新品】

このページでは、GNUの開発ツールキットである "GNU Compiler Collection (gcc)","GNU Binary Utilities (gnu-ld, gnu-as)","GNU Debugger (gdb)"に関して色々書きます。近頃、「この手のページって無いですね」っていう方が増えてきたので、ちょっと作ってみました。GNUに関するちょっとした話とともに、各ツールの話、そしてビルド方法や使用方法などを説明できればと思ってます。

What's GNU?

B【ピレリ 17週以降】265/40R21 ピーゼロ P XL 【2017年製 PZ4】【Bentley承認】【新品】 ZERO NCS NEW ZERO LUXURY ラグジュアリー】【PIRELLI XL (105Y)

"GNU"という単語は、Linuxユーザや組込みプログラマなら一回は聞いたことあるでしょう。GNUとは、GNUプロジェクトそのものを指す言葉でもあり、GNUプロジェクトによって作られたプログラムを指す言葉でもあり、GNUプロジェクトが設けているライセンスを指す言葉でもあります。

GNUは、"GNU is not UNIX!"の略称です。日本語で言うと「GNUはUNIXじゃないよ」と言ったところでしょうか。これは、「自分の定義の頭文字が自分自身になる」という「再帰頭文字」という言葉遊びの一種らしいです。ですから、「GNUって何?」と聞かれたら、「UNIXじゃないよ」と答えましょう。で、「GNUがUNIXではないことは判った。で、GNUって何?」と聞かれても、「UNIXではないよ」と答えましょう。「だからそうじゃなくて、GNUの本当の意味は何かって聞いてるんだけど」と聞かれても、相手が怒ってしまったとしても、GNUはUNIXではないんです。


真の「フリーソフトウェア」

GNUプロジェクトが作成するソフトウェアは、真の「フリーソフトウェア」です。「フリーソフトウェア」という言葉は「ハッカー」と同じくらい誤解されている言葉で、かつコンピュータを使っている人でもちゃんと知っている人はそれほど多くない言葉です。

「フリーソフトウェア」は、自由を保障するソフトウェアを指します。決して「無料/無償」だから「フリー」ではありません。お金を取ったとしても自由を保障すれば「フリーソフトウェア」になります。オープンソースであることもフリーソフトウェアである条件のひとつではありますが、全てのオープンソースソフトウェアがフリーソフトウェアであるとは限りません。で、保障すべき自由は次の4つです。

「へ~、それじゃぁオレが勝手に実行して、修正して、コピーを配りまくっても自由なんだ」というのは正しいですが、ひとつだけ制約があります。それは、「フリーソフトウェアを使って作ったものもフリーソフトウェアにしてね」ということです (正確には、"GNU Public License"のソフトウェア)。つまり、あなたがGNUのソフトウェアを使って何かを作ったとき、他人がそれを勝手に実行して、修正して、さらにコピーして配りまくる自由を認めなければいけません。GNUは共産主義ソフトウェアなのです。彼らの思想に同意できないのであれば、あなたは彼らの成果を利用することはできません。利用許諾に従うことなく使用した場合、あなたは著作者が専有する「複製権」「頒布権」「展示権」などに抵触するおそれがあります。

ちなみに、「TOPPERSプロジェクト」が作成するソフトウェアのライセンスはこの条件を満たすため、フリーソフトウェアらしいです。逆に、【クスコ CUSCO】レガシィ ツーリングワゴン 等にお勧め LSD type RS フロント 1way 型式等:BR9 品番:LSD 180 Fはオープンソフトウェアではあるけれど、フリーソフトウェアではないそうです (本人談)。なぜなら、【2017年製 17週以降】265/40R21 (105Y) XL B【ピレリ ピーゼロ ラグジュアリー】【PIRELLI NEW P ZERO LUXURY NCS PZ4】【Bentley承認】【新品】 All Rights Reserved..htm">HORB 使用許諾契約書 第3.2版 第2条フーガ Y50 前期 フロントバンパー(ネットセンターリップ付) J-UNIT 【送料無料】 充電制御車対応 バッテリー ダイハツ ハイゼットトラック EBD-S510P 用 AMS44B19L ACデルコ ACDelco メンテナンスフリー 充電制御対応 AMS DAIHATSU 車 車用 44B19L カーバッテリー バッテリートラブル バッテリー上がり 【送料無料】プレゼント付【H3C 70W 低損失リレーケーブル付】PHILIPSバーナー+スーパーデジタルバラストHIDキット に、「平和目的以外で使用禁止。HORBで兵器作るなよ」と書いてあるため、「目的を問わず」という条件に違反しているからだそうです。

【2017年製 17週以降】265/40R21 (105Y) XL [個別送料] B【ピレリ ピーゼロ ラグジュアリー】【PIRELLI NEW P ZERO VOSSEN LUXURY NCS PZ4】【Bentley承認】【新品】

【SSR】 EXECUTOR EX05 (エグゼキューター EX05) 20インチ 11.0J PCD:112 穴数:5 inset:4 ブラッシュド [ホイール1本単位] [H]
The GNU Project (日本語によるGNUプロジェクトの説明)
フリーソフトウェアの定義
著作権法

GNU Binary Utilities (binutils)

What's the GNU binary utilities?

GNU Binary Utilities(以下、binutils)は TOYOTIRES トーヨー プロクセス R1R PROXES サマータイヤ 225/45R17 KYOHO SEIN-SS ザインSS ブラック ホイールセット 4本 17インチ 17 X 7 +48 5穴 100、プログラムを作るときに必要となる色々なバイナリ操作のためのプログラム集です。バイナリ操作というとファイルをいじるだけに感じますが、実際には「アセンブラ」「リンカ」など、プログラム作成に不可欠なツールも含まれています。

具体的に含まれているプログラムの一部を紹介すると...

名称種別機能
arアーカイバオブジェクトライブラリを作るためのプログラム
asアセンブラアセンブリソースからオブジェクトを作るためのプログラム
ldリンカシンボル割付を行うためのプログラム
nmシンボル表示シンボル情報を表示するプログラム
objcopyバイナリ操作オブジェクトファイルの中身を操作するプログラム
objdumpバイナリダンパオブジェクトファイルの中身を表示するプログラム
ranlibインデクサアーカイブの中身に番号をつけるプログラム
sizeサイズ表示セクションのサイズを表示するプログラム
stripシンボルストリッパシンボル情報を削除するためのプログラム

GNU開発ツールキットを使用してクロス開発環境を作成する作業は、Binutilsを作ることから始まります。binutilsは、クロス開発環境を構成する最も基本的なソフトウェア群だと心得てください。


How to build the binutils

ターゲット名を知る

2輪 AP ブレーキパッド 入数:1キャリパー分(2枚) フロント ハスクバーナ SMR450RR Radial Caliper 450cc 2006年~2008年 MPV LY3P 05.12~ RG ブレーキパッド 前後セット SR715 SR755 送料無料

開発環境を作成するためのFirst-stepは、自分が対象としているターゲット名を知ることから始まります。ターゲット名は一般的には「CPU名称」「ベンダ名」「オブジェクトファイルフォーマット種別」の3つをハイフンで区切った形で表現されます。例えば"sh-hitachi-elf"とか、"v850-nec-elf"とか、"i386-intel-coff"とか、"m68k-coff"とかいう形です。

プロセッサ名は、厳密にはアーキテクチャ名になります。例えば、日立 SH-3とSH-4のアーキテクチャ名は、両方とも"sh"になります。同じように、ARMプロセッサもARM7TDMI/ARM920T/ARMv4を問わず、"ARM"というアーキテクチャ名になります。その一方で、何が違うのかわかりませんが"thumb-elf"という記述もできるようです (arm-elfでもThumbコードセットを扱えます)。

プロセッサ名がわかったら、ベンダ名です。ほとんどの場合ベンダ名を省略しても動きます。ベンダ名を指定しておくと、ベンダ固有の機能を使える場合もあります。また、OSに固有の機能を使う場合にも使用されます。その際、ベンダ名としてOSの名前を入れます。

最後にオブジェクトファイルフォーマットの名前です。オブジェクトファイルフォーマットとは、プログラムをファイルに格納するときの決め事を指します。どこにどんなデータを置くかとか、命令なのかデータなのかとか、その他デバッグに使用される情報などを格納する際のフォーマットです。最近、ほとんどの開発環境でELF形式(Executable and Linkable Format)が使用されています。Linuxも最近はELF形式を使用しています。これ以外だと、aout形式(昔のLinuxやBSD)、COFF形式(Palmや昔のWindows)、Portable Executable形式(今のWindowsやWinCE)などがあります。またbinutilsはMotorola S-Record Format形式とIntel Hex Format形式を標準でサポートします。このどちらかをターゲットフォーマットにする場合、とりあえずELFにしておくと無難です。

慣れてきたらconfigureの中を見てみると良いでしょう。「へぇ~」と思うようなターゲット名があったりもします。参考までに、私が知ってるターゲット名を下に載せておきます。

ターゲット名意味
sh-hitachi-elf日立 SuperH, ELF(Executable and Linkable Format)
arm-elfARM命令系プロセッサ, ELF
v850-nec-elfNEC V850/V850Eプロセッサ, ELF
m32r-mitsubishi-elf三菱 M32Rプロセッサ, ELF
mips-elfMIPS命令系プロセッサ, ELF
powerpc-eabiPowerPC, EABI(Embedded Application Binary Interface)
powerpc-elfPowerPC, ELF
strongarm-wince-peIntel StrongARM + WindowsCE
i686-pc-linux-gnuLinux (Intel), ELF
i686-windows-peWindows (Intel), PortableExecutable
m68k-palmos-coffPalm (m68k), COFF
mipsel-linux-gnuPS2/Linux, ELF

SuperHやM32Rはベンダ名を見ていないので省略することもできます (sh-elf, m32r-elf)。また、株式会社 ルネサステクノロジ 社に敬意を払って、sh-renesas-elfとかm32r-renesas-elfとかでconfigureするのもアリだと思います。

ソースの展開 と configureの実行

ターゲット名がわかったら、ソースを展開してconfigureスクリプトを実行します。configureスクリプトは、binutilsのさまざまな設定を行うためのスクリプトです。例えば、ターゲット指定によって使用するソースを選んだり、ホストコンピュータのライブラリを調べて使ってよい関数/使えない関数を探したり、またホスト上のツールの有無を調べたりします。configureスクリプトは調べた結果を元に、binutilsを生成するためのMakefileを生成します。

configureのパラメータ設定
ターゲット名--target=
先ほど決めたターゲット名を設定します。
ホスト名--host= (省略 : 今のホストを調べて設定)
ホスト名をさっきのと同じ形式で指定します。省略すると勝手に調べてくれるので、ほとんど場合指定する必要は無いでしょう。
インストール先--prefix= (省略 : /usr/local)
インストール先 (依存部)--exec-prefix= (省略 : 上と同じ場所)
ソースツリーの場所--srcdir= (省略 : "." か "..")
テンポラリ格納先--tmpdir= (省略 : /tmp)
マルチリンガルサポートサポートするサポートしない(--disable-nls)
エラーメッセージが日本語で出るようになりますが、cygwin環境でこれをつけるとおかしくなることが多いです。英語でも困らないなら"disable"にしておくことをお勧めします。
再帰的なconfigureするしない(--norecursion)
サブディレクトリのconfigureを実行しません。BFDライブラリだけとか、gnu-ldだけを作成したい場合ときなどに使用します。
ライブラリの種別スタティックライブラリ(--enable-static [デフォルト]) 共有ライブラリ(--enable-shared)
BFDライブラリや多言語サポートライブラリなどをスタティックライブラリ(プログラム毎に固有なライブラリ)にするか アクレ ブレーキパッド リア ZZC 606 カペラ ファミリア・エチュード ファミリアワゴン/S-ワゴン GFEP BJ3P(AT車) BJ3P(MT車) BJ5P(FF AT車) BJ5P(FF MT車)他、共有ライブラリにするのかを選択します。
リンカの種類ホストのリンカはGNUリンカです(--with-gnu-ld)それ以外です
ホストのリンカとしてGNU LDが使用されている場合、--with-gnu-ldを指定します。GNUのリンカは多機能なので、入っているなら指定しておくと良いでしょう。
64ビットBFDの生成デフォルトのままにする 生成する(--enable-64-bit-bfd) 生成しない(--disable-64-bit-bfd)
64ビット型をサポートするBFDライブラリを作成します。ターゲットのint型よりもホストのint型が小さい場合、指定しておくと良いでしょう。
サブターゲットの指定--enable-targets=
補佐的に利用するターゲット名を指定します。allを指定すると全部のターゲットが有効になりますが、動作しないことが多いです。
configure の パラメータ
--target=arm-elf

一般的に、展開したbinutilsのソースファイルを含むディレクトリのことを「ソースツリー」と呼び、configureを行うディレクトリ以下のことを「オブジェクトツリー」と呼びます。オブジェクトツリーにはmakeの際に生成されるオブジェクトファイルやライブラリ、実行形式などが格納されます。ソースツリーとオブジェクトツリーの頂点は同じ場所でもかまいませんが、大抵の場合は "obj"とか"sh-hitachi-elf"などのディレクトリを作成し、そこでconfigureを行います。こうすることで、複数のターゲットを同じソースツリーから作成することが可能になります (一緒にするとターゲットを変える度に"make clean"で全オブジェクトを消す必要があります)。下にコマンドを載せますので参考にしてください。

~ % tar zxvf binutils-2.13.tar.gz
~ % cd binutils-2.13
~/binutils-2.13 % mkdir arm-elf
~/binutils-2.13/arm-elf % ../configure --target=arm-elf

時々この時点でエラーが出ることがありますが、この時点で出るエラーのほとんどは修正できません。パラメータを変えてみたり、ターゲット名を変えてみたりするのもひとつの手です。またconfigureは過去の結果を覚えているので、過去にconfigureしてあった場合には、一度ディレクトリごと削除して再度configureするのもいいでしょう。とにかくなんとしてでもconfigureは通しましょう。

makeの実行

configureが通ったら、次はmakeです。makeはある一連の作業を自動的に行ってくれるツールです。特に、「アレをするにはコレが必要で、コレをするためにソレが必要」といった依存関係を持つ処理(プログラムのコンパイルとか)を行うときには大変便利です。binutilsのプログラムもmakeを使って生成します。

まず、プログラム全体を生成するために、"make all"を実行します。これは、makeに対して「allというファイルを生成しなさい」という意味になるのですが、慣習としてallは「ユーザが望む全てのプログラム」を指しています (たまにそう書いてないMakefileがありますが...)。TOPPERS/JSPでは"make all"でカーネルプログラム(jsp.binとか)を生成します。binutilsでは、binutilsに内包される全てのプログラム(as, ar, ld, strip, objcopy, objdumpとか)が生成されます。

"make all"の代わりに DUNLOP ダンロップ エナセーブ RV504 ENASAVE ミニバン サマータイヤ 235/50R18 阿部商会 LA STRADA epsilon ホイールセット 4本 18インチ 18 X 7.5 +38 5穴 114.3、ただの"make"でもかまいません。何も指定されなかった場合、大抵は"all"が指定されたと判断されます (正確には最初に出現した依存行が指定されたと思う)。

環境との相性が悪いと、makeは失敗することがあります。私も、cygwinを使っているときはよく怒られました。ここで起こるエラーは大きく分けて3種類あります。

  • 環境が持っているライブラリと整合しない
    (e.g. プロトタイプ宣言と一致しない, そのライブラリ関数はない, そのヘッダファイルはない など)
  • configureがおかしな構成情報を出してしまっている
    (e.g. コンパイラが見つからない, ライブラリがない, そんなファイルはない など)
  • そもそもサポートしてない or 保守されてない
    (e.g. そんな変数はない, 関数の多重定義, 不明な型の指定 など)

configureがおかしい場合の特長は、ツールがないとか関数がないといわれることでしょう。このときは作ったオブジェクトディレクトリを全部消してもう一回やってみるくらいしか思いつきません。古いcygwinだと、環境が持つライブラリとの不一致はよく起ります。このエラーの特長は/usr/includeとか/libとかのファイルに対してエラーが起ることです。プログラムに詳しい方なら、無理矢理ソースを書き直すことで通過させることができます。よく分からない場合は、binutilsのバージョンを下げてみるのも良いでしょう。それでも直らない場合は、環境を変えた方が早そうです。最近のGNUツールはLinux上で開発されているようなので、まずLinux上で試してみて、それでもダメならあきらめましょう。

最後にプログラムをインストールします。プログラムをインストールするには"make install"を実行します。インストール先に/usr/localを指定した場合などは、スーパユーザなど対象ディレクトリに書込み権限を持っているユーザになってから実行しましょう。

最後に、"arm-elf-objdump --help"などを実行してちゃんとインストールされていることを確認しましょう。これで作業はお終いです。


使ってみよう

objdump : オブジェクトの情報を色々と表示してみたりする

objdumpは「便利だけれども使いたくないツール」のひとつです。なぜかというと、objdumpが出力する情報を積極的に利用する状況は、デバッグをしているとき(それも結構複雑な状況)だからです。「ELFを読めない開発ツール」とか「モトローラSレコードしか読めない頑固なツール」とか「デバッグ情報だけを読み込めず無理にでもROMに書き込もうとする健気なツール」と立ち向かわないといけない場合、objdumpを使って脳内シンボリックデバッガを起動することになります。

objdumpは、次のオプションの中からひとつ以上を選んで、ファイル名をつけて起動します。下に私がよく使うオプションだけを載せておきます。他にもいくつかあるので、詳しくはヘルプを見てください

オプション説明
-h, --[section-]headersセクションヘッダ情報を表示します。どんなセクションを含んでいて、

、それがどこから始まって、どのくらいの大きさなのかを調べることができます。
-d, --disassemble実行可能なコードを含んでいるセクション(大抵の場合 .text)を逆アセンブルした結果を表示します。
-D, --disassemble-allデータセクションであっても逆アセンブルします。
-t, --symsシンボル情報を表示します。
-S, --source逆アセンブルコードを元ソースと対比させて表示させます。
-H, --helpヘルプを表示します。
ここから下はデバッグに詳しい人向け
-g, --debuggingデバッグ情報を表示します。
-G, --stabsスタブ情報を表示します。型のサイズや構造体情報などまで取れます。

例えば、TOPPERS/JSPのカーネルを逆アセンブルしたいときには"arm-elf-objdump -D jsp"とやればOKです。Makefileの中に"arm-elf-objdump -h -S jsp > asm"とか"arm-elf-objdump -h -D jsp > asm"とかやっておくと結構参考になります (個人的はこの情報を使ってデバッグするような状況は... ちょっと... )。

objdumpがサポートするターゲット名一覧を見たい場合、"arm-elf-objdump --help"を実行すると、最後に"objdump: supported targets: elf32-xx elf32-xxl srec ihex"とか表示してくれます。srecとihexはほとんどのターゲットについていて、srecはモトローラSレコードフォーマットを示し、ihexはインテルヘキサフォーマットを示しています。両方ともバイナリ形式のロードモジュールを、テキスト形式で表現してくれます。シリアル経由でモニタに直接ダウンロードさせるときに使うフォーマットです。

objcopy : オブジェクトファイルの中身を色々いじってみたりする

objcopyはターゲットがシンプルなほど使用頻度が上がるツールです。何をするものかというと、リンカが生成したロードモジュールを含んだオブジェクトファイルのフォーマットをELFやモトローラSレコードに変更してみたり、特定のセクションを削除してみたりといったことができます。これを使うことで、「このデバッガは~フォーマットしか読めません」とか「この実行ファイルはおかしなセクションを含んでいます」などといったエラーを出す頑固親父風デバッグツールや、「そもそもモニタしかないのですが...」といったご愁傷様度の高い環境で、自分の作ったプログラムを実行するためのさまざまな修正を行うことができます。

下にやりたい事に対する実行オプションの一覧を載せておきます。

ここから下は詳しい人向け

ファイルフォーマットを変更したい (-F bfdname)
使い方objcopy -F <オブジェクトファイルフォーマット名> <入力ファイル> <出力ファイル>
objcopy -F srec module.elf module.srec (module.elfをモトローラSレコード形式に変更してmodule.srecに出力)
補足変更先フォーマットによっては変更できなかったり、情報が落ちたりします。例えばモトローラSレコード形式はシンボル情報が消えます。またELFからCOFFに変更すると、COFFで表現できないセクションが消えます (or 警告)。
bfdnameって何ですか?」という方は、arm-elf-objdump --helpを実行してください。最後にサポートするターゲット名(bfdname)一覧が出ます。
デバッグ情報を消してファイルを小さくしたい (-g, --strip-debug)
使い方objcopy -g <対象ファイル>
objcopy -g module (moduleに含まれている実行に関係ないセクションを落とします)
特定のセクションをファイルから消したい (-R section)
使い方objcopy -R <対象セクション名> <対象ファイル>
objcopy -R .stabs module (moduleの.stabsセクションを削除します)
特定のセクションだけを残したい (-j section)
使い方objcopy -j <対象セクション名> <対象ファイル>
objcopy -j .data module (moduleの.dataセクションだけを残し、他を削除します)
ロード先のアドレスを変更したい (--change-section-lma section {=|+|-} address_or_offset)
使い方即値: objcopy --change-section-lma <対象セクション名>=<対象アドレス> <対象ファイル>
相対: objcopy --change-section-lma <対象セクション名>+<オフセット> <対象ファイル> (-もできます)
objcopy --change-section-lma .data=0x10000000 module (moduleの.dataセクションを0x10000000番地にロードするようにします)
セクションの実行時アドレスを変更したい (--change-section-vma section {=|+|-} address_or_offset)
使い方即値: objcopy --change-section-vma <対象セクション名>=<対象アドレス> <対象ファイル>
相対: objcopy --change-section-vma <対象セクション名>+<オフセット> <対象ファイル> (-もできます)
objcopy --change-section-vma .data+0xa0000000 module (SHでいうと、データセクションをU0領域からP1領域へ移動します)
補足VMAを変更してもシンボルのアドレスは変化しないので、これを変更しただけではプログラムは正しく動かないのです (位置非依存コードを除く)。大抵は、ユーザ用アドレス空間用でリンク(アドレス解決)したモジュールを特権空間上で初期化するときとかに使ったりします。
シンボルの先頭につく余計な"_"を取り除きたい (--remove-leading-char)
使い方objcopy --remove-leading-char <対象ファイル>
objcopy --remove-leading-char module (moduleのシンボル名の"_"が消えます)
補足--change-leading-charで戻せますが、どんな文字がつくかはフォーマット次第です (好きな文字列にはできません)。
セクション属性を入れ替えたい (--set-section-flags section=attribute[,attribute...])
使い方objcopy --set-section-flags <対象セクション名>=<","で区切ったセクション属性の列> <対象ファイル>
objcopy --set-section-flags .sharedconst=alloc,contents,readonly module (moduleのセクション.sharedconstを、読出し専用データセクションとして設定します)
補足attributeに使えるのは、alloc(メモリ領域を必要とする)、contents(セクションデータを持つ)、readonly(読出しのみ)、code(データは命令である)、data(データは普通のデータ)、never_load(ターゲット上に配置しない)、debugging(デバッグ情報)など。変更ではなく設定なので、前の状態が残ったりはしません。例えば".data=readonly"とやると、contentsが消えるので中身がなくなり、allocもなくなるので配置されなくなります。CODEとDATAはハーバードアーキテクチャのプロセッサとかMMUとか使ってるときには重要で、設定をミスるとアドレス例外とか保護違反とかで暴走しちゃったりします。
シンボル名を変更したい (--redefine-sym old=new)
使い方objcopy --redefine-sym <前のシンボル名>=<新しいシンボル名> <対象ファイル>
objcopy --redefine-sym data_start=ram_start module (moduleのシンボル名data_startの名前をram_startに変更します)
補足古いシンボルが消えるので、リンク前のオブジェクトに実行するときには要注意。

GNU Compiler Collection (gcc)

Was ist der GNU Compiler Collection?

gccは、C言語処理系の中核をなす「コンパイラ」です。コンパイラはトランスレータ(変換機)の一種で、「ある言語仕様で記述されたプログラムを、別の言語仕様で表記しなおすプログラム」を指します。gccは、C言語プログラムを、ターゲットプロセッサのアセンブリ言語プログラムに変換する役目を負っています。

今のgccは、GNU C Compilerの略ではなく、GNU Compiler Collectionの略だそうです。以前、査読者Aにバカにされて一発で覚えました。確かに今のgccが扱える言語は洒落にならないほど増えています。ざっとあげると 【送料無料】inno システムキャリアセット IN-SUT+K425+IN-B127 VOLKSWAGEN アップ 5ドアハッチバック H24.10~ AA系 カーメイト(CARMATE) [自動車 ルーフキャリア フット/バー/ホルダー]、「C言語」「C++言語」「Java」「Objective C」「Fortran 77」が処理でき、少し手を加えれば「Ada」「Pascal」などもコンパイルできます。

gccはフリーソフトウェアであるため、さまざまな実験の対象にされてきました。特に最適化の研究をしている人は結構な割合でgccをいじっています。このように、多くの人間が同じプログラムを保守することで、性能面でも結構いいものになっています(※)。「独自でコンパイラを作ろうとしたがgccに勝てず、結局gccをバンドルして売った」という話もあります。一方で、誰も保守責任を持っていないので、コンパイラ自身のバグを踏む可能性もあります。全ては自己責任です。

(※) gccはアセンブリ言語化した後の最適化が弱く、またC言語レベルの最適化がアセンブリ言語の特性を考えていない。それなりにチューニングされた依存部でなければ、半導体メーカ純正コンパイラの方が性能が上のケースが多いのではと推測する。

make gcc

下準備

gccをビルドする前に、いくつか下準備が必要です。

  • ターゲット名
    gccをビルドする場合にも、binutilsと同じようにターゲット名が必要になります。ターゲット名に関しては 、binutilsのところの説明を参考にしてください。
  • 標準ライブラリ
    C言語標準ライブラリを使用する場合には、この標準ライブラリを用意する必要があります。標準ライブラリにはいくつかの実装があり、有名どころには、「GNU glibc」「Redhat newlib」などがあります。不要な場合は別になくてもいいです。

ソースの展開 と configureの実行

下準備が済んだら、ソースを展開します。標準ライブラリを拾ってきた方は、それも展開しておきます。

続いて スバル フォレスター グリルガード VANGUARD 09-13 SUBARU FORESTER FRONT BULL BAR BUMPER PROTECTOR GRILL GUARD S/S VANGUARD 9月13日スバルフォレスターFRONT BULL BAR BUMPER PROTECTOR GRILL GUARD S / S、binutilsと同様にconfigureスクリプトを実行します。binutilsに比べて項目数が多いですが、大半はデフォルト値のままでOKです。

configureのパラメータ設定
ターゲット名--target=
binutilsと同じターゲット名を設定します。
ホスト名--host= (省略 : 今のホストを調べて設定)
ホスト名をさっきのと同じ形式で指定します。省略すると勝手に調べてくれるので、ほとんど場合指定する必要は無いでしょう。
インストール先--prefix= (省略 : /usr/local)
インストール先 (依存部)--exec-prefix= (省略 : 上と同じ場所)
インストール先 (ライブラリ)--libdir= (省略 : '--prefixで指定した場所'/lib)
ソースツリーの場所--srcdir= (省略 : "." か "..")
テンポラリ格納先--tmpdir= (省略 : /tmp)
g++ヘッダファイルの置き場--with-gxx-include-dir=
C++言語を使用する際、C++言語ライブラリのヘッダファイルのある場所を指定します。
デバッグをDWARFでやるDWARFで行う(--with-elf)ターゲットの標準設定にあわせる
デバッグ情報をDWARFフォーマットで出力するようになります。特に指定する必要は無いと思いますが、DWARFフォーマットしか食わないデバッガを使っているときに必要です (gccのオプションでも変更できます)。
DWARF2を使うDWARF2で行う(--with-dwarf2)ターゲットの標準設定にあわせる
マルチバイト文字の使用使う(--enable-c-mbchar)使わない
マルチバイト文字(要するに日本語)が使えるようになります。cygwin上なら付けておくことを強くお勧めしたいです。
スレッドを使う使う(--enable-threads)ターゲットの標準設定にあわせる使わない (--disable-threads)
「gccがスレッドを使用するようになります」という説明がついていますが、何が起こるのかよく分かりませんし、何が起こっても責任はもてません。
使用するスレッドライブラリ--enable-threads=
gccが使用するスレッドライブラリを指定します。
マルチリンガルサポートサポートするサポートしない(--disable-nls)
エラーメッセージが日本語で出るようになりますが、cygwin環境でこれをつけるとおかしくなることが多いです。英語でも困らないなら"disable"にしておくことをお勧めします。
再帰的なconfigureするしない(--norecursion)
サブディレクトリのconfigureを実行しません。BFDライブラリだけとか、gnu-ldだけを作成したい場合ときなどに使用します。
ライブラリの種別スタティックライブラリ(--enable-static [デフォルト]) 共有ライブラリ(--enable-shared)
BFDライブラリや多言語サポートライブラリなどをスタティックライブラリ(プログラム毎に固有なライブラリ)にするか、共有ライブラリにするのかを選択します。
リンカの種類ホストのリンカはGNUリンカです(--with-gnu-ld)それ以外です
ホストのリンカとしてGNU LDが使用されている場合、--with-gnu-ldを指定します。GNUのリンカは多機能なので、入っているなら指定しておくと良いでしょう。
64ビットBFDの生成デフォルトのままにする 生成する(--enable-64-bit-bfd) 生成しない(--disable-64-bit-bfd)
64ビット型をサポートするBFDライブラリを作成します。ターゲットのint型よりもホストのint型が小さい場合、指定しておくと良いでしょう。
サブターゲットの指定--enable-targets=
補佐的に利用するターゲット名を指定します。allを指定すると全部のターゲットが有効になりますが、動作しないことが多いです。
configure の パラメータ
--target=arm-elf

(※ このリストももう少し整理します)

configureのパラメータを決めたら、オブジェクトディレクトリを掘ってconfigureを実行します。標準ライブラリが必要な場合は、この時点で一緒に展開しておきます。

~ % tar zxvf gcc-3.3.tar.gz
~ % tar zxvf newlib-1.11.0 (※必要な人だけ)
~ % cd gcc-3.3
~/gcc-3.3 % mkdir arm-elf
~/gcc-3.3/arm-elf % ../configure --target=arm-elf

makeの実行

configureが正しく通過したら、次はmakeです。

gccの場合、ネイティブコンパイラ(ホスト=ターゲット)とクロスコンパイラ(ホスト!=ターゲット)の場合で、makeにつけるオプションが違います。

makeの指定の違い
ネイティブコンパイラの場合% make all (または、単にmake)
クロスコンパイラの場合% make cross

私もmake allとmake crossの違いは何かをはっきり知っているわけではないですが、ライブラリの作り方がちょこっと変わってくるのと、

【2017年製 17週以降】265/40R21 (105Y) XL B【ピレリ ピーゼロ ラグジュアリー】【PIRELLI NEW P ZERO LUXURY NCS PZ4】【Bentley承認】【新品】

、ネイティブよりかクロスのほうが手順が少なくなるようです。

(※ この後に cygwin環境でよく出るビルドエラーとその対策なんかを書いていきます)

{yahoojp} {ertl.jp}
{yahoojp}jpprem01-zenjp40-wl-zd-83640