ldd

lddがどうやってライブラリのパスを得ているのか、ソースを読んで調べてみたら、TRACE_LOADED_OBJECTS_ALLという環境変数を設定して対象のファイルを実行するかdlopenしているだけだった。

FreeBSDの場合

$ LD_TRACE_LOADED_OBJECTS=yes src/yog-generational 
        libm.so.5 => /lib/libm.so.5 (0x28140000)
        libthr.so.3 => /lib/libthr.so.3 (0x28155000)
        libc.so.7 => /lib/libc.so.7 (0x2816a000)

上の例は、yog-generationalがライブラリのパスを表示しているわけではない。

$ LD_TRACE_LOADED_OBJECTS=yes /bin/echo
        libc.so.7 => /lib/libc.so.7 (0x2807d000)

OpenBSDの場合

$ LD_TRACE_LOADED_OBJECTS=yes src/yog-generational
        Start    End      Type Open Ref GrpRef Name
        1c000000 3c03b000 exe  1    0   0      src/yog-generational
        01751000 2175b000 rlib 0    1   0      /usr/lib/libm.so.5.0
        02a98000 22aa1000 rlib 0    1   0      /usr/lib/libpthread.so.11.1
        0a0da000 2a113000 rlib 0    1   0      /usr/lib/libc.so.51.0
        005b7000 005b7000 rtld 0    1   0      /usr/libexec/ld.so

Linuxの場合

$ LD_TRACE_LOADED_OBJECTS=yes src/yog-generational
        linux-gate.so.1 =>  (0xb7fe3000)
        libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7fa9000)
        libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7fa5000)
        libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7f8c000)
        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e3d000)
        /lib/ld-linux.so.2 (0xb7fe4000)