isLandcenter 非番中

ブログトップ | ログイン

openSUSE15.2 x86-64 環境でARMのクロスコンパイル

Apple M1 シリコン mac で脚光を浴びてしまった ARM アキテクチャ。「これからは ARM の時代かも」なんちゃってです。

という事で openSUSE 15.2  x86-64 環境でどこまで ARM の開発環境、エミュレーション、仮想化などができるか調べてみました。

はじめは

「Linux の x86-64 環境で ARM の仮想環境作れないかなぁ」

という不純な動機だったのですが、どうも KVM なんかで動く ARM のイメージなんてないわけですね。で色々調べてみたら、クロス開発環境や、バイナリのエミュレーションはできるらしい。ほとんどの情報は Ubuntu 上でのクロス開発環境なんですが、これ openSUSE でできないかという課題です。

昔、マイコン機器を開発してた頃は、クロス開発で、x86 のC言語を Sparc でクロス開発していました。実に快適でした。実機だと1時間かかる「コンパイルとリンク」がわずか一分で終わってしまう。コーヒーとトイレに行こうと立ち上がった時には終わっている。感動というかのんびりした時代も終わったナ、と呆れたというかでした。

ARM の実機上で開発するとなると、いろいろな実機の制限や非力な実機スペックでは中々開発も難しい。となると一般的な x86-64 PC 上でクロス開発する方が色々と都合がよろしいンでしょう。少なくとも、コードとドキュメントを書いて、コンパイルとリンクまではパワーのある Intel PC ワークステーション上で行い、実機なり ICE なりにバイナリを転送してデバックする。という事です。

当たり前かな、と思ったのですが意外と情報が少なかったので苦労しました。皆さんどうやって ARM の開発環境つくっているんでしょうか。まぁ参考までに openSUSE 15.2 でどこまでできるか、あまり開発系には詳しくない素人なので入門です。他のディストリビューションを使っている方にも参考になれば幸いです。

ー クロスコンパイラのインストール

software.opensuse.org へ行って cross-arm-linux-gnueabi-gcc パッケージを検索します。ここにありました。

cross-arm-linux-gnueabi-gcc

Expert Download のリンクを開きます。

openSUSE15.2  x86-64 環境でARMのクロスコンパイル_a0056607_10063840.png

Add repository and install manually にあるコマンドを実行します。

openSUSE15.2  x86-64 環境でARMのクロスコンパイル_a0056607_10071171.png

そのままだと余計な SLE のリポジトリも追加しようとしてエラーが出ましたが、無視してリポジトリをインストールします。

ー cross-arm-linux-gnueabi-gcc をインストール

zypper addrepo https://download.opensuse.org/repositories/home:duwe:crosstools2/openSUSE_Leap_15.2/home:duwe:crosstools2.repo
zypper refresh

Zypper かYast でインストールできます。

# zypper install cross-arm-linux-gnueabi-gcc

YaST の場合

# yast2 & もしくは
# yast

から Software Management で ”cross” などをキーワードサーチしてインストールします。

openSUSE15.2  x86-64 環境でARMのクロスコンパイル_a0056607_10074212.png


SUSE では /opt/cross にインストールされます。

opensuse152:~/test # ls /opt/cross/arm-linux-gnueabi -al
total 0
drwxr-xr-x 1 root root  64 Dec  8 13:26 .
drwxr-xr-x 1 root root 136 Nov  6 03:45 ..
drwxr-xr-x 1 root root  92 Dec  6 20:20 bin
drwxr-xr-x 1 root root   6 Dec  6 20:20 include
drwxr-xr-x 1 root root 532 Dec  6 20:20 lib

ー stdio.h: No such file or directory となる

まずは「はじめてのC」を書きます。

opensuse152:~/test # cat test.c
#include <stdio.h>
int main()
{
        printf("Hello World\n");
        return(0);
}


コンパイルしてみます。

opensuse152:~/test # /opt/cross/bin/arm-linux-gnueabi-gcc -o armhello test.c
test.c:1:10: fatal error: stdio.h: No such file or directory
   1 | #include <stdio.h>
     |          ^~~~~~~~~
compilation terminated.
opensuse152:~/test #


いきなり致命的な faital error です。

