Nov 302006
LD_ASSUME_KERNEL=2.4.19が必要とか、2.2.5が必要とかといった話がありますが、これらの値が具体的にどう影響するのかよくわかってませんでした。
pthreadのマニュアルによれば
LinuxThreads と NPTL の両方をサポートしているシステムでは、 LD_ASSUME_KERNEL 環境変数を使うことで、動的リンカがデフォルトで選択するスレッド実装を上書きすることができる。
とは書かれているのですけどね…
こちらにある説明がわかりやすかったです。
どこのライブラリが使われるのかこれで決まるということだったのですね。以下はCentOS 3.8でいろいろ確認した結果です。
# eu-readelf -n /lib/tls/libc.so.6 Note segment of 32 bytes at offset 0x00000154: Owner Data size Type GNU 16 VERSION OS: Linux, ABI: 2.4.20 # eu-readelf -n /lib/i686/libc.so.6 Note segment of 32 bytes at offset 0x00000134: Owner Data size Type GNU 16 VERSION OS: Linux, ABI: 2.4.1 # eu-readelf -n /lib/libc.so.6 Note segment of 32 bytes at offset 0x00000134: Owner Data size Type GNU 16 VERSION OS: Linux, ABI: 2.2.5
LD_ASSUME_KERNEL変えながらlddしてみるとlibcのパスが違ってくるのがわかります。
# ldd /bin/ls libacl.so.1 => /lib/libacl.so.1 (0x00513000) libtermcap.so.2 => /lib/libtermcap.so.2 (0x00db0000) libc.so.6 => /lib/tls/libc.so.6 (0x00a76000) libattr.so.1 => /lib/libattr.so.1 (0x0081f000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x003cd000)
/lib/tls/libc.so.6が要求する2.4.20未満にすると/lib/i686/libc.so.6が使われるようになります。
# LD_ASSUME_KERNEL=2.4.19 ldd /bin/ls libacl.so.1 => /lib/libacl.so.1 (0x00fa0000) libtermcap.so.2 => /lib/libtermcap.so.2 (0x00aec000) libc.so.6 => /lib/i686/libc.so.6 (0x00167000) libattr.so.1 => /lib/libattr.so.1 (0x00111000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00308000)
更に/lib/i686/libc.so.6が要求する2.4.1未満にしてみると/lib/libc.so.6が使われるようになります。
# LD_ASSUME_KERNEL=2.4.0 ldd /bin/ls libacl.so.1 => /lib/libacl.so.1 (0x00e8d000) libtermcap.so.2 => /lib/libtermcap.so.2 (0x0051a000) libc.so.6 => /lib/libc.so.6 (0x00911000) libattr.so.1 => /lib/libattr.so.1 (0x0064d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x004a7000)
ちょっと意地悪して/lib/libc.so.6が要求する2.2.5未満にしてみると…
# LD_ASSUME_KERNEL=2.2.4 ldd /bin/ls /bin/sh: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
だそーです 😉
■2007-06-12追記
ここよりも、以下のサイトをご覧いただいたほうがよほど有意義かと思います。
Sorry, the comment form is closed at this time.