适用于初学者的Linux nm命令教程(10个示例)
如果您是一位也参与系统级软件开发的Linux用户,那么您可能会发现自己处于以下情况:需要与目标文件中的符号相关的信息。 你会很高兴知道存在一个名为nm的命令行工具,你可以在这些情况下使用它。
在本教程中,我们将使用一些易于理解的示例来讨论此工具的基础知识。 但在这之前,值得一提的是,这里的所有示例都已在Ubuntu 16.04 LTS机器上进行了测试。
Linux nm命令
nm命令行实用程序基本上列出了来自目标文件的符号。 以下是该工具的语法:
nm [OPTIONS] OBJECT-FILENAME
以下是命令的手册页如何解释它:
GNU nm lists the symbols from object files objfile.... If no object
files are listed as arguments, nm assumes the file a.out.
以下是一些问答式样的例子,可以让你更好地了解nm如何工作。
Q1。 nm命令如何工作?
该命令的基本用法非常简单 - 您只需运行“nm”命令并将对象文件的名称作为输入传递给它。 例如,我使用nm命令和'apl'二进制文件:
nm apl
以下屏幕截图显示了上述命令的输出类型:
输出中生成的三列分别代表符号值,符号类型和符号名称。 有几种类型的符号 - 要了解完整的详细信息,请转到nm命令手册页。
Q2。 如何让文件名在输出中的每个符号之前?
这可以使用-A命令行选项来完成。
nm -A [obj-file]
例如:
nm -A apl
所以你可以看到文件名被添加在每行的开头。
Q3。 如何让nm显示调试器符号?
要在输出中使nm显示调试器符号,请使用-a命令行选项。
nm -a [obj-filename]
例如:
nm -a apl
上述命令将显示所有符号,包括通常未列出的只有调试器的符号。
Q4。 如何使nm解码低级别符号名称?
如果你愿意,你甚至可以强迫nm将低级别符号名称解码为用户级名称。 这可以使用-C命令行选项来完成。
nm -C [obj-file]
例如:
nm -C apl
以下是手册页关于此选项的说明:
Besides removing any initial underscore prepended by the system,
this makes C++ function names readable. Different compilers have
different mangling styles. The optional demangling style argument
can be used to choose an appropriate demangling style for your
compiler.
Q5。 如何让nm只显示动态符号?
如果您希望nm仅显示动态符号而不是常规符号,请使用-D命令行选项。
nm -D [obj-file]
例如:
nm -D apl
所以你可以看到nm只在输出中产生动态符号。
Q6。 如何使用不同的nm输出格式?
要启用不同的输出格式,请使用-f命令行选项。 默认情况下,输出以bsd格式生成,但是,如果需要,也可以启用'sysv'和'posix'格式。
nm -f [format] [obj-filename]
例如:
nm -f posix apl
现在观察格式的变化。
Q7。 如何让nm只显示外部符号?
这可以使用-g命令行选项来实现。
nm -g [obj-file]
例如:
nm -g apl
Q8。 nm提供的所有排序选项?
默认情况下,符号按字母顺序排序。 但是,如果需要,可以使用-n命令行选项通过地址对它们进行数字排序。
nm -n [objfile]
例如:
nm -n apl
所以你可以看到输出按地址排序。
如果您不希望nm应用任何类型的排序(包括它使用的默认排序),请使用-p命令行选项。 继续前进,以反转任何现有的排序,请使用-r命令行选项。
Q9。 如何让nm只显示未定义的符号?
这可以使用-u命令行选项。
nm -u [obj-file]
例如:
nm -u apl
Q10。 如何让nm只显示已定义的符号?
要使nm仅显示定义的符号,请使用--defined-only命令行选项。
nm --defined-only [obj-file]
例如:
nm --defined-only apl
结论
同意,nm命令有一个小众观众,但我个人的经历表明,即使你不认为自己是该观众的一部分,也要记住这样的工具存在。 对于那些想要使用这个实用程序的人来说,一旦完成了这里的所有示例,请访问nm手册页以了解更多信息。