在Mac平台下,可以使用nm命令来查看一个文件的符号表信息。nm命令行工具是附带在Xcode中的,因此在使用之前请事先安装好Xcode。

nm命令的格式大致如下:

nm  [ -agnoprumxjlfPA [ s segname sectname ] ] [ - ] [ -t format ] [ [ -arch arch_flag ]... ] [ file ... ]

如果不带任何可选参数的话,使用nm命令将会列出指定文件中的所有符号,符号出现的次序默认按照字符排序。如果符号代表的是一个由Object C语言编写的函数,那么其名字将是+-[Class_name(category_name) method:name:]。

对于每一个符号,其格式是“符号值 符号类型 符号名”:

不过可以看到,nm命令也有许多的参数可选,这些参数的大致作用如下:

-a,显示所有符号,包括那些专门用来调试的符号。

-g,只显示全局符号,不显示局部符号。

-n,按照数字而不是默认的字符排序。

-p,不排序,按照符号在符号表中出现的次序显示。

-r,符号按照反序显示(默认就是按照符号名字字符排序的反序,如果带上-p参数就是按照在符号表中出现次序的反序,如果带上-n参数就是按照符号名数字排序的反序)。

-u,只显示未定义的符号。

-U,不显示未定义的符号,与-u的作用刚好相反。

-j,只显示符号的名字,而不显示符号对应的数值和类型。

-s segname sectname

只解析位于文件中 segname 段里 sectname 节内的符号。

-arch archtype

OS X和iOS系统都是支持所谓的肥(Fat)文件的,也就是一个大文件中包含了分别对不同平台支持的文件。

默认情况下,nm会将其中每一个平台文件中所包含的符号都列出来。如果你只想看某一个平台文件中的符号,可以用这个选项指定。

例如,对于包含了32位armv7指令集和64位armv8指令集的iOS可执行文件来说,如果只想看表示32位armv7指令集部分的符号,可以加上 -arch arm 参数;而如果想看表示64位armv8指令集部分的符号,可以加上 -arch arm64 参数。

-x,将以16进制的形式显示符号表中所有符号每一项的值,格式如下:

-A,在每一行符号的前面加上文件名。

-P,以简单格式显示每一个符号,格式如下:

-t format ,如果使用前面的-P参数,则符号的数值将使用16进制表示,但是可以再加上-t参数来指定用别的格式显示符号的值。主要有下面几种:

d:以10进制显示;

o:以8进制显示;

x:以16进制显示(默认)。

一般来说,在每个符号的前面,都有一个字母来表示这个符号的类型。对于每一个符号来说,其类型如果是小写字母表示的的,则说明该符号是本地(Local)的或者说是内部(Internal)的,而如果是大写字母表示的,则说明该符号是全局的,也就是可供外部(External)访问的。

一共主要有以下几种类型:

1)U,未定义符号

表示这个符号没有在本文件中定义,需要解析别的文件从而找出对应符号的定义。

例如,当前文件调用另一个文件中定义的函数或者全局变量,这个被调用的函数或全局变量在当前文件中就是未定义的。(但是,在定义它的文件中,如果是函数则对应的类型是T,而如果是全局变量则其符号类型为C)。

2)A,绝对符号

表示该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这种类型的符号常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。

3)T,定义在__TEXT段__text区(代码区)中的符号

表示该符号位于代码区中,其值表示该符号在整个文件当中的所处的位置。

有点奇怪的是符号“ __mh_execute_header ”竟然类型也为T,算作在代码区定义的符号。

4)D,定义在__DATA段__data区中的符号

表明该符号位于初始化数据区中,其值表示该符号在整个文件当中的所处的位置。

5)B,定义在__DATA段__bss区中的符号

表明该符号位于非初始化数据区中,其值表示该符号在bss段中的偏移。

6)C,所谓的普通(Common)符号,定义在__DATA段__common区中的符号

