简介
从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十六进制。默认十进制