跟踪内存映射中列出的二进制 ELF 中库使用的符号

跟踪内存映射中列出的二进制 ELF 中库使用的符号

我有一个用 C++ 编写的应用程序,在退出时崩溃了。崩溃的原因已经了解,可执行文件中混合了对同一库的不同版本的引用。这是我们试图追踪的错误,因此为了帮助我们做到这一点,我们希望能够利用可执行文件崩溃时创建的内存映射转储。

这些是内存映射的相关部分:

7ffff5bc7000-7ffff5ccc000 r-xp 00000000 00:38 2348051668                 /devel/utility/release/lib64/libUtils.so
7ffff5ccc000-7ffff5ecc000 ---p 00105000 00:38 2348051668                 /devel/utility/release/lib64/libUtils.so
7ffff5ecc000-7ffff5ece000 r--p 00105000 00:38 2348051668                 /devel/utility/release/lib64/libUtils.so
7ffff5ece000-7ffff5ed2000 rw-p 00107000 00:38 2348051668                 /devel/utility/release/lib64/libUtils.so
7fbbf73c3000-7fbbf73ee000 r--p 00000000 00:31 2235616792                 /devel/utility/v6.6/lib64/libUtils.so
7fbbf73ee000-7fbbf7462000 r-xp 0002b000 00:31 2235616792                 /devel/utility/v6.6/lib64/libUtils.so
7fbbf7462000-7fbbf747e000 r--p 0009f000 00:31 2235616792                 /devel/utility/v6.6/lib64/libUtils.so
7fbbf747e000-7fbbf747f000 ---p 000bb000 00:31 2235616792                 /devel/utility/v6.6/lib64/libUtils.so
7fbbf747f000-7fbbf7481000 r--p 000bb000 00:31 2235616792                 /devel/utility/v6.6/lib64/libUtils.so
7fbbf7481000-7fbbf7483000 rw-p 000bd000 00:31 2235616792                 /devel/utility/v6.6/lib64/libUtils.so

这些部分显示同一可执行文件的不同部分链接到文件系统上库的不同版本。我也有匹配的核心转储文件,我的问题是:

是否可以确定可执行代码中的哪些符号在运行时从该内存映射链接到库的每个版本?或者也许有一种方法可以从可执行文件本身做到这一点?

该可执行文件直接使用 libUtils.so 上的代码,但也链接本身可能使用 libUtils.so 的其他库。我们猜测其中之一链接到 v6.6 实例而不是发布实例,我们正在尝试追踪它。

可执行文件的 ldd -rv 显示了这两个列表,但不足以确定它们来自哪里。我们知道发布版本来自可执行文件的直接编译和链接,但我们正在尝试追踪 v6.6 实例的引入位置。

减少 ldd -rv 的输出:

    **/devel/utililty/release/lib64/libUtils.so (0x00007f0576b29000)**
    liblog4cplus-1.1.so.9 => /lib64/liblog4cplus-1.1.so.9 (0x00007f0575fcb000)
    libsigc-2.0.so.0 => /lib64/libsigc-2.0.so.0 (0x00007f0575b8e000)
    libGL.so.1 => /lib64/libGL.so.1 (0x00007f057479a000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f057457e000)
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f0574276000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f0573f73000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f0573d5d000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f057399a000)
    libboost_thread-mt.so.1.53.0 => /lib64/libboost_thread-mt.so.1.53.0 (0x00007f0573782000)
    libboost_system-mt.so.1.53.0 => /lib64/libboost_system-mt.so.1.53.0 (0x00007f057357e000)
    **libUtils.so => /devel/utility/v6.6/lib64/libUtils.so (0x00007f05730a1000)**

相关内容