試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Ubuntu Gutsy x86_64上の32bitなGTK+ 2ではimmoduleが使えず、日本語が入らない?

Adobe Reader 8x86_64なUbuntu Gutsyに入れたとき(関連記事)に

(acroread:4054): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so: wrong ELF class: ELFCLASS64

(acroread:4054): Gtk-WARNING **: Loading IM context type 'xim' failed

のように、64bit版GTK+ 2のimmodulesの場所を読みに行って失敗する件について調べてみたところ、Debianでは、必要なファイルを作成した上で、環境変数を一時的に設定して起動する形らしいということが分かった。
この投稿は、Debian上のAdobe Reader 7の起動に関してで、インストールされているファイルのレイアウトが一部異なるので、下のようにして実験してみた。

  1. ファイルと環境変数による実験
  2. 「ia32-libs」のパッケージについて

ファイルと環境変数による実験

以下のファイルを作成して*1
ファイル名: /etc/pango/pangorc.32

[Pango]
ModuleFiles=/usr/lib32/pango/1.6.0/module-files.d/libpango1.0-0.modules
ModulesPath=/usr/lib32/pango/1.6.0/modules
[PangoX]
AliasFiles=/etc/pango/pangox.aliases

32bitなGTK+ 2アプリケーションを下のように起動してみた。*2

GTK_PATH=/usr/lib32/gtk-2.0 GCONV_PATH=/usr/lib32/gconv PANGO_RC_FILE=/etc/pango/pangorc.32 GDK_PIXBUF_MODULE_FILE=/etc/gtk-2.0/gdk-pixbuf.loaders.32 GTK_IM_MODULE_FILE=/etc/gtk-2.0/gtk.immodules.32 [32bitな GTK+ 2アプリ]

しかし、これでも

Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so: wrong ELF class: ELFCLASS64
Gtk-WARNING **: Loading IM context type 'xim' failed

/usr/lib/gtk-2.0/2.10.0/以下の64bit版GTK+ 2のモジュールを読みに行ってしまってダメだった。入力欄の右クリックメニューから入力メソッド一覧を見ても64bit版GTK+ 2のものが並んでいて、選択すると「ELF class」のエラーが出るだけ。どのimmoduleを選んでも同様。XIMもimmoduleの1つのため、「XIMなら使えるのでは?」とはいかない。
もし、これでうまくいっていれば、Adobe Reader 8は、

--- /opt/Adobe/Reader8/bin/acroread.orig
+++ /opt/Adobe/Reader8/bin/acroread
@@ -70,6 +70,11 @@
 LaunchBinary()
 {
     if [ "`uname -s`" = "Linux" ] && [ ! -x /lib/ld-lsb.so.3 ]; then
+        export GTK_PATH=/usr/lib32/gtk-2.0
+        export GCONV_PATH=/usr/lib32/gconv
+        export PANGO_RC_FILE=/etc/pango/pangorc.32
+        export GDK_PIXBUF_MODULE_FILE=/etc/gtk-2.0/gdk-pixbuf.loaders.32
+        export GTK_IM_MODULE_FILE=/etc/gtk-2.0/gtk.immodules.32
         exec /lib/ld-linux.so.2 ${1+"$@"}
     else
         exec ${1+"$@"}

のようにした上で32bit版のimmoduleを用意すればよいことになるのだが、何か足りないのだろうか?
(2007/11/16)起動に影響する環境変数の場所を修正・手動ビルドしたGTK+ 2ではここに書くことで反映された

/etc/gtk-2.0/gtk.immodules.32の内容も、きちんと32bitのファイルの場所を示しているし、/usr/lib32/libgtk2.0-0/gtk-query-immodules-2.0を実行すると、32bit版immoduleの場所が検出されて書き込まれているが、同時に64bit版の場所も検出して「wrong ELF class: ELFCLASS64」が大量に出ているのが気になる。
以下は、/usr/lib32/libgtk2.0-0/gtk-query-immodules-2.0実行時に標準エラー出力に出る「wrong ELF class: ELFCLASS64」がらみのエラー。

Cannot load module /usr/lib/gtk-2.0/2.10.0/immodules/im-inuktitut.so: /usr/lib/gtk-2.0/2.10.0/immodules/im-inuktitut.so: wrong ELF class: ELFCLASS64
/usr/lib/gtk-2.0/2.10.0/immodules/im-inuktitut.so does not export GTK+ IM module API: /usr/lib/gtk-2.0/2.10.0/immodules/im-inuktitut.so: wrong ELF class: ELFCLASS64
Cannot load module /usr/lib/gtk-2.0/2.10.0/immodules/im-ti-et.so: /usr/lib/gtk-2.0/2.10.0/immodules/im-ti-et.so: wrong ELF class: ELFCLASS64
/usr/lib/gtk-2.0/2.10.0/immodules/im-ti-et.so does not export GTK+ IM module API: /usr/lib/gtk-2.0/2.10.0/immodules/im-ti-et.so: wrong ELF class: ELFCLASS64
Cannot load module /usr/lib/gtk-2.0/2.10.0/immodules/im-scim.so: /usr/lib/gtk-2.0/2.10.0/immodules/im-scim.so: wrong ELF class: ELFCLASS64
/usr/lib/gtk-2.0/2.10.0/immodules/im-scim.so does not export GTK+ IM module API: /usr/lib/gtk-2.0/2.10.0/immodules/im-scim.so: wrong ELF class: ELFCLASS64
(中略)
Cannot load module /usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so: /usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so: wrong ELF class: ELFCLASS64
/usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so does not export GTK+ IM module API: /usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so: wrong ELF class: ELFCLASS64

Gentoo Linuxgtk-query-immodules-2.0-32を実行したときには、このようなエラーは一切出ず、32bit版のimmoduleに関しての情報のみがきちんと出力される。

「ia32-libs」のパッケージについて

32bit版GTK+ 2を含む「ia32-libs」パッケージのソース(400MiB近い)を落とし、その中にある、ビルド方法の説明が書かれているファイルを読むと
[引用]ファイル名: ia32-libs-2.1ubuntu3/debian/README.build

To build a new version of this package, you will need both an
amd64/ia64 system and an ia32 system. On the ia32 system, run
./fetch-and-build. This will download the latest sources of the
included packages from ftp.se.debian.org, and build them from scratch.
Then you can create a source package using dpkg-source, and copy it to
an amd64/ia64 system where it may be built normally. The packages can
not (yet, at least) be built from scratch on an ia64/amd64 system.

32bit環境上でビルドしたものを64bit環境上で処理するような形らしい。そのため、処理しているファイルを見ても分かるが、その際のライブラリディレクトリ名は「lib32」ではなく「lib」*3のようだ。Gentoo Linuxの32bitライブラリ(emul-linux-x86-*)の場合*4は、「lib32」にライブラリファイルをインストールするようにconfigureスクリプトに指示するが、そのようにはなっていない。

*1:値に書かれているファイル/ディレクトリの場所は全て存在することを確認済み

*2:こちらも環境変数の値に書かれているファイル/ディレクトリの場所は全て存在することを確認した

*3:x86_64のDebianUbuntuにおいて、「lib」は「lib64」を指すリンクになっている。Gentoo上でも同様

*4:emul用chrootもしくはCHOSTとABI指定による