[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:11931] Re: [Q]segmentation fault



佐野@浜松です。

In article <8706ED2299E8D011B4A80000E20C257894EC@MSENT000>
 古田 拓 <furuta-taku@xxxxxxxxxxxxxxxxxx> さん writes:

> 特にNetscape で、もう一度ftpで持ってきて、インストールするのが
> めんどくさかったからです。その方法はやってみようと思います。

特に slink 版の Netscape は従来の「インストーラパッケージ」ではなく、
実体を含んだパッケージになっているので、それがまず嬉しいのと、
あと bo (libc5) 版ではたしか libc ライブラリのバージョンの関係で
kinput2 や skkinput での直接日本語入力ができないらしかったのに
対して、 hamm 以降の glibc2 版では直接入力できるらしいと聞いている
のでそれが嬉しいんじゃないかな (でも私はまだちゃんと設定できて
いませんが ;_;) と思います。 bo でも自分で libc5 のバージョンを
変更していればできたのかもしれませんが、そこまでする気になれません
でしたし。

# ちょうど bo でパッケージ化されていた 5.4.33 が、江後田さんの Web
# ページによればたしか一番相性の悪いバージョンだったような。
# パッケージの kinput2 のバージョンも問題あったみたいでした。
# まあ Netscape がすべてじゃないさ、と bo ではあきらめていたので
# あまり突込んで調べたり、自分でいろいろインストールしたりは
# しなかったのもあるかもしれませんが。しかし、 hamm ならできるはず
# なのに現状できていないのはちょっと悔しいかも。

> あと、ライブラリ関連に何か不具合がありそうな気がして、それでMLに
> 記事を流しました。何か妙な点がありましたら、指摘してください。

前回の

> > そこでldd で調べると
> 
> > ldd /usr/X11R6/bin/tgif
> >         libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x4000a000)
> >         libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40016000)
> >         libm.so.5 => /lib/libm.so.5 (0x400ba000)
> >         libc.so.5 => /lib/libc.so.5 (0x400c3000)
> >         libc.so.6 => /lib/libc.so.6 (0x40181000)
> >         ld-linux.so.2 => /lib/ld-linux.so.2 (0x40226000)
> > 
> libc6 と ld-linux.so.2 が呼ばれているのはおかしい、とこちらの ML で
> 指摘されました。いろいろ調べてみましたが、何がどう悪いのかさっぱりわかりません。
> 例えば、基本的なところなのでしょうが、プログラムが起動するとき、どういう仕組み
> で共有ライブラリを読んで動くのでしょうか。

これですよね。私はサッサと入れ換えてしまったので、あまり深く調べませんでしたが
自分で入れていた /usr/local/bin 以下で似たようなものを見つけたので参考までに
書いておきます。


% ldd /usr/local/bin/xanim.24bpp
	libwcsmbs.so.0 => /lib/libc5-compat/libwcsmbs.so.0 (0x4000d000)
	libc.so.5 => /lib/libc.so.5 (0x4000f000)
	libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x400cd000)
	libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x400d9000)
	libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x40121000)
	libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x4012a000)
	libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4013f000)
	libm.so.5 => /lib/libm.so.5 (0x401e2000)
	libc.so.6 => /lib/libc.so.6 (0x401eb000)
	ld-linux.so.2 => /lib/ld-linux.so.2 (0x40290000)

% strings /usr/local/bin/xanim.24bpp |grep lib
/lib/ld-linux.so.1
libc.so.5
__libc_init
libXext.so.6
libXt.so.6
libSM.so.6
libICE.so.6
libX11.so.6
libm.so.5
/usr/X11R6/lib   (<- コレに注目!)

% /usr/local/bin/xanim.24bpp
Segmentation fault


% ldd /usr/local/bin/xvgen
	libwcsmbs.so.0 => /lib/libc5-compat/libwcsmbs.so.0 (0x4000d000)
	libolgx.so.3 => /usr/lib/libc5-compat/libolgx.so.3 (0x4000f000)
	libxview.so.3 => /usr/lib/libc5-compat/libxview.so.3 (0x4001b000)
	libX11.so.6 => /usr/lib/libc5-compat/libX11.so.6 (0x4012e000)
	libm.so.5 => /lib/libm.so.5 (0x401cc000)
	libc.so.5 => /lib/libc.so.5 (0x401d5000)
	libXext.so.6 => /usr/lib/libc5-compat/libXext.so.6 (0x40293000)

