Linux nm 命令实用示例

LinuxBeginner
立即练习

介绍

在本实验中,我们将探索 Linux 的 nm 命令,该命令用于显示目标文件的符号信息。nm 命令是开发人员和系统管理员理解可执行文件内部结构的有用工具。我们将学习如何使用 nm 命令显示符号信息、过滤输出,并深入了解可执行程序的结构。

本实验涵盖以下步骤:nm 命令简介、显示可执行文件的符号信息以及使用 nm 选项过滤符号信息。这些步骤将帮助你全面理解 nm 命令及其在软件开发和系统管理任务中的实际应用。

Linux 命令速查表

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 命令分析可执行文件内部结构的实用理解。

Linux 命令速查表