linux nm(linux最好用的系统)

大家好,今天小编来为大家解答linux nm这个问题,linux最好用的系统很多人还不知道,现在让我们一起来看看吧!

linux工具之nm:文件格式分析

Linux工具nm是一种强大的文件格式分析工具,用于分析目标文件中的符号信息,这些文件可以是对象文件、可执行文件或对象文件库。它能够识别正文段(包含可执行代码)、数据段(不可执行的数据)和BSS段(初始化数据块),并以十六进制表示符号值,前面附有表示类型编码的字符。

nm命令提供了多种选项来定制输出,如显示所有符号(包括调试符号)、解构低级符号名、显示动态符号、按地址或大小排序,以及提供特定目标代码格式支持等。符号的类型通过大小写区分,小写表示本地,大写代表全局(外部)。

当遇到未定义标识符的链接器错误时,nm与objdump、readelf一起,可以帮助查找程序的符号表。通过使用`-u`筛选未定义标识符,`-A`显示文件名信息,以及`-C`(C++代码专用)来解码标识符,这些命令在处理此类问题时非常实用。例如,可以使用`objdump-t`或`readelf-s`来完成类似功能。

实例中,可以使用`nm`来按值对a.out对象文件的静态和外部符号进行排序,或者只显示64位对象符号而不包括32位,甚至以十六进制格式显示符号大小和值。

linux nm命令

linux系统下nm命令是什么呢?下面是nm命令具体介绍:

1、nm命令简介:

nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。

目标文件:常说的目标文件是程序文件(.c/.cpp,.h)经过预编译,编译,汇编过程生成的二进制文件,不经过链接过程,编译生成指令为:

gcc(g++)-c file.c(file.cpp)

将生成对应的file.o文件,file.o即为二进制文件

库文件:分为静态库和动态库,这里不做过多介绍,库文件是由多个二进制文件打包而成,生成的.a文件,示例:

ar-rsc liba.a test1.o test2.o test3.o

将test1.o test2.o test3.o三个文件打包成liba.a库文件

可执行文件:可执行文件是由多个二进制文件或者库文件(由上所得,库文件其实是二进制文件的集合)经过链接过程生成的一个可执行文件,对应windows下的.exe文件,可执行文件中有且仅有一个main()函数(用户程序入口,一般由bootloader指定,当然也可以改),一般情况下,二进制文件和库文件中是不包含main()函数的,但是在linux下用户有绝对的自由,做一个包含main函数的库文件也是可以使用的。

上述三种文件的格式都是二进制文件。

2、nm命令功能:

目标文件、库文件中、可执行文件用编辑器是无法查看其内容的(乱码),所以当我们有这个需求(例如debug,查看内存分布的时候)去查看一个二进制文件里包含了哪些内容时,这时候就将用到一些特殊工具,linux下只有nm命令可以。

3、用法:

man nm

4、常用命令参数:

-A或-o或--print-file-name:打印出每个符号属于的文件

-a或--debug-syms:打印出所有符号,包括debug符号

-B:BSD码显示

-C或--demangle[=style]:对低级符号名称进行解码,C++文件需要添加

--no-demangle:不对低级符号名称进行解码,默认参数

-D或--dynamic:显示动态符号而不显示普通符号,一般用于动态库

-f format或--format=format:显示的形式,默认为bsd,可选为sysv和posix

-g或--extern-only:仅显示外部符号

-h或--help:国际惯例,显示命令的帮助信息

-n或-v或--numeric-sort:显示的符号以地址排序,而不是名称排序

-p或--no-sort:不对显示内容进行排序

-P或--portability:使用POSIX.2标准

-V或--version:国际管理,查看版本

--defined-only:仅显示定义的符号

linux下强大的文件分析工具 -- nm

nm命令是Linux下内置的强大文件分析工具,主要用于检查、分析二进制文件、库文件、可执行文件中的符号表,提供这些文件中的各个段的信息。

目标文件、库文件、可执行文件是Linux程序开发过程中的三种重要文件格式,它们分别由预编译、编译、汇编、链接等流程生成。目标文件是程序编译生成的二进制文件,库文件是多个二进制文件打包的集合,如.a文件,可执行文件则是经过链接后的文件,具有可执行性。

在目标文件、库文件、可执行文件这三种文件中,我们无法仅通过编辑器查看其内部结构,且二进制读写软件也仅能显示原始未格式化数据。因此,在需要调试、分析二进制文件格式时,nm命令成为一种强大的工具。

对于Linux下的各种命令,了解其参数使用是基本功,nm命令亦是如此。man命令是Linux命令的说明书,通过man nm,可以了解nm的各种参数和详细用法。nm的常用命令参数包括但不限于:--demangle,用于显示符号的可读名;--defined,显示已定义的符号;--undefined,显示未定义的符号等。

在实际使用中,我们可以通过编译指令来生成目标文件,然后利用nm命令解析其符号表。例如,编译一个C++源文件后,可以使用nm命令分析生成的目标文件,查看其中的符号信息。

nm命令解析输出信息时,不同的符号代表着不同的段,如全局数据段、静态初始化段、代码段等。解析输出信息时,需要注意符号的地址、段属性等。以全局数据段为例,其中存放了如字符串、静态变量等数据,而字符串内容通常位于常量区。

理解nm命令的输出信息对于调试、优化程序具有重要意义。通过nm命令,开发者可以深入理解程序的内部结构,发现潜在的链接错误、内存泄漏等问题,从而提升程序的稳定性和性能。

阅读剩余
THE END