我有一个包含一些二进制文件的文件。我试图在这些二进制文件上使用nm
来搜索目标文件。
我的问题是,我想只输出包含所需符号的文件(executables.out)中的那些二进制文件。知道怎么做吗?
nm --demangle `awk '{print}' executables.out` | grep <symbol> > outputfile.txt
答案 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
,则不会打印fprintf
,snprintf
,{{1}这是一个GNU vsnprintf
扩展名。