ltrace:在"library.so"中找不到 .dynsym 或 .dynstr

ltrace: Couldn't find .dynsym or .dynstr in "library.so"

本文关键字:dynsym 找不到 dynstr so library ltrace      更新时间:2023-10-16

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

相关文章:测量动态链接库每秒的CPU使用率

这取决于可执行文件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显示此错误,则必须从可执行文件本身(二进制文件)以及它的创建方式(链接器选项)开始诊断,而不是从共享库开始诊断

问题ltrace(库跟踪工具)是如何工作的?有一些很好的参考资料,可以进一步了解ltrace的内部结构。