Ubuntu11.10で JSPカーネルの cfg が動かない件およびその暫定対策
背景
学校関係からいくつかホップして,TOPPERS の cfg が動かないので何とかして,という問い合わせがあった.
もう少し細かくいうと,Ubuntu11.10 で nxtJSP が動かないという.
そりゃそうですわ Android を始めとしてあちこちのソースコードリポジトリで問題が勃発した地雷バージョンですもの.新しいものを使えば安全という甘い幻想を持つのは若者の特権だから,大いに爆死すればよい. そう思ってしばらく放置していた.
「キホン,動作推奨環境以外で動かないときは自己責任で解決する」ということを教えるのが学校の大きな役割だし,解決への戦術を教えるのが学校の教職員の存在意義のはず.そのうち周りの大人達が助言をしながら,きっと解決するでしょう,と.
そもそも,困っている人が困っていない人の手を動かすときは,インセンティブが要る.これは人間社会のキホン.典型的には金で,時には社会学的欲求の充足で代償するわけだけれども.
なんにせよ本件では,私は全然困っていない.インセンティブもない.
だがしかし.
そうこうしているうちに,なんだか私のメアドを含むCCがいっぱいついたメールが飛んでくるようになった.まあ,困っているのは解った.でも困っていない私にCCするのやめてくれないかな….
というわけで,インセンティブができた.解決すれば CC やめてくれますよねっ♪(きらきら)
なんかすごく後ろ向きなインセンティブだけれども.
ついでに,やったことを書いておく.別段難しいことをしたわけではない.けれども,まあ,最近は LL な言語でアジャイルな開発が流行りで,ポータブルなバイナリを作るという意識も持つ機会がないかもしれないという気もする.便利になった反面,最近の若者にとっては,学ぶ機会が減って可哀想かもしれないなぁ.
やったこと.時系列
現象確認
まず,Ubuntu11.10 の環境作成.VMware のインスタンス立ててインストールして…とか,手間がウザすぎるので,EC2で適当なAMIイメージを見つけてサクっと立ち上げる.JSP カーネルのソースコードアーカイブをダウンロードして,展開.cfg の作成. configure で環境を作って…そうか cfg に食わせるソースコードの生成にはクロスコンパイラが要るのか…
でもクロスコンパイラのビルドをする気力もないので,まずは,ホストの gcc で代用する.
なるほど確かにハングアップする.無限ループに入っている風味.報告どおり.
Ubuntu10.04.3 LTS で再現性確認
10.04については,Android のイメージビルド用に EC2インスタンスを持っていたので,ちゃちゃっと立ち上がる.
JSP-1.4.4 のリリース時には Ubuntu10.04.3 LTS を使ったはず.そのため,最初の問い合わせに対しては「10.04 を使っています」と返しておいた.それでもなお解決していないとなると,もしかしたら 10.04 でも動かないのかもしれない.
ライブラリの更新などで 10.04.3 でも動かなくなっていたら,申し訳ないことしたなぁ…と思いながら Ubuntu11.10 で行った通りの手順で cfg を実行したら…
無事動いたよ.(´・ω・`)
ということは,推奨動作環境を一切無視していますね.無視られた上に困った困った言うリクエストに,応える価値があるのかどうかブルーになりつつ,続ける.
本当は,この時点で解決できるのだけど,少し寄り道してみる.
動作するバイナリを用いた不動作環境での確認
cfg は g++ で記述されている.g++ …というか C++ というか…は至近数年で大きく変革した.そのため,前世紀に記述された cfg が動かなくなるのは,もはや時間の問題ではあった.cfg 自身がC++の本流的な設計とはちょっと違う感じなので,なおさらのこと.さて,今回の不具合の根っこはどこにあるだろうか.これをざっくり知っておきたい.(←寄り道)
10.04.3 上では,動作するバイナリができた.これを 11.10 で動作するかを確認する.これで,コンパイラとアプリケーションの相性なのか,アプリケーションとライブラリの相性なのかが,概ね分かる.ABI が変更になっている場合なども動かなかったりするので,クリスプに切り分けができるわけではない.とはいえ,分からないことだらけのときは,切り分けの役に立ちそうなパラメータはすべて試してみることが大事.
11.10では,10.04.3 上で動作していたバイナリも,11.10 と同様の挙動を示した.つまり,不具合の原因はコンパイラではなく,ライブラリ側に主要因がありそうということが想像できる.
解法 : スタティックリンク
10.04.3 でスタティックリンクのバイナリを作る.バイナリのリンク時に,gcc に -static オプションを付けるだけ.バイナリのサイズは増えるけれども,やむかたない.
このバイナリを 11.10 上にコピーして確認した.
動作良好.(`・ω・´)