% strings /usr/local/bin/xvgen|grep lib
/lib/ld-linux.so.1
libolgx.so.3
libxview.so.3
libX11.so.6
libm.so.5
libc.so.5
__libc_init

% /usr/local/bin/xvgen
(正常起動)


% ldd /usr/local/bin/xlander
	libwcsmbs.so.0 => /lib/libc5-compat/libwcsmbs.so.0 (0x4000d000)
	libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x4000f000)
	libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4001b000)
	libm.so.5 => /lib/libm.so.5 (0x400be000)
	libc.so.5 => /lib/libc.so.5 (0x400c7000)
	libc.so.6 => /lib/libc.so.6 (0x40185000)
	ld-linux.so.2 => /lib/ld-linux.so.2 (0x4022a000)

% strings /usr/local/bin/xlander |grep lib
/lib/ld-linux.so.1
libXext.so.6
libX11.so.6
libm.so.5
libc.so.5
__libc_init
/usr/X11R6/lib   (<- コレに注目!)

% /usr/local/bin/xlander
Segmentation fault


どうやら、実行バイナリの中に /usr/X11R6/lib が指定されているものがあって、
それらは実行時に X 関係のライブラリをロードする際、本来は libc5 用として
/usr/lib/libc5-compat からロードされるはずが、コンパイル時に指定された
/usr/X11R6/lib からロードしてしまうために、それらの glibc2 版のライブラリ
が必要とする libc.so.6 や ld-linux.so.2 などもロードされてしまって、
共有ライブラリ関係の解決ができなくなって Segmentation fault で落ちる、と
いうことなんじゃないかと想像してます。

ちなみに man ld すると

      -rpath directory
              ディ レ ク トリを実行時ライブラリの検索パスに追加す
              る。これは ELF の実行ファイルを共有オブジェクトとリ
              ン クするときに用いられる。 -rpath の引き数は全て結
              合され、ダイナミックリンカに渡される。ダイナミッ ク
              リ ンカは、これを用いてロードする共有オブジェクトを
              実行時に決定する。 -rpath オプションはリンクに明 示
              的 に含まれている共有オブジェクトによって必要とされ
              る別の共有オブジェクトを指定するのに用いることも で
              き る。 -rpath-link オプションの説明を見よ。 ELF 実
              行ファイルの -rpath が指定されない場合には、 (指 定
              さ れ ていれば) 環境変数 LD_RUN_PATH の値が用いられ
              る。

              -rpath オプションは SunOS で用いることも で き る。
              SunOS  のデフォルトでは、リンカは実行時の検索パスを
              -L オプションで与えられたパスから生成する。  -rpath
              が 用いられると、実行時の検索パスは -rpath オプショ
              ンで与えられたパスのみから生成され、 -L オプショ ン
              は無視される。これは gcc を使っていて、 -L がたくさ
              ん指定されてしまう (これらは NFS マウントされたファ
              イルシステムかもしれない) 場合などに便利である。

という文章が気になったりします。

たぶん、他のバイナリがちゃんと動くのなら、ライブラリの問題というより
その (特定の) プログラムの問題なのでしょう。

あるいは /usr/X11R6/lib 以下に該当するライブラリが存在していない場合
には、ちゃんと /usr/libc5-compat/ 以下からロードできるのかもしれません。
途中まで動いていたのなら、そういうことかも。 (単なる当て推量ですけど)

でも、いつまでもその状態のままというわけにもいきませんよね。

どうしても気になるなら libc5 な altdev 系のパッケージを入れて、
libc5 なパッケージを make し直してみると何かわかるかもしれません。

が、私は既に「気にせず問題が起きたら glibc2 に移行」という方針を
決めてしまったので、 xanim.24bpp もこれから glibc2 で make し直す
ことにします。

-- 
     #わたしのおうちは浜松市、「夜のお菓子」で有名さ。
    <xlj06203@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)