メモや、文章を貯めておき管理するためのアプリを探している中で、KeepNote なる Python で書かれたものを見つけ愛用しているのですが、このアプリは panic 耐性がなく突然終了しようものなら、note が壊れて読み出せなくなること多数。
panic させるのが良くないと言われつつも、いつも泣きながら修復していました。
でも、KeepNote でも、機能的には十分なんですけどね。
そんな生活を送る中、Notecase PRO なるものを見つけました。
NoteCase Pro
http://www.virtual-sky.com/
Notecase PRO は、売り物ではあるけど、マルチプラットフォーム対応。そして、その中には OpenSolaris の文字が!がががっ!
というわけで、これは試さずにはいられないと機能制限付きの無償版を download したのは良いのですが、これが動かない。動かないというか、必要な library がないので起動しない。
OpenSolaris 対応といいつつ、下記の library が見つからないのが原因。
# ldd notecase.bin | grep not
libX11.so.6 => (file not found)
libintl.so.8 => (file not found)
libstdc++.so.6 => (file not found)
libgcc_s.so.1 => (file not found)
これらを一つずつ解決する必要がある。
まずは、linintl.so.8 から。
これは、GNU gettext に含まれている。
そして、これを手に入れる為には、GNU libiconv も必要になる。
iconv や gettext を system wide にインストールしてしまうと、混乱の種となる可能性もある。
ここでは、libiconv.so (GNU libiconv) がリンクされた libintl.so.8 を手に入れるという目的だけに絞るため、インストール先を適当なディレクトリ(/usr/tmp/gettext) に設定する。
そこにインストールされた libiconv.so と libintl.so を抜き出すというのがこのミッション。
まずは、libiconv となる GNU libiconv を先に build する。
iconv の入手は、下記 URL から。
http://ftp.gnu.org/pub/gnu/libiconv/
$ gtar xvzf libiconv-1.13.1.tar.gz
$ cd libiconv-1.13.1
$ ./configure --prefix=/usr/tmp/gettext
Sun Studio 12u2 で build するなら、
$ env CC=/opt/solstudio12.2/bin/cc CXX=/opt/solstudio12.2/bin/CC \
CFLAGS=-fast ./configure --prefix=/usr/tmp/gettext
あとは、make 叩いて make install を実行。
$ gmake
$ gmake install
/usr/tmp/gettext 配下に libiconv がインストールされたことを確認。
続いて、GNU gettext を build する。
GNU gettext の入手は、下記 URL から。
http://ftp.gnu.org/pub/gnu/gettext/
$ gtar xvzf gettext-0.18.1.1.tar.gz
$ cd gettext-0.18.1.1
$ ./configure --prefix=/usr/tmp/gettext \
--with-libiconv-prefix=/usr/tmp/gettext --with-included-gettext
Sun Studio 12u2 で build するなら、
$ env CC=/opt/solstudio12.2/bin/cc CXX=/opt/solstudio12.2/bin/CC \
CFLAGS=-fast ./configure --prefix=/usr/tmp/gettext \
--with-libiconv-prefix=/usr/tmp/gettext --with-included-gettext
こちらも、make 叩いて make install を実行。
$ gmake
$ gmake install
/usr/tmp/gettext 配下に gettext がインストールされたことを確認。
ターゲットとなる libiconv.so.2 と libintl.so.8 は /usr/tmp/gettext/lib 配下にあるので、
まずは、それを適当なディレクトリにコピーする。
自分しか使わないのであれば、$HOME に置いてもいいし、共有するなら /opt/notecase/lib など、とにかく適当な場所に配置する。
ここでは、仮に /opt/notecase/lib に libiconv.so.2 と libintl.so.8 を配置する。
# mkdir -p /opt/notecase/lib
# cp /usr/tmp/gettext/lib/libiconv.so.2 /opt/notecase/lib
# cp /usr/tmp/gettext/lib/libintl.so.8 /opt/notecase/lib
この状態では、libintl.so.8 がリンクしている libiconv.so.2 の情報が /usr/tmp/gettext/lib/libiconv.so.2
のままなので、elfedit コマンドで修正する。
$ ldd libintl.so.8
libiconv.so.2 => /usr/tmp/gettext/lib/libiconv.so.2
libc.so.1 => /lib/libc.so.1
libm.so.2 => /lib/libm.so.2
# elfedit -e dyn:rpath libintl.so.8 (確認)
index tag value
[5] RUNPATH 0xa3c /usr/tmp/gettext/lib
[6] RPATH 0xa3c /usr/tmp/gettext/lib
# elfedit -e 'dyn:rpath /opt/notecase/lib' libintl.so.8 (修正)
$ elfedit -e dyn:rpath libintl.so.8 (確認)
index tag value
[5] RUNPATH 0xa51 /opt/notecase/lib
[6] RPATH 0xa51 /opt/notecase/lib
# ldd libintl.so.8
libiconv.so.2 => /opt/notecase/lib/libiconv.so.2
libc.so.1 => /lib/libc.so.1
libm.so.2 => /lib/libm.so.2
これで、libintl.so.8 が見つからない問題は解決。
続いて、libX11.so.6 が必要となるが、これは、/usr/lib/libX11.so.4 へのリンクとして
作成すれば良いので、/opt/notecase/lib に用意する。
# ln -s /usr/lib/libX11.so.4 /opt/notecase/lib/libX11.so.6
libX11.so.6 は、これにて解決。
最後に libstdc++.so.6 と libgcc_s.so.1 が残ってますが、これは gcc-3-runtime パッケージを IPS repository からインストールすれば揃うので、pkg install gcc-3-runtime してください。
といっても、gettext や iconv を build できる環境が必要なのですでに install されていますよね。
必要な library は、/usr/sfw/lib に配置されています。
という感じで、足りない 4 つのライブラリが揃いました。
あとは、用意したライブラリを notecase binary が見つけだせるようにするだけですが・・・
ここで、notecase binary の RPATH を確認。
# elfedit -e dyn:rpath /usr/bin/notecase.bin
index tag value
[20] RPATH 0x6464 /lib
むぅ。
ならば、libintl.so.8 のように elfedit で rpath を書き換えてしまえばいんじゃね?
と、思いつくかもしれませんが、これができない。
なんでだろ?と file コマンドを実行してみると、invalid ELF object 判定。むむ。
# file /usr/bin/notecase
file: /usr/bin/notecase.bin zero size or zero entry ELF section - ELF capabilities ignored
/usr/bin/notecase.bin: invalid ELF object
これは、StormOS の binary 全般がそうなっているのがわかった。
StormOS 上で build された bainary を Solaris 11 Express なので確認すると、すべてこんな感じなのでどうしようもないのかなぁと。
この状態の binary を Solaris 11 Express などで elfedit 可能な binary に修正する方法があるかもわからないのでちょいあきらめ気味。
ただ、invalid ELF object 判定でも動作するところが救われるかな?
この binary compatibility が Solaris の強み!とか言い放ってみるテスツ。ふふん。
で、elfedit で rpath を書き換えることができないなら、ふつうに LD_LIBRARY_PATH で教えてやんよ!
ってことで、下記のように実行する
$ env LD_LIBRARY_PATH=/opt/notecase/lib:/usr/sfw/lib ldd /usr/bin/notecapse
動いた!
というわけで、上記のコマンドを shell script にしてしまえば Notecase PRO を動かすことが可能です。
慣れてしまえばなんてことない手順なのですが、full version を利用するためにはお金を払わなければなりません。
足りない library を用意するのは、まぁ、良いとして、invalid ELF object として判定されてしまうあたり、もしかしたら、将来、動作しなくなってしまうかもしれないという不安がつきまといます。
この文章も、Notecase PRO を使って書いているのですが、ちょっと購入を躊躇してしまう感じです。
購入してから、Solaris 11 Express で使ってるけど・・・という問い合わせに 「StormOS じゃないとダメ」
とか言われると悲しいですし・・・ぐぬぬって感じです。