需要根据符号表信息将二进制名输出到文件/标准输出

时间:2012-06-26 01:54:27

标签: shell unix awk grep nm

我有一个包含一些二进制文件的文件。我试图在这些二进制文件上使用nm来搜索目标文件。

我的问题是,我想只输出包含所需符号的文件(executables.out)中的那些二进制文件。知道怎么做吗?

nm --demangle `awk '{print}' executables.out` | grep <symbol> > outputfile.txt 

2 个答案:

答案 0 :(得分:2)

如果没有看到nm的args等,看看是否有东西显示文件名,我会做一个3行的shell脚本。

for f in `cat executables.out`; do
    nm --demangle $f | grep -q REQUIRED_SYMBOL && echo $f
done

说:

For each file in executables.out
    if nm output contains the required symbol
        echo the file name

nm可能有简化命令行选项(例如从文件中获取objs列表) - 取决于您的操作系统。

答案 1 :(得分:1)

nm的选项在不同的机器上不一致,输出格式也不一致。但是,通常有一个选项可以将文件名(目标文件或归档成员或可执行文件名)作为前缀添加到输出中。在MacOS X上,该选项为-o;在Solaris上,它是-r-R;在Linux上,它是-o,...

nm -g -o $(<executables.out) | grep -w symbol | awk -F: '{print $1}'

这将列出定义或引用给定符号的文件。要仅显示定义符号的文件,则需要查看“T”(函数)或“C”(未初始化或公共数据)或“D”(初始化数据) - 尽管System V系统再次使用不同的系统:< / p>

nm -g -o $(<executables.out) | grep -w symbol | grep ' [TCD] ' | awk -F: '{print $1}'

$(<file)表示法读取指定文件并将内容用作一系列参数,但不实际执行命令(与原始执行awk的后退标记不同问题; cat可能是awk)的合理替代方案。

grep -w查找整个单词格式,因此如果您搜索printf,则不会打印fprintfsnprintf,{{1}这是一个GNU vsnprintf扩展名。