【问题标题】:ltrace: Couldn't find .dynsym or .dynstr in "library.so"ltrace:在“library.so”中找不到 .dynsym 或 .dynstr
【发布时间】:2014-10-24 03:33:08
【问题描述】:
我尝试过使用 ltrace。我尝试使用以下命令来分析程序sampleapp、ltrace -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 的内部结构。