如何比较 nm 输出

Posted

技术标签:

【中文标题】如何比较 nm 输出【英文标题】:How to compare nm outputs 【发布时间】:2016-05-15 04:13:10 【问题描述】:

我有 2 个目标文件,它们应该是相似的,因为它们来自同一代码库的 2 个不同编译时间。我想比较他们的 nm 输出。但是我不能,因为有很多名字修饰。由于名称修改结果似乎不同,但实际上并非如此。我尝试了以下步骤来帮助我比较

1) took last word using command
sed '/ /s/.* //' nmfile1 >nmfile1_lastword

2) removed _Z.. starting word with nothing 
sed 's/^_Z...//' nmfile1_lastword > nmfile1_lastword_removed_z

3) sorted the same 
sort nmfile1_lastword_removed_z > nmfile1_lastword_removed_z_sorted

我也为第二个 nmFile2 做了上述操作。

但是,开始时仍然有很多名称修改,我无法删除,这让我认为没有简单的方法来比较 nm 输出。请注意,我只关心起始名称的修改,因为我可以在 gvim -d 中看到结果,并且我可以手动识别差异。如果有一些直接的工具那就最好了。

请注意,我尝试使用带有选项 -C 的 nm 来显示没有 name Mangling 但它仍然显示很多 name mangling 。

【问题讨论】:

【参考方案1】:

使用 c++filt 将符号分解为

nm xxx.so | c++filt > compare1.txt
nm xxx.so | c++filt > compare2.txt

【讨论】:

什么平台?可以访问示例二进制文件吗? 抱歉无法共享二进制文件。我正在使用带有 g++ 的 linux。操作系统规格是: 分销商 ID:RedHatEnterpriseClient 描述:Red Hat Enterprise Linux 客户端版本 5.10 版本:5.10 好的,你能传递一个未被 c++ 文件处理的 mangle 字符串,例如 $c++filt ZNK3MapI10StringName3RefI8GDScriptE10ComparatorIS0_E16DefaultAllocatorE3hasERKS0 看起来您使用的 nm 版本有错误。快速解决方案是在最新工具 (nm) 上对您的二进制文件进行解构。供参考sourcery.mentor.com/archives/cxx-abi-dev/msg02295.html

以上是关于如何比较 nm 输出的主要内容,如果未能解决你的问题,请参考以下文章

显示共享库版本的 nm 输出不正确

这个 nm 输出“V typeinfo name for void*”是啥意思?

这个 nm 输出是啥意思?

nm输出和gdb函数地址不同

使用 GNU nm 实用程序时跳过地址输出

使用 awk 解析 nm 命令的输出 - Linux Bash