これは、なにをしたくて書いたもの?
アプリケーションをトレースしていて、アプリケーションが依存している共有ライブラリーや関数呼び出しのトレースを
してみたいなと思いまして。
時々使っているコマンドも出てきますが、エントリーとしてまとめたいと思います。
お題
curlコマンドをお題に、OpenSSLへの依存を確認し、関数呼び出しのトレースしてみたいと思います。
環境
今回の環境はこちら。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.2 LTS Release: 24.04 Codename: noble $ uname -srvmpio Linux 6.8.0-53-generic #55-Ubuntu SMP PREEMPT_DYNAMIC Fri Jan 17 15:37:52 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
確認してみる
では、curlをお題に確認してみましょう。
curlが依存している共有ライブラリーを調べる
これはlddコマンドで行います。
$ ldd --version ldd (Ubuntu GLIBC 2.39-0ubuntu8.4) 2.39 Copyright (C) 2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 作者 Roland McGrath および Ulrich Drepper。
Ubuntu Manpage: ldd - 共有オブジェクトへの依存関係を表示する
確認。
$ ldd $(which curl)
対象の実行ファイルパスを指定する必要があるので、今回はwhichと組み合わせています。
結果はこちらです。
linux-vdso.so.1 (0x00007ffd6df90000)
libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4 (0x000072b3256af000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x000072b325693000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000072b325400000)
libnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14 (0x000072b325668000)
libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x000072b325646000)
librtmp.so.1 => /lib/x86_64-linux-gnu/librtmp.so.1 (0x000072b325626000)
libssh.so.4 => /lib/x86_64-linux-gnu/libssh.so.4 (0x000072b32538f000)
libpsl.so.5 => /lib/x86_64-linux-gnu/libpsl.so.5 (0x000072b325612000)
libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x000072b3252e5000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x000072b324c00000)
libgssapi_krb5.so.2 => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x000072b325291000)
libldap.so.2 => /lib/x86_64-linux-gnu/libldap.so.2 (0x000072b325232000)
liblber.so.2 => /lib/x86_64-linux-gnu/liblber.so.2 (0x000072b325222000)
libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x000072b325168000)
libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x000072b32515a000)
/lib64/ld-linux-x86-64.so.2 (0x000072b3257c2000)
libunistring.so.5 => /lib/x86_64-linux-gnu/libunistring.so.5 (0x000072b324a53000)
libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x000072b324859000)
libhogweed.so.6 => /lib/x86_64-linux-gnu/libhogweed.so.6 (0x000072b324811000)
libnettle.so.8 => /lib/x86_64-linux-gnu/libnettle.so.8 (0x000072b3247bc000)
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x000072b324738000)
libkrb5.so.3 => /lib/x86_64-linux-gnu/libkrb5.so.3 (0x000072b32466f000)
libk5crypto.so.3 => /lib/x86_64-linux-gnu/libk5crypto.so.3 (0x000072b32512a000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x000072b325124000)
libkrb5support.so.0 => /lib/x86_64-linux-gnu/libkrb5support.so.0 (0x000072b325117000)
libsasl2.so.2 => /lib/x86_64-linux-gnu/libsasl2.so.2 (0x000072b324655000)
libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x000072b324632000)
libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x000072b32448e000)
libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x000072b324478000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x000072b324471000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x000072b32445e000)
libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x000072b324452000)
OpenSSLのライブラリーはこちらですね。
$ ldd $(which curl) | grep ssl
libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007707038b3000)
結果がちょっと長くなりますが、確実に知るには-vオプションを使うのがよいかもしれません。
$ ldd -v $(which curl)
linux-vdso.so.1 (0x00007ffed0f4c000)
libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4 (0x000078e2a9f9c000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x000078e2a9f80000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000078e2a9c00000)
libnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14 (0x000078e2a9f55000)
libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x000078e2a9f33000)
librtmp.so.1 => /lib/x86_64-linux-gnu/librtmp.so.1 (0x000078e2a9f13000)
libssh.so.4 => /lib/x86_64-linux-gnu/libssh.so.4 (0x000078e2a9ea2000)
libpsl.so.5 => /lib/x86_64-linux-gnu/libpsl.so.5 (0x000078e2a9e8e000)
libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x000078e2a9b56000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x000078e2a9600000)
libgssapi_krb5.so.2 => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x000078e2a9e3a000)
libldap.so.2 => /lib/x86_64-linux-gnu/libldap.so.2 (0x000078e2a95a3000)
liblber.so.2 => /lib/x86_64-linux-gnu/liblber.so.2 (0x000078e2a9e28000)
libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x000078e2a94e9000)
libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x000078e2a9e1a000)
/lib64/ld-linux-x86-64.so.2 (0x000078e2aa0af000)
libunistring.so.5 => /lib/x86_64-linux-gnu/libunistring.so.5 (0x000078e2a933c000)
libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x000078e2a9142000)
libhogweed.so.6 => /lib/x86_64-linux-gnu/libhogweed.so.6 (0x000078e2a90fa000)
libnettle.so.8 => /lib/x86_64-linux-gnu/libnettle.so.8 (0x000078e2a90a5000)
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x000078e2a9021000)
libkrb5.so.3 => /lib/x86_64-linux-gnu/libkrb5.so.3 (0x000078e2a8f58000)
libk5crypto.so.3 => /lib/x86_64-linux-gnu/libk5crypto.so.3 (0x000078e2a9b2a000)
libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x000078e2a9b24000)
libkrb5support.so.0 => /lib/x86_64-linux-gnu/libkrb5support.so.0 (0x000078e2a9b17000)
libsasl2.so.2 => /lib/x86_64-linux-gnu/libsasl2.so.2 (0x000078e2a8f3e000)
libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x000078e2a8f1b000)
libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x000078e2a8d77000)
libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x000078e2a8d61000)
libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x000078e2a8d5a000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x000078e2a8d47000)
libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x000078e2a8d3b000)
Version information:
/usr/bin/curl:
libcurl.so.4 (CURL_OPENSSL_4) => /lib/x86_64-linux-gnu/libcurl.so.4
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libcurl.so.4:
liblber.so.2 (OPENLDAP_2.200) => /lib/x86_64-linux-gnu/liblber.so.2
libgssapi_krb5.so.2 (gssapi_krb5_2_MIT) => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2
libidn2.so.0 (IDN2_0.0.0) => /lib/x86_64-linux-gnu/libidn2.so.0
libssh.so.4 (LIBSSH_4_8_1) => /lib/x86_64-linux-gnu/libssh.so.4
libssh.so.4 (LIBSSH_4_5_0) => /lib/x86_64-linux-gnu/libssh.so.4
libldap.so.2 (OPENLDAP_2.200) => /lib/x86_64-linux-gnu/libldap.so.2
libcrypto.so.3 (OPENSSL_3.0.0) => /lib/x86_64-linux-gnu/libcrypto.so.3
libssl.so.3 (OPENSSL_3.0.0) => /lib/x86_64-linux-gnu/libssl.so.3
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
/lib/x86_64-linux-gnu/libnghttp2.so.14:
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libidn2.so.0:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/librtmp.so.1:
libhogweed.so.6 (HOGWEED_6) => /lib/x86_64-linux-gnu/libhogweed.so.6
libnettle.so.8 (NETTLE_8) => /lib/x86_64-linux-gnu/libnettle.so.8
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libgnutls.so.30 (GNUTLS_3_4) => /lib/x86_64-linux-gnu/libgnutls.so.30
/lib/x86_64-linux-gnu/libssh.so.4:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libcrypto.so.3 (OPENSSL_3.0.0) => /lib/x86_64-linux-gnu/libcrypto.so.3
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.27) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.25) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libgssapi_krb5.so.2 (gssapi_krb5_2_MIT) => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2
/lib/x86_64-linux-gnu/libpsl.so.5:
libidn2.so.0 (IDN2_0.0.0) => /lib/x86_64-linux-gnu/libidn2.so.0
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libssl.so.3:
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libcrypto.so.3 (OPENSSL_3.0.3) => /lib/x86_64-linux-gnu/libcrypto.so.3
libcrypto.so.3 (OPENSSL_3.0.0) => /lib/x86_64-linux-gnu/libcrypto.so.3
/lib/x86_64-linux-gnu/libcrypto.so.3:
libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.25) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.16) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libgssapi_krb5.so.2:
libk5crypto.so.3 (k5crypto_3_MIT) => /lib/x86_64-linux-gnu/libk5crypto.so.3
libkrb5support.so.0 (krb5support_0_MIT) => /lib/x86_64-linux-gnu/libkrb5support.so.0
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.27) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.25) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.8) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libkrb5.so.3 (krb5_3_MIT) => /lib/x86_64-linux-gnu/libkrb5.so.3
/lib/x86_64-linux-gnu/libldap.so.2:
libsasl2.so.2 (SASL2) => /lib/x86_64-linux-gnu/libsasl2.so.2
liblber.so.2 (OPENLDAP_2.200) => /lib/x86_64-linux-gnu/liblber.so.2
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.28) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.22) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libgnutls.so.30 (GNUTLS_3_4) => /lib/x86_64-linux-gnu/libgnutls.so.30
/lib/x86_64-linux-gnu/liblber.so.2:
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.28) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libzstd.so.1:
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libbrotlidec.so.1:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libunistring.so.5:
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.32) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libgnutls.so.30:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libidn2.so.0 (IDN2_0.0.0) => /lib/x86_64-linux-gnu/libidn2.so.0
libhogweed.so.6 (HOGWEED_6) => /lib/x86_64-linux-gnu/libhogweed.so.6
libc.so.6 (GLIBC_2.8) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.25) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libtasn1.so.6 (LIBTASN1_0_3) => /lib/x86_64-linux-gnu/libtasn1.so.6
libp11-kit.so.0 (LIBP11_KIT_1.0) => /lib/x86_64-linux-gnu/libp11-kit.so.0
libnettle.so.8 (NETTLE_8) => /lib/x86_64-linux-gnu/libnettle.so.8
/lib/x86_64-linux-gnu/libhogweed.so.6:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libnettle.so.8 (NETTLE_8) => /lib/x86_64-linux-gnu/libnettle.so.8
/lib/x86_64-linux-gnu/libnettle.so.8:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libgmp.so.10:
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libkrb5.so.3:
libresolv.so.2 (GLIBC_2.9) => /lib/x86_64-linux-gnu/libresolv.so.2
libk5crypto.so.3 (k5crypto_3_MIT) => /lib/x86_64-linux-gnu/libk5crypto.so.3
libkrb5support.so.0 (krb5support_0_MIT) => /lib/x86_64-linux-gnu/libkrb5support.so.0
libkeyutils.so.1 (KEYUTILS_1.0) => /lib/x86_64-linux-gnu/libkeyutils.so.1
libkeyutils.so.1 (KEYUTILS_1.5) => /lib/x86_64-linux-gnu/libkeyutils.so.1
libkeyutils.so.1 (KEYUTILS_0.3) => /lib/x86_64-linux-gnu/libkeyutils.so.1
libc.so.6 (GLIBC_2.25) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.8) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.16) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libk5crypto.so.3:
libkrb5support.so.0 (krb5support_0_MIT) => /lib/x86_64-linux-gnu/libkrb5support.so.0
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.25) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libcom_err.so.2:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libkrb5support.so.0:
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.25) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.8) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libsasl2.so.2:
libcrypto.so.3 (OPENSSL_3.0.0) => /lib/x86_64-linux-gnu/libcrypto.so.3
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libbrotlicommon.so.1:
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libp11-kit.so.0:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libffi.so.8 (LIBFFI_CLOSURE_8.0) => /lib/x86_64-linux-gnu/libffi.so.8
libffi.so.8 (LIBFFI_BASE_8.0) => /lib/x86_64-linux-gnu/libffi.so.8
libc.so.6 (GLIBC_2.16) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.6) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.33) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.8) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.26) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libtasn1.so.6:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.38) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libkeyutils.so.1:
libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libresolv.so.2:
libc.so.6 (GLIBC_2.36) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_ABI_DT_RELR) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libffi.so.8:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.27) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
OpenSSLの共有ライブラリーに定義されているシンボルを確認する
次は、共有ライブラリーに定義されているシンボルを確認します。
これにはnm、readelf、objdumpコマンドを使います。いずれもbinutilsに含まれているので、パッケージをインストール。
$ sudo apt install binutils
まずはnmコマンドから。
Ubuntu Manpage: nm - list symbols from object files
-Dまたは--dynamicオプションをつけることで動的シンボルを表示できます。
$ nm -D /lib/x86_64-linux-gnu/libssl.so.3
たくさん出力されることが多いと思うので、ドキュメントを見た方がいいんでしょうね…。
絞り込んだ結果。
$ nm -D /lib/x86_64-linux-gnu/libssl.so.3 | grep SSL_read 00000000000365b0 T SSL_read@@OPENSSL_3.0.0 000000000003a2f0 T SSL_read_early_data@@OPENSSL_3.0.0 0000000000036640 T SSL_read_ex@@OPENSSL_3.0.0
readelf。
Ubuntu Manpage: readelf - display information about ELF files
-s、--syms、--symbolsオプションでシンボルを表示するのですが、表示幅が足りないので-Wまたは--wideオプションを
一緒に使うことになります。
$ readelf -sW /lib/x86_64-linux-gnu/libssl.so.3
結果はやっぱり長いので、一部だけ。
$ readelf -sW /lib/x86_64-linux-gnu/libssl.so.3 | grep SSL_read 673: 00000000000365b0 135 FUNC GLOBAL DEFAULT 15 SSL_read@@OPENSSL_3.0.0 777: 000000000003a2f0 342 FUNC GLOBAL DEFAULT 15 SSL_read_early_data@@OPENSSL_3.0.0 826: 0000000000036640 30 FUNC GLOBAL DEFAULT 15 SSL_read_ex@@OPENSSL_3.0.0
objdump。
Ubuntu Manpage: objdump - display information from object files
-Tまたは--dynamic-symsオプションで動的シンボルを表示できます。
$ objdump -T /lib/x86_64-linux-gnu/libssl.so.3
結果(一部)。
$ objdump -T /lib/x86_64-linux-gnu/libssl.so.3 | grep SSL_read 00000000000365b0 g DF .text 0000000000000087 OPENSSL_3.0.0 SSL_read 000000000003a2f0 g DF .text 0000000000000156 OPENSSL_3.0.0 SSL_read_early_data 0000000000036640 g DF .text 000000000000001e OPENSSL_3.0.0 SSL_read_ex
curlのOpenSSL関数の呼び出しをトレースする
最後は共有ライブラリーの関数呼び出しをトレースします。これにはltraceを使います。
Ubuntu Manpage: ltrace - A library call tracer
ちなみに、システムコールの場合はstraceを使います。
Javaアプリケーションをstraceで追う - CLOVER🍀
Ubuntu Manpage: strace - trace system calls and signals
こんな感じでアプリケーションの実行時にltrace経由で呼び出すと、libcのものしかトレースしないようなので
$ ltrace curl https://kazuhira-r.hatenablog.com
-lまたは--libraryで共有ライブラリーを指定するか
$ ltrace -l 'libssl.so.*' curl https://kazuhira-r.hatenablog.com 2>&1 | less
-eで関数を指定することになります。
$ ltrace -e 'SSL_*' curl https://kazuhira-r.hatenablog.com
どちらもglobパターンが使えます。
$ ltrace -l 'libssl.so.*' curl https://kazuhira-r.hatenablog.com 2>&1 | grep SSL_read | head -n 10 libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5a7e0, 0x4000, 0x77dc57e05780) = 0xffffffff libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5a7e0, 0x4000, 0x77dc57e05780 <unfinished ...> <... SSL_read resumed> ) = 40 libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5a7e0, 0x4000, 0x77dc57e05780) = 9 libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5a7e0, 0x4000, 0x77dc57e05780) = 0xffffffff libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5a7e0, 0x4000, 0x77dc57e05780) = 0xffffffff libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5a7e0, 0x4000, 0x77dc57e05780) = 0xffffffff libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5a7e0, 0x4000, 0x77dc57e05780) = 0x4000 libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5e810, 0x4000, 0x77dc57e05780) = 0xffffffff libcurl.so.4->SSL_read(0x5d0b1d96a300, 0x5d0b1da5e810, 0x4000, 0x77dc57e05780) = 0x4000 $ ltrace -e 'SSL_*' curl https://kazuhira-r.hatenablog.com 2>&1 | grep SSL_read | head -n 10 libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a17e0, 0x4000, 0x7529a2805780) = 0xffffffff libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a17e0, 0x4000, 0x7529a2805780 <unfinished ...> <... SSL_read resumed> ) = 40 libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a17e0, 0x4000, 0x7529a2805780) = 9 libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a17e0, 0x4000, 0x7529a2805780) = 0xffffffff libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a17e0, 0x4000, 0x7529a2805780) = 0xffffffff libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a17e0, 0x4000, 0x7529a2805780) = 0x4000 libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a5810, 0x4000, 0x7529a2805780) = 0xffffffff libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a5810, 0x4000, 0x7529a2805780) = 0xffffffff libcurl.so.4->SSL_read(0x6551335b1300, 0x6551336a5810, 0x4000, 0x7529a2805780) = 0xffffffff
よく使いそうなオプションはこのあたりでしょうか。
- -e … トレースする関数を指定する。複数回書いた場合はORになる
- -l … トレースする共有ライブラリーを指定する。複数回書いた場合はORになる
- -f … トレース対象のアプリケーションがforkまたはcloneで子プロセスを作成しても、その子プロセスも含めてアタッチする
- -t … トレースの各行の先頭に時刻を追加する(tを増やすともっと細かい時間が表示される)
- -p … 指定したPIDのプロセスに対してトレースを行う(管理者権限が必要)
ただ、-pはシンボル解決後だと意味がなさそうです…。できれば起動時に仕込んでおきたい感じですね。
こういう時はstraceに頼った方がいいのかもしれません。
おわりに
curlをお題に、アプリケーションが依存する共有ライブラリー → 共有ライブラリーの定義 → 共有ライブラリーの
関数呼び出しを確認してみました。
あんまり共有ライブラリーをトレースすることがなかったので、いろいろと勉強になりました。
straceを使うことはあったのですが、起動後のプロセスに途中からアタッチする場合はちょっと注意が必要なことも
わかりましたし…。
自分の場合はそうそう使うことはないと思うのですが、こういうのを調べる時に頭の隅に入れておくとよいかなと思いました。