我有一个包含一些二进制文件的文件。我正在尝试nm
在这些二进制文件上使用来搜索目标文件。
我的问题是,我只想从这个文件(executables.out)中输出那些包含所需符号的二进制文件。知道怎么做吗?
nm --demangle `awk '{print}' executables.out` | grep <symbol> > outputfile.txt
如果不查看 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 可能有用于简化的命令行选项(例如,从文件中获取 obj 列表) - 取决于您的操作系统。
的选项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 系统再次使用不同的系统:
nm -g -o $(<executables.out) | grep -w symbol | grep ' [TCD] ' | awk -F: '{print $1}'
该$(<file)
表示法读取命名文件并将其内容用作一系列参数,但这样做并没有实际执行命令(与awk
在原始问题中执行的带有反引号的表示法不同;cat
将是 的合理替代方案awk
)。
将grep -w
模式作为一个整体来查找,因此如果您搜索printf
,它不会打印fprintf
、snprintf
、vsnprintf
等。它是一个 GNUgrep
扩展。