-v オプションを付けてコンパイルして「コンパイル中」の内容の詳細(verpose)をチェックします。stdio.h を探すと、ありました。どうもうまく見つけられない様です。


/opt/cross/arm-linux-gnueabi/include/c++/9.3.0/tr1/*


/opt/cross/arm-linux-gnueabi/include/c++/9.3.0/

に強引にコピー(cp)しました。


ー cannot find crt1.0: No such file or Directory ライブラリがない

インクルードヘッダファイルはコピーして一応通りましたが、リンクができません。 「crt1.o が見つからない」となります。どうも glibc が必要らしい、という事で arm 用の glibc ライブラリをインストールしました。ブラウザで software.opensuse.org へ行き、1クリックインストールします。

cross-arm-linux-gnueabi-glibc

openSUSE15.2  x86-64 環境でARMのクロスコンパイル_a0056607_10084733.png

1クリックインストールできなかったので YaST > Software Management から "glibc" を探して arm 用の glibc をインストールします。

openSUSE15.2  x86-64 環境でARMのクロスコンパイル_a0056607_10142147.png


opensuse152:~/test # find /opt/cross/ -name "crt1.o"
/opt/cross/arm-linux-gnueabi/sys-root/lib/crt1.o
opensuse152:~/test #


インストールされた様です。

opensuse152:~/test # /opt/cross/bin/arm-linux-gnueabi-c++ test.c -o test
test.c: In function ‘int main()’:
test.c:4:2: error: ‘printf’ was not declared in this scope
    4 |  printf("Hello World\n");
      |  ^~~~~~
test.c:2:1: note: ‘printf’ is defined in header ‘<cstdio>’; did you forget to ‘#include <cstdio>’?
    1 | #include <stdio.h>
  +++ |+#include <cstdio>
    2 | int main()
opensuse152:~/test # ls -al test
-rwxr-xr-x 1 root root 7976 Dec  8 13:33 test
opensuse152:~/test #

相変わらず、ヘッダファイルの警告は出ますが、リンクまで通った様です。
バイナリの中身を確認します。

opensuse152:~/test # file test
test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 3.2.0, not stripped
opensuse152:~/test #


ARMのバイナリができました。


ー qemu-arm を openSUSE にインストール

結論から言うと挫折しました。

しかし、一応 openSUSE のリポジトリに qemu-arm があるのでインストールはできます。

openSUSE15.2  x86-64 環境でARMのクロスコンパイル_a0056607_10145571.png

openSUSE:Leap:15.2:Update プロジェクト提供の qemu-arm

openSUSE15.2  x86-64 環境でARMのクロスコンパイル_a0056607_10155210.png


opensuse152:~/test # qemu-system-arm --version
QEMU emulator version 4.2.1 (openSUSE Leap 15.2)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
opensuse152:~/test #
opensuse152:~/test # qemu-system-arm -M ?
Supported machines are:
akita                Sharp SL-C1000 (Akita) PDA (PXA270)
ast2500-evb          Aspeed AST2500 EVB (ARM1176)
ast2600-evb          Aspeed AST2600 EVB (Cortex A7)
borzoi               Sharp SL-C3100 (Borzoi) PDA (PXA270)
canon-a1100          Canon PowerShot A1100 IS
:
: 以下略
:
opensuse152:~/test #


29.2 General qemu-system-ARCH Options


qemu-system-arm • helpQEMU emulator version 2
https://helpmanual.io/help/qemu-system-arm/

どうも、エミュレーションに必要な、大量のパラメータが必要な様です。詰まった!

ここで挫折。

ー まとめ

x86-64 環境で。ARM のバイナリを動かせないか?という切り口から、なぜか「クロス開発なら openSUSE でもできる!」というオチになり、目標のバイナリエミュレーションまでには至らずでした。

しかし、ARM 以外にもクロス開発環境は豊富にありました。流石に z80 は有りませんが、PowePC  から m68k まで揃っています。なるほどオープンソースって面白いなと改めて感じさせられました。

クロス開発環境は Debian/ubuntu 系が強いようですが openSUSE もできる訳ですね。ただし情報が少ないのが難点です。










タグ:
by islandcenter | 2020-12-09 10:01 | SUSE | Comments(0)