続・玩式草子 ―戯れせんとや生まれけん―

第14回 Days of WINE and Struggles[1]

この記事を読むのに必要な時間:およそ 5.5 分

Plamo-7.xでは,メンテナンスの手が回らない等の理由で,対応機種を64ビット版x86-64CPUに限定し,32ビットなx86CPUへの対応を打ち切りました。

ここ10年ほどの間に発売されたx86系のCPUは,組み込み向けや超省電力版といった特殊用途を除き,ほぼ全て64ビット版のx86-64になっているので,中古PCをPlamo Linuxで再生しよう,という場合でも,たいてい64ビット版のみで間に合います。

しかし,一部メーカのプリンタドライバなどではLinux用には32ビット版しか提供されていない場合があり,それらを使うためにはPlamo-6.xの32ビット版glibcを流用するなどの細工が必要になります。そのためPlamo-7.xが軌道に乗ったころから,基本的なツールだけでも32ビット版を用意しようか,と考えていました。

しかしながら32ビット版のバイナリを作成するにはgccやgasといった開発ツールから32/64ビット両対応にする必要があり,特定のプリンタドライバを動かすための手間としては大きすぎます。

どうせ32ビット版を作るなら,もう少し使いでのある用途が欲しいなぁ…,と思っていたところ,Ubuntuの32ビット版廃止表明に関連してWINEが32ビット環境を必要としていることを思い出し,⁠夏休みの自由研究」のつもりで,WINEを動かせる程度に32ビット版を作ってみようか,と思い立ちました。

その安直な思い付きが長きに渡る苦闘のはじまりになるのですが(苦笑⁠⁠,せっかくなので夏休みの自由研究日記風に,その過程を紹介してみようと思います。

7月XX日:Multilibな開発環境構築に着手

一般にMultilibと呼ばれている,64ビット版バイナリと32ビット版バイナリが共に動く環境を作るためには,32ビット版の各種ライブラリを用意する必要があり,32ビット版のライブラリを作るにはGCC/Binutilsが32ビット用のバイナリも生成できるようにする必要がある。

さまざまなCPU上で動くように設計されているGCC/Binutilsは,32ビットなバイナリも64ビットなバイナリも生成できるものの,アーキテクチャごとにCPU用の設定ファイル等が必要となるため,デフォルトではビルド時に"--disable-multilib"オプションを指定して64ビット版のみを生成するようにしている。そのため,まずはGCC/Binutilsのビルドからやり直す必要がある。

このあたりはビルド時に指定するオプションやビルドの順番がきわめて重要なので,CLFS(Cross Linux From Scratch)を参考にすることにした。CLFSは,⁠0から動作するLinux環境を作る」というLFSのアイデアを発展させて,異なるCPU用のバイナリを作成できる,いわゆるクロスコンパイル環境を0から構築しよう,というプロジェクトだ。

CLFSには日本語訳もあるものの,ざっと読んでみたところ,英語版ともども最終更新が2年ほど前で止まっており,扱っているソフトウェアのバージョンはだいぶ古くなっている。そのためビルドオプション等の互換性に一抹の不安を感じるものの,まずは手元に揃っているPlamo-7.x用のソフトウェアでビルドしてみることにした。

7月XY日:Glibcビルド用のコンパイル環境の構築

Linuxが採用している共有ライブラリは,ファイルサイズの削減やライブラリのみのバージョンアップなど,さまざまに便利な機能を提供してくれるものの,共有ライブラリが無いとコンパイラすら動作しないため,最初の共有ライブラリをどう作るかが重要になる。

CLFSによると,まず/mnt/clfs/cross-tools/以下に,32ビットなバイナリを出力できる最小規模のBinutils/GCCを用意し,それらを使ってGlibcの32ビット版共有ライブラリを作成した上で,その共有ライブラリを参照するように再度Binutils/GCCをビルドし直す,という手順になるようだ。

ビルド時のオプションや必要なパッチ等はCLFSに詳しいので省くものの,最小規模のGCCのconfigure時に--disable-sharedオプションを指定するのが重要らしい。というのも,このオプションを指定しないと,自身のビルド時にはまだ存在しない32ビット版の共有ライブラリ等を参照してしまい,ビルドに失敗するからだ。

前述のように,CLFSの更新が止っている過去2年ほどの間に,取りあげられているソフトウェアのほとんどがバージョンアップしているため,CLFSの記述がそのまま適用できるかは不安だったものの,とりあえずCLFSの指示のままビルド,インストールを進めてみたところ,M4のビルド時にglibcの仕様変更に由来するfreadaheadパッチが必要になった以外は特に修正する必要はなく,Binutilsは2.32(CLFSの記載は2.28⁠⁠,GCCは9.2.0(同7.1.0)でビルドでき,Glibcビルド用のツールが/mnt/clfs/cross-tools/以下に揃った。

$ ls /mnt/clfs/cross-tools/bin/
file                                 x86_64-unknown-linux-gnu-gcov
m4                                   x86_64-unknown-linux-gnu-gcov-dump
pkg-config                           x86_64-unknown-linux-gnu-gcov-tool
tic                                  x86_64-unknown-linux-gnu-gprof
x86_64-unknown-linux-gnu-addr2line   x86_64-unknown-linux-gnu-ld
x86_64-unknown-linux-gnu-ar          x86_64-unknown-linux-gnu-ld.bfd
x86_64-unknown-linux-gnu-as          x86_64-unknown-linux-gnu-ld.gold
x86_64-unknown-linux-gnu-c++filt     x86_64-unknown-linux-gnu-nm
x86_64-unknown-linux-gnu-cpp         x86_64-unknown-linux-gnu-objcopy
...

lib/gcc/以下には32ビット用のcrtbegin.oなどもインストールされているので,32ビット用のバイナリも出力できそうだ。

$ ls -F /mnt/clfs/cross-tools/lib/gcc/x86_64-unknown-linux-gnu/9.2.0/
32/         crtbeginS.o  crtend.o   crtfastmath.o  crtprec64.o  include/	  install-tools/  libgcov.a
crtbegin.o  crtbeginT.o  crtendS.o  crtprec32.o    crtprec80.o  include-fixed/  libgcc.a        plugin/

$ ls -F /mnt/clfs/cross-tools/lib/gcc/x86_64-unknown-linux-gnu/9.2.0/32
crtbeginT.o  crtfastmath.o  crtprec80.o  install-tools  plugin
crtbegin.o   crtend.o	      crtprec32.o  include	  libgcc.a
crtbeginS.o  crtendS.o      crtprec64.o  include-fixed  libgcov.a

とりあえず32ビット版のGlibcをビルドするために必要なツールは揃ったので,今日はここまでにしておこう。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html