Ubuntu 9.04 Jaunty Jackalope で dvipdfmx が動かない問題を解決する

しばらく前にリリースされた Ubuntu 9.04 ですが、現在 dvipdfmx が動かないという寒い状況が続いています。LaTeX使いの人にとっては死活問題です。

何が起きているのか

とりあえず解決方法を知りたい人は、ここは読みとばしてください。

Ubuntu 9.04 とそれ以前のバージョンでは、インストールされる dvipdfmx のバージョンが異なります。そして、なぜだかは調べてないので知りませんが Ubuntu 9.04 でインストールされる dvipdfmx にはバグがあり、そのバグのせいで pdf を生成することができません。

どんなバグかというと、スタック領域を誤って破壊しているというものです。で、スタックフレームの破壊というのは exploit を作る1つの方法として使えるので、スタックフレームの破壊を検出するしくみみたいなものが GCC にあって、 -fstack-protector とかいうオプションをつけると有効にすることができます。

Ubuntuコンパイル済みパッケージは基本的に -fstack-protector オプションを付けてコンパイルされているらしいので、スタックフレームを破壊してしまうバグがあるプログラムは、それを検出して安全のために落ちてしまいます。このような理由で dvipdfmx が落ちてしまうようです。

どう対処すべきか

幸いにして、この問題は日本語Ubuntuフォーラムで既に取り上げられ、Launchpad にバグ報告がなされています*1。現在、このバグの Status は Confirmed になっていて、Confirmed→In Progress→Fix Commited→Fix Released という段階を経て、パッケージの更新でユーザーの手元にバグが直った dvipdfmx が届けられます。

このバグfixからリリースまでのプロセスがどの程度の期間を要するものなのかはわかりませんが、LaTeXユーザーの我々としては"今" dvipdfmx を必要としているわけです。

というわけで、ソースからビルドしましょう。

ソースから dvipdfmx をビルドする

依存ライブラリをインストールする(追記)
sudo apt-get build-dep dvipdfmx
ソースを入手する

Ubuntu – Error から Jaunty 用のソース(dvipdfmx_20080607.orig.tar.gz)と、diff(dvipdfmx_20080607-1.diff.gz) をダウンロードしてきます(右側の関連リンクから)。

また、パッチ (patch_for_dvipdfmx.patch.txt)をダウンロードしておきましょう。

これらのファイルは、全部同じディレクトリに置いておくと後の作業がしやすいです。

パッチをあてる

ソース(dvipdfmx_20080607.orig.tar.gz)とdiff(dvipdfmx_20080607-1.diff.gz) を解凍して、パッチをあてます。

tar zxvf dvipdfmx_20080607.orig.tar.gz
gunzip dvipdfmx_20080607-1.diff.gz
patch -p0 < dvipdfmx_20080607-1.diff
patch -p0 < patch_for_dvipdfmx.patch.txt

ビルドする

ビルドする際に気をつけるべきことは

の2点です。

依存ライブラリは、Ubuntu – Error にある依存ライブラリの -dev パッケージ (コンパイルするために必要なヘッダファイル群) が必要になります。はやみずの場合は libkpathsea-dev が足りないだけでしたが、必要なものが無ければ ./configure を実行したときに怒られるので、その都度インストールしてあげればよいでしょう。

インストールするディレクトリについては、何も指定しないと /usr/local 以下にインストールされます。いわゆる野良ビルドで、しかも一時的に難をしのぐためだけのものなので、個人的には /usr 以下を汚すのはいやだなぁ、ということではやみずは ${HOME}/usr 以下にインストールしました。このようなことをする場合は、${HOME}/usr/bin にちゃんとパスを通しておきましょう。

ビルドするには以下のコマンドを叩けばOKです。${HOME}/usr の部分は、各自の好みで適当に設定しましょう。

cd dvipdfmx-20080607
./configure --prefix ${HOME}/usr
make -j 4
make install

(゜д゜)ウマー