普通符号是定义在一个未初始化数据段内的符号。该符号没有包含于一个普通的区中,只有在链接过程中才进行分配,符号的值表示该符号需要的字节数。例如在一个C文件中,定义int test,并且该符号在别的地方会被引用,则该符号类型即为C,否则其类型为B。

7)I,间接符号

说明这个符号是仅仅是对另一个符号的间接引用。

8)S,其它符号

定义在除前所述其它地方的符号,例如出现在__TEXT段__const区中的符号。

在今天举行的 Globalpress 2006 全球电子峰会上,可编程逻辑解决方案全球领先供应商及 FPGA 发明厂商赛灵思公司 (Xilinx)展示了其 65 nm 工艺新一代 Virtex:trade_mark: FPGA 系列中的首款器件。Virtex:trade_mark:FPGA 系列是世界上应用最广泛的 FPGA 系列,累计销售收入已超过 40 亿美元。 “赛灵思通过创新和向下一代工艺节点积极推进等一系列措施,长期以来一直致力于为我们的客户提供最优的性能、容量、功耗和成本优势,”赛灵思公司董事会主席、总裁兼 CEO Wim Roelandts 说。“我们在 2004 年推出的 90 nm Virtex-4 系列获得了极大的成功
Mac : 默认调用Xcode下的 命令 :objdump -t lib*.a | grep          貌似只能 查看 静态库 nm -D | grep   可以 查看 动态库和静态库,但有时候获取的 符号表 不全 androidndkdir/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-and
Mac 命令 行 https://www.cnblogs.com/- ios /p/4949923.html Join the chat at https://gitter.im/jlevy/the-art-of-command-line 日常 使用 文件 及数据处理 冷门但有用 仅限 Mac OS X 系统 curl -s ‘https://raw...
在学习 iOS 安全的时候,老是看到有个 nm 命令 ,今天就来好好梳理下 nm 这个 命令 。 先来说说 符号表 符号表 可以提供应用软件及其动态加载的苦衷引用的函数、类、方法等信息。通常, 符号表 中包含比类转储更多的信息,并且还包含了应用软件 使用 的C或者C++ 组件的信息。就好比你要去某个城市某个地方,首先你得需要一张地图才能找得到某个地方吧。 符号表 就是这张地图。 nm 命令 作用就是显示目标 文件 的符号
一、背景介绍 最近新版本审核时被拒了,Apple给出的原因是 使用 到了Intents的功能,但是Info.plist中并未给出 使用 简介导致被拒。由于我们的App并不需要 使用 Intents等能力,所以需要排查是哪些第三方库引入的Intents.framework。下面将介绍在分析二进制 文件 时常用的一些 命令 ,帮助我们快速定位问题。 首先下载jenkins打好包的IPA 文件 ,修改ipa后缀为zip并解压,在 命令 行中cd 进入/Payload/TestProje.. 在启动时倒计时前3秒可以进入uboot 命令 行(也有可能不是三秒根据uboot中的delay环境变量决定)。 命令 行中输入boot启动内核。 uboot 命令 行的一些基本 命令 : 帮助 命令 : help: 查看 当前uboot所支持的所有 命令 命令 名: 查看 命令 的帮助信息 环境变量: printenv: 查看 环境变量 (环境变量就是一些变量,只不过这些变量与环境有关,值是字符串) setnev: 设置环境变量(该 命令 可用于修改(如修改字符串setenv 环境变量名 ‘要修改的值’)、新建(se //无符号 unsigned 有符号singend(有符号可以省略) //有符号数是最高位为符号位,0代表正数,1代表负数。 //无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。 //%u——输出unsigned int类型-即表示输出一个无符号十进制整型数据 //% d——输出int类型 signed int a = -10; printf("%d\n", a); 最近苹果的热更新和私有库问题检查的更严了,如果应用被拒,苹果在拒绝信中会说到 使用 strings/otool/ nm 命令 进行自查,所以总结了一些 命令 ,方便查找和定位 文件 内容相关信息。 1、grep 作用:判断是否包含字符串 使用 示例: grep -r "xxx” path 检查是否包含(weixin...