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追記
ここよりも、以下のサイトをご覧いただいたほうがよほど有意義かと思います。

 Posted by at 11:39 pm  Tagged with:

Sorry, the comment form is closed at this time.