【问题标题】:ltrace: Couldn't find .dynsym or .dynstr in "library.so"ltrace:在“library.so”中找不到 .dynsym 或 .dynstr
【发布时间】:2014-10-24 03:33:08
【问题描述】:

我尝试过使用 ltrace。我尝试使用以下命令来分析程序sampleappltrace -c -T --library=library.so --output=out.txt ./SampleApp 使用的 library.so 文件。但它显示了上述错误。但是 library.so 是一个调试版本。所以符号表应该在那里。我试图用objdump --source library.so | grep CreateSocket() 来验证它。它返回使用该 CreateSocket() 函数的代码。这意味着它包含一个符号表。那么为什么会出现这个错误呢?

相关帖子:measure CPU usage per second of a dynamically linked library

【问题讨论】:

    标签: c++ redhat profiler centos5 ltrace


    【解决方案1】:

    这取决于如何创建可执行文件SampleApp。如果它是静态链接的,您将看到该错误。 ltrace 仅适用于动态链接的应用程序。

    您可以运行ldd SampleApp 来显示共享对象依赖项。它是动态链接的,并且依赖于 libc,ldd 的输出将包含如下一行:

    libc.so.6 => /usr/lib/libc.so.6 (0x00007fb24ac53000)
    

    在这种情况下,您可以使用 ltrace 选项 --library=libc.so.6,它应该可以工作。但是,--library=libc.so 将不匹配(您不会收到错误,但不会匹配任何库调用)。

    当静态链接时,ldd SampleApp 将改为显示此输出:

        not a dynamic executable
    

    我的猜测是因为静态链接可能是错误的。 然而,重要的一点是,如果 ltrace 显示此错误,您必须从可执行文件本身(二进制文件)及其创建方式(链接器选项)开始诊断,而不是从共享库开始。

    How does ltrace (library tracing tool) work? 的问题有一些很好的参考资料,可以帮助您更多地了解 ltrace 的内部结构。

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多