查找符号相关性的起源

Finding Origin of Symbol Dependency

本文关键字:起源 相关性 符号 查找      更新时间:2023-10-16

我正在处理一个相当大的项目,该项目有大量的外部依赖项。一段时间以来,我一直在开发过程中进行调试构建。现在,当我尝试构建发行版(经过很长时间)时,我会收到一个错误,说找不到特定的符号。具体来说,在我的情况下,链接器会给我一个错误,说找不到start_thread_noexcept符号。这个符号预计会在boost线程中找到,但当我使用nm -G -D --demangle检查boost线程的版本时,我发现实际上没有找到这个符号(不过我确实找到了一个名为start_thread的符号)。显然,noexcept符号可以在库的最新版本中找到。

然而,我的问题比较笼统。我现在想做的是找到这个符号要求的来源。我猜想一定有一些新的函数调用正在进行,它反过来调用start_thread_noexcept函数。很明显,在编译我的代码时,必须有一个.o文件,我可以追溯到这个需求。要么是这样,要么我添加了一些新的第三方依赖项,这反过来又需要新版本的boost线程库。如何找到需要此未定义符号的代码/库?

我转到中间目录并进行

for x in *.o; do echo $x; nm $x | grep "_ZN5boostlsIcSt11"; done

这使我能够跟踪编译单元,反过来又使我能够(手动)找到有问题的代码。