non-JLE/JLE の絡みで、X11R6.3 などで __mb_cur_max 関係のエラーが出る話題

fj.sys.sun での質問に私が回答したものです。

From: yamamori@tt.rim.or.jp (YAMAMORI Takenori)
Newsgroups: fj.sys.sun
Subject: Re: what __mb_cur_max!!
Date: 16 Dec 1997 16:28:35 GMT
Message-ID: <676a7j$hdl$1@news.tt.rim.or.jp>
References: <34960CC5.70C9E4CA@cresco.co.jp>

In article <34960CC5.70C9E4CA@cresco.co.jp>, haga  <haga@cresco.co.jp> wrote:
>非常に初歩的な質問だと思いますがどうしても分からないのです。
>
>SS5にSunOS4.1.4+JLE1.1.4の環境下で
>NSUG−CD’97からX11R6.3をインストール
>しました。(バイナリ配布をコピーしただけです。)
>SunOSにはパッチは特にあてていません。
>
>そこでxtermを起動すると以下のエラーがでます。
>
>"Warning: locale not supported by C library, locale unchanged"
>
>ktermを起動すると
>
>"ld.so: Undefined symbol: __mb_cur_max"
>
>とメッセージが表示されktermの起動が出来ません。


山森と申します。

NSUG-CD'97 は私も持っています。
SunOS4.1.4(non-JLE) で X11R6.3(fix-02) を使用しています。

これの binary の X11R6.3 を見てみましたが、どうやら non-JLE で、
かつ X11R6.3 の make 時に -DX_LOCALE を付けずに make されているようです。

__mb_cur_max というラベルは、non-JLE の SunOS4.1.4 の
/usr/include/stdlib.h で定義されていて、ライブラリとしては
/usr/lib/libc.so.1.9 の中にのみ存在し、JLE の /usr/lib/libc.so.101.9
には存在しません。
(JLE マシンでも、もし、/usr/compat がインストールされていれば、
  /usr/compat/include/stdlib.h に、non-JLE の stdlib.h があるので、
  それを /usr/include/stdlib.h と diff をとれば、違いがわかるでしょう)

さて、NSUG-CD'97 では non-JLE 上で make されているため、
libX11.so.4.30 とかが /usr/lib/libc.so.1.9 内の __mb_cur_max を
必要としています。

  しかし、NSUG-CD'97 の X11R6.3 を JLE マシンにインストールし、
そこで kterm とかを make すると、出来た kterm は libc.so.101.9 を
参照するようになってしまうため、__mb_cur_max が無いというエラーがでて
動作しません。

  また、NSUG-CD'97 上の xterm 等をそのまま binary で実行した場合は、
libc.so.1.9 の方とリンクされますので __mb_cur_max のエラーは出ませんが、
これは non-JLE のライブラリのため、LANG=japanese で実行しようとすると、
locale がサポートされていないのでデフォルトの C にしますとの
warning が出ます。
---

  解決方法ですが、NSUG-CD'97 のバイナリーをそのまま使う場合は、
warning を無視するか、LANG=C にするかしかないと思います。
(当然日本語は使えません)

  kterm についてですが、/usr/compat/bin/cc でコンパイルするか、
gcc の場合は /usr/local/lib を先に参照するのを利用して、
/usr/local/lib/libc.so.1.9 --> /usr/lib/libc.so.1.9 とあらかじめ
シンボリックリンクを張っておいてから gcc で make すると、
libc.so.1.9 の方が使われ、__mb_cur_max の問題は解決します。
(あるいは unjle を使う)

  しかし、もうひとつ問題があって、NSUG-CD'97 の X11R6.3 が、
-DX_LOCALE を付けて make されていないため、このままでは
日本語 locale が使えません。

  ところが、好運なことに、kterm-6.2.0 は setlocale() を呼んでいるので
ダメなのですが、kterm-6.1.0 では、setlocale() を使わずに
日本語対応しているため、-DX_LOCALE 無しの Xlib 上でも
日本語表示が可能になります。

---
  参考までに、私の場合は NSUG-CD'97 の CD-ROM を受け取る前に、
UNIX USER の付録の CD-ROM から X11R6.3 を自分で make してしまいました。
最初は JLE 上に -DX_LOCALE 無しでやったのですが、
その後 JLE を外したくなり、non-JLE をインストールして、
その環境上で今度は -DX_LOCALE 付きで make し直しました。
(もちろん日本語環境 OK です)

JLE --> non-JLE の移行中には、__mb_cur_max 関係のエラーが出て
X11R6.3 が一時的に動かなくなった思い出があります。

-------------------------------
山森丈範  yamamori
-------------------------------


■補足■

kterm-6.2.0 でも、XIM を使わなければ setlocale() を呼ばないようにできます。JLE の謎 も参照して下さい。


To 謎の処理系 SunOS 4.1.4 Home
yamamori