简介
从Xcode8开始,苹果在mac上nm工具使用的就是llvm-nm工具(llvm-nm工具用来列出llvm字节码文件,目标文件以及归档文件中的目标中的符号名称
)。对大部分nm工具的命令选项来说,他们都有相同的可选项;但-f,-s和-L这几个选项差别较大。本文主要介绍了nm工具的各种常使用的选项的含义。
nm主要用于展示符号文件中的各种符号的名称列表。某些情况下,如果一个文件使用了strip功能也就是-T
剖离了符号,这种情况下,使用nm
和dyld
结果会不太一样,这种情况需要使用dyldinfo
来查看文件.
如果输入的文件是打包过的,使用nm会列举各个文件的详情。输入的文件可以是标准的libx.a(x.o)文件,会列举.a和.o文件的符号信息。
默认情况下,每个符号名的值都先于符号名出现。当使用-m
选项的是,值后面会跟上如下字母,代表各个符号的类型:U(未定义的),A(绝对的),T(Text Section段的符号),D(Data Section的符号),B(bss Section的符号),C(一般符号),S(除了上面几种类型的符号外的符号),或者I(直接符号)。如果符号是本文件有的(非外部引入的),那么type就是小写的。
如果一个符号是Objective-C方法名称,符号名称就会像这样+-[Class_name(category_name) method:name:],
显示,+号代表类方法,-号代表示例方法(category_name)
代表这是一个类别.
默认情况下,符号是按字母表顺序排序输出的。
nm命令各个选项详细介绍
-
-a
表示输出所有的符号
-
-g
显示全局变量
-
-n
按照符号值的数字大小排序而不是字母表顺序
-
-o
输出符号的所有位置,这种情况,一个符号会多次出现
-
-p
符号输出不做排序,按照符号表的顺序输出,如下
-
-r
逆序输出符号,如下是按照数字从大到小输出
-u
只展示未定义的符号-
-U
不展示未定义的符号
-
-m
展示N_SECT类型的符号(Mach-O 符号),会按照(segment_name, section_name) 的格式显示符号在哪个位置,会详细显示符号是否是外部引入的,是否未定义,普通符号,直接符号等等描述
-
-x
以16进制形式展示符号,后面会跟上符号的名称
-
-j
只展示符号,不展示值和类型
-
-s
只展示知道(segname,sectname)的值,如下只展示__DATA __objc_data
段的符号值。
-l
展示一个伪符号,需要结婚-s符号一起使用。(暂时不清楚这个符号的具体作用
)-
-arch
只展示universal file中指定架构的符号;如果指定文件包含这个符号,则展示指定架构的符号,否则展示所有的符号
-
-f
按指定格式输出,支持如下bsd, sysv, posix or darwin
四种格式,默认是darwin格式。
-
-A
展示每个文件的路径和库名称
-
-P
输出可移植接口格式的符号
-
-t
给输出可移植接口格式的符号按照自定的数值格式输出,支持-d
十进制,-o
八进制,-x
十六进制。默认十进制