介绍
在本实验中,我们将探索 Linux 的 nm 命令,该命令用于显示目标文件的符号信息。nm 命令是开发人员和系统管理员理解可执行文件内部结构的有用工具。我们将学习如何使用 nm 命令显示符号信息、过滤输出,并深入了解可执行程序的结构。
本实验涵盖以下步骤:nm 命令简介、显示可执行文件的符号信息以及使用 nm 选项过滤符号信息。这些步骤将帮助你全面理解 nm 命令及其在软件开发和系统管理任务中的实际应用。
nm 命令简介
在这一步中,我们将探索 Linux 的 nm 命令,该命令用于显示目标文件的符号信息。nm 命令是开发人员和系统管理员理解可执行文件内部结构的有用工具。
首先,让我们创建一个简单的 C 程序并将其编译为可执行文件:
cd ~/project
nano hello.c
将以下代码添加到 hello.c 文件中:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
现在,编译程序:
gcc -o hello hello.c
要查看 hello 可执行文件的符号信息,我们可以使用 nm 命令:
nm hello
示例输出:
0000000000001119 T main
U printf
输出显示,可执行文件 hello 在地址 0x0000000000001119 处有一个名为 main 的符号,并且它还引用了 printf 符号,该符号可能由 C 标准库提供。
nm 命令提供了多种选项来自定义输出并过滤符号信息。我们将在下一步中探索这些选项。
显示可执行文件的符号信息
在这一步中,我们将探索 nm 命令的各种选项,以显示我们在上一步中创建的 hello 可执行文件的更详细符号信息。
首先,让我们仔细看一下基本 nm 命令的输出:
nm hello
示例输出:
0000000000001119 T main
U printf
输出显示了符号名称及其在可执行文件中的地址。字母 T 表示 main 是一个全局函数,而 U 表示 printf 是一个未定义的符号,可能由外部库提供。
为了获取更详细的信息,我们可以使用以下 nm 选项:
nm -A hello:显示文件名以及符号信息。nm -n hello:按符号名称而不是地址排序输出。nm -p hello:以更易读的后处理格式显示输出。nm -C hello:对 C++ 符号名称进行反混淆(demangle),以提高可读性。
示例输出:
hello:0000000000001119 T main
hello: U printf
你可以组合这些选项以进一步自定义输出。例如:
nm -nC hello
示例输出:
hello: U std::ostream::operator<<(char const*)
hello:0000000000001119 T main
此命令按名称排序显示符号,并对 C++ 符号名称进行反混淆,以提高可读性。
nm 命令提供了关于可执行文件内部结构的丰富信息,这对开发人员、系统管理员和安全研究人员非常有用。
使用 nm 选项过滤符号信息
在这一步中,我们将探索如何使用 nm 命令过滤 hello 可执行文件的符号信息。
有时,nm 命令的输出可能会让人感到不知所措,尤其是对于大型可执行文件。为了专注于特定类型的符号,我们可以使用以下 nm 选项:
nm -D hello:仅显示动态符号(由动态链接器使用的符号)。nm -T hello:仅显示静态(全局)符号。nm -t <format> hello:以特定格式显示符号地址(d表示十进制,x表示十六进制,o表示八进制)。nm --defined-only hello:仅显示已定义的符号(不包括外部/未定义的符号)。nm --undefined-only hello:仅显示未定义的符号。
例如,要以十六进制格式显示动态符号:
nm -Dt hello
示例输出:
0000000000001119 T main
U printf
要仅显示静态(全局)符号:
nm -T hello
示例输出:
0000000000001119 T main
你可以组合这些选项以进一步优化输出。例如,以更易读的格式仅显示已定义的符号:
nm --defined-only -nC hello
示例输出:
hello:0000000000001119 T main
在处理大型或复杂的可执行文件时,过滤符号信息特别有用,因为它可以让你专注于你感兴趣的特定符号。
总结
在本实验中,我们探索了 Linux 的 nm 命令,该命令用于显示目标文件的符号信息。我们首先创建了一个简单的 C 程序并将其编译为可执行文件,然后使用 nm 命令查看可执行文件的符号信息。我们了解到,nm 命令提供了多种选项来自定义输出并过滤符号信息,例如显示文件名、按符号名称排序输出以及显示符号类型和值。本实验为你提供了如何使用 nm 命令分析可执行文件内部结构的实用理解。



