前回アセンブラソース生成で止める gcc の -S オプションを使ってみました。今回はオブジェクトファイル生成で止める -c オプションを使ってみます。Makefileの中とかでよく見るアレです。日頃お世話になっている気がする割にはどんなオブジェクトファイルが出来ているのか意識して見てないデス。たまには確認しておけと。
※「オプション沼」投稿順 index はこちら
今回は、異なる環境の5バージョンの gcc で同じコマンドラインでオブジェクトファイルを生成してみました。何も言わずに gcc でセルフ開発用のコンパイラを起動できる場合は、以下のコマンドラインです。例によって前回同様の アッカーマン関数を計算する ackermann.c をテストに使っています。
$ gcc -c ackermann.c
1件、Armマイコンのクロス開発用のコンパイラも使ってみています。その場合は、コマンドラインは以下です。本当はRISC-V用のクロスコンパイラとか、ESP32用とかいろいろやると良いかも知れないけれど、メンドイっす。Arm1つでお茶を濁すっと。
$ arm-none-eabi-gcc -c ackermann.c
全てのケースで同じ名前の出力ファイル ackermann.o を得ます。このオブジェクトファイルの形式を調べる方法は以下としました。
$ file ackermann.o
さて、いかが相成りますか。そんなスペクタクルな結果になる筈がないのですが。
WSL2(Windows11)上のUbuntu 20.04LTSの場合
上記環境で、何も言わずに使用できるセルフ開発向けのgccは、gcc 9.4.0でした。これを使ってコンパイルした結果をみると以下のようでした。
LinuxなのでELFフォーマット、64bit環境用のx86_64。当たり前か。
MSYS2(Windows11)の場合
WSL2はWindows11上の仮想マシン上でホンマのLinuxが走っていますが、MSYS2の場合は、Windows11のOS上に直にgccが載ってます。使えるgccのバージョンはgcc 12.2.0と上記のバージョンより新しいです。結果は以下に。
WindowなのでフォーマットはCOFFでした。勿論 Intel amd64用。
Raspberry Pi 4 model B、Raspberry Pi OS Bullseye(64bit)の場合
ラズパイOSもLinuxです。こちらは64ビット環境を使用。セルフ開発用のgccのバージョンは gcc 10.2.1 でした。
当然オブジェクトフォーマットはELF。しかしアーキテクチャはARM aarch64です。
同OS環境にラズパイPico用にインストールしてある、マイコン用クロスコンパイラ arm-none-eabi-gcc 8.3.1でコンパイルした場合は以下のようです。
32ビットのArmへのクロスなので、ELFも32ビット版です。EABI5とな。
Raspberry Pi 3 model B+、Raspberry Pi OS(Raspbian) 32bitの場合
こちらはラズパイ3にインストールしてある32ビットOS上です。セルフ開発用のgccは、gcc 8.3.0とな。先ほどのクロスコンパイラのバージョンと近いのでないかい。
結果もクロスコンパイラと同じ、32ビットのELF、EABI5。
まったく波乱はなかったデス。同じ -c オプションといってもできるファイルはいろいろと。当然ちゃ当然なんだけれども。