Linux Tips

ロケールの問題でプログラムが正常に動作しない場合には

北浦訓行
2007/2/8

 Fedora Coreの公式リポジトリに登録されているパッケージは、動作チェックを行っているため基本的に問題なく動作する。しかし、ロケールの違いなどで正常に動作しないものも存在する。ここでは、ロケールの問題で動作しない「Grip」というソフトウェアを例にその解決法を紹介する(注)

注:ここで挙げた対処方法は、あくまで暫定的な措置なので自己責任の下で作業していただきたい。そのため、新しいバージョンがリリースされた場合は、そちらを使用することをお勧めする。

 Gripは、音楽CDなどのリッピングに利用されるソフトウェアだ。Fedora Extrasに収録されているが、起動すると「バグ報告ツール」が表示されて異常終了する。

 「バグ報告ツール」の情報だけではなく、GNOME端末からもエラー情報を確認できる。GNOME端末で「grip」コマンドを実行すると、以下のようなメッセージが表示される。

$ grip
*** buffer overflow detected ***: grip terminated
======= Backtrace: =========
/lib/i686/nosegneg/libc.so.6(__chk_fail+0x41)[0xad1be1]
/lib/i686/nosegneg/libc.so.6[0xad13f8]
/lib/i686/nosegneg/libc.so.6(_IO_default_xsputn+0xb4)[0xa513d4]
(省略)

 最初の行に「buffer overflow detected」とある。これは、jaロケールでバッファオーバーフローが発生していることを示す。対策としては、「日本語以外のロケールで使用する」「プログラムのソースを修正してコンパイルし直す」などが考えられる。

 最初に簡単で安全な対処方法を紹介する。それは、日本語のロケールをやめて、英語モードで起動する方法だ。GNOME端末で以下のコマンドを実行する。

$ LANG=C;grip

 これで、英語モードのGripが起動する。

英語モードで起動したGrip

 次は、日本語でGripを使用する方法だ。この場合は、ソースを修正してパッケージを作成する必要がある(注)

注:開発環境が必要となる。

 まず、yumで最新版のソースファイルをダウンロードするにはを参考にソースファイルをダウンロードする。Fedora Core 6の場合、GripはFedora Extrasにある。

 yumdownloaderをインストールしていない場合は、rootでログインして以下のコマンドを実行する。

# yum install yumdownloader

 以下のコマンドで、Gripのソースファイルをダウンロードする。

# yumdownloader --enablerepo=extras-source --source grip

 次に、ソースファイルをインストールする。

# rpm -ihv grip-3.2.0-15.fc6.src.rpm

 ソースファイルは、/usr/src/redhat/SOURCESにインストールされる。その中のgrip-3.2.0.tar.gzに今回修正するファイル(grip.c)が含まれている。まず、grip-3.2.0.tar.gzを作業用ディレクトリ(/tmp)にコピーして展開する。

$ cp /usr/src/redhat/SOURCES/grip-3.2.0.tar.gz /tmp
$ cd /tmp
$ tar zxf grip-3.2.0.tar.gz
$ cd grip-3.2.0/src

 展開したら、grip.cというファイルの518行目を修正する。

char versionbuf[20];
   
char versionbuf[22];

 修正が完了したら、作業用ディレクトリに戻りtarボールを作成する。

$ tar cvf grip-3.2.0.tar.gz grip-3.2.0
$ ls -l grip-3.2.0.tar.gz
-rw-r--r-- 1 nori nori 2529280  1月 26 16:08 grip-3.2.0.tar.gz

 rootでこのファイルを元のファイルに上書きする。

# cp grip-3.2.0.tar.gz /usr/src/redhat/SOURCES/
cp: `/usr/src/redhat/SOURCES/grip-3.2.0.tar.gz' を上書きしてもよろしいですか(yes/no)? y ←[y]キーを入力

 今回は修正前のパッケージと区別するために、SPECファイル(grip.spec)を修正する。

# cd /usr/src/redhat/SPECS/
# ls
grip.spec

 修正した個所は、パッケージのリリース番号を示す「Release:」部分だ。ここでは、パッケージのリリース番号の後ろに「_1」を付けた。

Release: 15%{?dist}
   ↓
Release: 15_1%{?dist}

 次に、以下のコマンドでパッケージのビルドを行う。

# rpmbuild --bb grip.spec
エラー: ビルド依存性の失敗:
        vte-devel は grip-3.2.0-15_1.i386 に必要とされています
        cdparanoia-devel は grip-3.2.0-15_1.i386 に必要とされています
        id3lib-devel は grip-3.2.0-15_1.i386 に必要とされています

 結果を見ると、依存性のエラーが発生している。不足しているファイルをyumでインストールして、再度ビルドを実行すれば問題を解決できる。

# yum install vte-devel cdparanoia-devel id3lib-devel
# rpmbuild --bb grip.spec
# cd ../RPMS/i386
# ls
grip-3.2.0-15_1.i386.rpm  grip-debuginfo-3.2.0-15_1.i386.rpm

 後は、rpmコマンドでgrip-3.2.0-15_1.i386.rpmをインストール(アップデート)する。

# rpm -Uhv grip-3.2.0-15_1.i386.rpm

 [アプリケーション]メニューの[サウンドとビデオ]−[Grip]を選択すると、日本語のGripが起動する。

日本語で起動したGrip

関連リンク:
自分で作るRPMパッケージ
http://www.atmarkit.co.jp/flinux/special/mkrpm/mkrpm01.html

Linux Tips Index



 Linux Squareフォーラム Linux Tipsカテゴリ別インデックス
インストール/RPM ブート/ブートローダ
ファイル操作 環境設定
ユーザー管理 コンソール/ターミナル
X Window System セキュリティ
トラブルシューティング 他OS関係
ネットワーク ハードウェア
Webサーバ Samba
GNOME KDE
OpenOffice.org エミュレータ
ソフトウェア そのほか/FAQ
全Tips公開順インデックス Linux Tips月間ランキング
Linux Squareフォーラム全記事インデックス

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間