0

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

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

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

2 回答 2

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 可能有用于简化的命令行选项(例如,从文件中获取 obj 列表) - 取决于您的操作系统。

于 2012-06-26T02:10:19.017 回答
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 系统再次使用不同的系统:

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

$(<file)表示法读取命名文件并将其内容用作一系列参数,但这样做并没有实际执行命令(与awk在原始问题中执行的带有反引号的表示法不同;cat将是 的合理替代方案awk)。

grep -w模式作为一个整体来查找,因此如果您搜索printf,它不会打印fprintfsnprintfvsnprintf等。它是一个 GNUgrep扩展。

于 2012-06-26T03:51:30.793 回答