Raspberry Piのクロスコンパイル環境構築(その2)
PCから仮想環境へアクセス
前回の第5話まででVirtual BoxにUbuntu Severをインストールして起動しログインまで確認できました。ここでは、その時に使用したVirtual Boxのウィンドウで直接キー入力をするのではなく、Windowsの汎用的は通信ソフトを使って仮想環境にアクセスし、そこからいろいろとコマンドを実行していきたい思います。ここでも第4話で使用した「Tera Term」を使用してみたいと思います。
その前にアクセス先のIPアドレスを確認します。ログインしたVirtual Boxのウィンドウで以下を入力します。
ip addr
上記のオレンジで囲った箇所がアクセス先のIPアドレスになります。私の環境では「192.168.56.107」
が割り当てられたことがわかります。この少し上に表示されている「enp0s8」というのは仮想環境上の仮想ネットワークカード1つになります。第5話の仮想ハードウェアの設定の際にホストオンリーアダプタとして割り付けたものになります。この仮想ネットワクカードに対してPCからアクセスすることになります。
ちなみに、この時点ではネットワーク関連でよく使用される「ifconfig」コマンドはインストールされていませんでした。上記の上の方に表示されてますが「net-tools」をインストールするようにメッセージが出ています。今回のUbuntuインストールの際には追加のインストールパッケージは1つも選択しなかったので最小限のものしかインストールされていないようです。
次に「Tera Term」を起動します。
PCによっては「シリアル(E)」が選択されているかもしれませんが、その時は上の「TCP/IP」を選択します。そして「ホスト(T)」に先ほど調べたIPアドレスを入れます。「サービス」は「SSH」を選びます。そうすると「TCPポート#(P)」は自動で「22」が入ります。この状態で「OK」をクリック。
ここでは「ユーザー名」と「パスフレーズ」にそれぞれ仮想環境でログインしたときの「ログイン名」と「パスワード」を入力します。そして「OK」をクリック。
無事ログインできました。
コンパイル環境の確認
まずは、クロスコンパイルの環境以前に、そもそも仮想環境上に自分自身のコンパイル環境(セルフコンパイル環境)がインストールされているか確認してみます。C言語で書かれたソースコードをコンパイルする為の「gcc」はインストールされていないようです。
そこで、以下を入力してインストールを行います。インストールされていないコマンドを入力すると、インストールの為のコマンドまでメッセージで表示してくれるのでとても親切ですね。
sudo apt install gcc
パスワードを聞かれるのでログイン時のパスワードを入力します。
インストールを続けると150MBくらいハードディスクを使うが良いか?と聞かれるので「Y」キーを押してEnterで進みます。
30秒くらいでインストールが終わりました。以下を入力してgccのバージョンを調べることでgccがインストールされたか確認します。
gcc -v
いろいろと情報が表示されましたが、一番下にバージョンが表示されています。9.4.0のようです。常に最新がインストールされるようです。また、上から7行目辺りに「Target」という項目があり「x86_64-linux-gnu」となっています。私のPCのCPUはインテルのCore-i5というもので、この場合「x86-64」になります。今回クロスコンパイルのターゲットとしているRaspberry PiのCPUはARMというものでTargetが「aarc64」となります。この辺りを後ほどクロスコンパイル環境をインストールした後に確認してみたいと思います。
せっかくなので何かコンパイルしてみます。ファイル編集用の「vi」コマンドは使えるみたいですので、これでhello_x86.cというファイルを作って「hello」を表示するプログラムを書いてみます。
上記を書いて保存し閉じます。その後は以下のコマンドでコンパイルします。
gcc -o hello_x86 hello_x86.c
「-o」の後に、コンパイルにより生成する実行ファイル名を入力します。その後にコンパイルするファイル名を入力しEnter。
実行するには実行ファイル名の前に「./」をつけます。これは「このフォルダ」という意味で、実行ファイルがこのフォルダにあるということをOSに知らせる為のものです。
「hello」と表示されました。うまくいったようです。
クロスコンパイル環境のインストール
Raspberry Pi用のクロスコンパイル環境はいくつかあるようですが、2022/4/18時点で私が試してうまくいったものを書いていきます。
sudo apt install g++-aarch64-linux-gnu qemu-user-binfmt
パスワードを聞かれるのでログイン時のパスワードを入力します。
インストールを続けると327MBハードディスクを使うが良いか?と聞かれるので「Y」キーを押してEnterで進みます。
1分程度でインストールが終わりました。今回も同様にバージョンを調べることでインストールされたか確認します。クロスコンパイルのコマンドは「gcc」ではなく「aarch64-linux-gnu-gcc」になります。
aarch64-linux-gnu-gcc -v
上から5行目辺りの「Target」が予想通り「aarch64-linux-gnu」になっています。これでRaspberryPi用にコンパイルできそうです。バージョンはgccのものが表示されています。念のため、「–version」を引数で確認してみます。以下のように、何れも9.4.0であることが確認できました。
クロスコンパイル環境でコンパイル
それではさっそくお試しクロスコンパイルをしてみたいと思います。プログラムは先ほどの「hello_x86.c」をそのまま使用します。コマンドは「gcc」ではなく「aarch64-linux-gnu-gcc」になるので以下のように入力します。
aarch64-linux-gnu-gcc -o hello_aarc64 hello_x86.c
実行ファイルはできたようです。ARM用の実行ファイルなのでこの環境では実行できないと思いますが、試しに実行してみます。
予想通り実行できませんでした。少し踏み込んで、aarch64用とx86_64用のファイルの違いをファイルの情報を簡易的み見ることができる「file」コマンドを使ってみてみましょう。
それぞれaarch64、x86_64のキーワードが見られます。
今回はRaspberryPi用のクロスコンパイル環境の構築及びお試しコンパイルを実施しました。次回(第7話)はここで生成したaarch64用の実行ファイルをRaspberryPi上で実行できるか確認する予定です。
コメント