查找未定义的符号

查找未定义的符号

我正在尝试运行一个程序,其源代码是我下载并编译的。当我尝试运行该程序时,我不断收到消息:

unable to load undefined symbol _z15InvalidateImageSs

我正在尝试确定为什么会出现此错误。该程序实际上是一个由另一个程序加载的库。我的程序编译为 .so 文件。

我跑:

$ nm myprog.so > nm.txt

该符号显示在文件中,但没有与其关联的地址。

  1. 我使用以下命令在源树中搜索该符号:

$ find . -type f | xargs fgrep -I '_zinvalidateimagess' | grep -v 'Binary

我没有结果。 2.我在所有标准加载库中搜索了该符号:

$ scanelf -l -s _zInvalidateImageSs | grep -I '_zinvalidateImageSs'

又没有结果。

所以我的问题是:如果该符号从未在源树中的任何位置被引用,为什么它在 .so 文件中出现问题?我如何找出这个符号应该来自哪里?

答案1

该库的来源可以宣布一个符号没有定义它,通过做这样的事情

extern InvalidateImage(const char *);

然后使用它

const char *foo = InvalidateImage(bar);

因为它是一个库,所以除非您尝试运行使用该符号的程序,否则您不会注意到这一点。去的地方符号是您下载库源的位置:该库的开发人员可能直接提供相关源或有关他们从何处获取源的一些线索。

对于它的价值,我使用脚本(exportsexterns)来检查我维护的程序中是否缺少符号。

进一步阅读:

相关内容