オプション沼(6) gccに-cオプション、できるファイルはいろいろなのよ。

Joseph Halfmoon

前回アセンブラソース生成で止める gcc の -S オプションを使ってみました。今回はオブジェクトファイル生成で止める -c オプションを使ってみます。Makefileの中とかでよく見るアレです。日頃お世話になっている気がする割にはどんなオブジェクトファイルが出来ているのか意識して見てないデス。たまには確認しておけと。

今回は、異なる環境の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でした。これを使ってコンパイルした結果をみると以下のようでした。Ubuntu2004_gcc9_4_0

LinuxなのでELFフォーマット、64bit環境用のx86_64。当たり前か。

MSYS2(Windows11)の場合

WSL2はWindows11上の仮想マシン上でホンマのLinuxが走っていますが、MSYS2の場合は、Windows11のOS上に直にgccが載ってます。使えるgccのバージョンはgcc 12.2.0と上記のバージョンより新しいです。結果は以下に。MSYS2_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 でした。RaspberryPiBullseye_gcc_10_2_1

 

当然オブジェクトフォーマットはELF。しかしアーキテクチャはARM aarch64です。

同OS環境にラズパイPico用にインストールしてある、マイコン用クロスコンパイラ arm-none-eabi-gcc 8.3.1でコンパイルした場合は以下のようです。RaspberryPiBullseye_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とな。先ほどのクロスコンパイラのバージョンと近いのでないかい。RaspberryPiBuster_gcc_8_3_0

結果もクロスコンパイラと同じ、32ビットのELF、EABI5。

まったく波乱はなかったデス。同じ -c オプションといってもできるファイルはいろいろと。当然ちゃ当然なんだけれども。

オプション沼(5) gccに-Sオプションつけて、アセンブラ出力を愛でてみる へ戻る

オプション沼(7) gccに-staticオプション、できたファイルはデカいのよ。へ進む