ちょっとした疑問、ABIとEABIと表示されるダウンロードパッケージはどちらを選べばいいのか迷ったので調べてみたことをご報告です。
調べてみたもののちょっと専門外な知識が多かったので、ざっくりとしか理解できませんでした。ただざっくりしている分、初心者向けかも。
発端
SoftEther VPN 4.42 Build 9798 RTMが去る2023年6月30日にリリースしました。
前回のRTMリリースから珍しく間隔がそれほど空いていないバージョンアップとなっています。
変更内容が、脆弱性を修正したセキュリティアップデートのような位置づけなので、従来のbetaリリースとせずRTMリリースにしたんだろうなと解釈しました。
公式のバージョン更新履歴:<https://ja.softether.org/5-download/history>
脆弱性自体はそれほどリスクが高いものではないものの、バージョンアップ自体はできるだけ早目に適用しておきたいものです。バージョンアップの検証を始めるためにさっそくダウンロードしてみることにしました。
疑問
SoftEtherのダウンロードをする時に、ARM32ビット版のコンポーネント選択時「ARM legacy ABI(32bit)」と「ARM EABI(32bit)」の二種類がある。使うのはどっちなのかを判断する必要があります。
Raspberry PiはプロセッサがARMでかつ旧Raspbianからアップグレード(dist-upgrade)しているOSなので、上記の選択肢がどちらになるのかは気になるところです。
どっちを使えばいいのかを判断したい、ということで調べて見ることにしました。
対象は、Raspberry Pi 3で旧Raspbianをdist-upgradeを何回か実施してRaspberry Pi OSの32ビット版が稼働している環境となります。
そもそもABIってなんだろう?
ABIはアプリケーションバイナリインターフェースの略で、アプリのプログラム部分とOSなどのシステムの間で動作するインターフェースを指すようです。
EABIは通常のABIと相違して、プログラム内で特権命令を使用することが許可されていることがABIとの違いとして挙げられていることが多いようです。
プログラマではないので、この辺は詳しくは理解できていないのですが、ABIは正式にはOABIと呼称されていて、これはOldの「O」らしい、EABIは「Embedded」の「E」が略されて付加されていることのよう。ABI=OABIということで古い方、EABIは(記事現在では)新しい方、という考え方でよさそうです。
Debianでは
ディストリビュータのDebianでは以下のように分類されています。
・arm : legacy ABI
・armel: EABI
前述のOABIに該当するのが「arm」で、EABIが「armel」ということなので、それぞれ該当する方を使うということでよさそうです。
そういや、Debianのインストールイメージをダウンロードするときにアーキテクチャの選択をするのですが、ARM用のインストールイメージは「arm64 / armel / armhf」の三種類を選択するリンクがありました。通常のDebianではOABIを使うarmということは滅多になくて、EABIが使われるarmelが使われていることがほとんどと考えて良いようです。
Raspberry Piで
Raspberry Piでuname -mで確認してみると、
armv7l
と表示されました。
これは以前<RaspberryPi3は64ビットCPUで32ビットOSを動かす - treedown’s Report>にみたときと同じ、「armv7l」(ARMv7 Little Endian)でハードウェアが64ビットプロセッサなのですが、OSは32ビットのRaspberry Pi OS(旧Raspbian)しか提供されていないから、アプリケーションも32ビット版を使う、という結論でした。
Raspberry PiはEABI
DebianベースではLenny(ver.5)以降でarmel=EABIが提供されていたことを考えると、それ以降にリリースとなったRaspberry PiもEABI対応と考えて良さそうです。
と、いう以前<RaspberryPi3は64ビットCPUで32ビットOSを動かす - treedown’s Report>でもちゃんとEABI版である「softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-arm_eabi-32bit.tar.gz」をDLして使っていました。(※少なくともRaspberry Pi 2以降は全てEABIで動作します。それ以前のRaspberry Piは持っていないので確認していませんが)
旧バージョンであるlegacy ABI=OABIはかなり古いアーキテクチャで稼働するディストリビューション用の互換性維持のための提供と考えて良さそうです。