您的位置:首页 > 移动开发 > IOS开发

iOS framework/静态库 nm 调试

2016-05-24 15:01 411 查看
iOS开发引入静态库时, 经常遇到类似错误
Undefined symbols for architecture x86_64: "_xxxx", referenced from: ...
。此时,可以进入到静态库所在目录下,使用
nm
命令查看该架构下是否存在该符号:
nm mySDK -arch x86_64 | grep '_xxxx'


功能

nm命令可以列出一个函数库文件(.o .a .so)中的符号表。所谓符号,通常指定义出的函数,全局变量等等。它对于静态的函数库和共享的函数库都起作用。nm命令显示的信息用于调试库和可执行文件,对于一个给定的函数库,nm命令可以列出函数库中定义的所有符号,包括每个符号的值和类型。还可以给出在原程序中这个函数(符号)是在多少行定义的,不过这必须要求编译该函数库的时候加“-l”选项。

使用

nm [选项] [文件列表(库文件/目标文件/可执行文件)]


有用的options:

-A
在每个符号信息的前面打印所在对象文件名称;

-B
全局非初始化数据段(BBS段)的符号,其值表示该符号在bss段中的偏移;

-b
全局static的符号;

-C
输出demangle过了的符号名称;

-D
打印动态符号,只显示动态符号,当使用动态库时很有用;

-g
只显示全局符号的相关信息;

-l
使用对象文件中的调试信息,为每一个符号查找和显示所在源文件及行号;

-N
debug用的符号;

-n
按照地址/符号值来排序;

-r
const型只读的变量(readonly);

-T
位于代码区的符号,比如函数main;

-t
位于代码区的符号,一般是static函数;

-u
打印出那些未定义的符号,即位于目标模块的外部符号,比如系统的printf()函数;

-w
给出更多警告信息;

-V
nm命令版本号;

常见的符号类型:

A
该符号的值在今后的链接中将不再改变;

B
该符号放在BSS段中,通常是那些未初始化的全局变量;

D
该符号放在普通的数据段中,通常是那些已经初始化的全局变量;

T
该符号放在代码段中,通常是那些全局非静态函数;

U
该符号未定义过,需要自其他对象文件中链接进来;

W
未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

举例

更详细的内容见man page。这里举例说明:

nm -u hello.o


显示hello.o 中的未定义符号,需要和其他对象文件进行链接。

nm -A /usr/lib/* 2>/dev/null | grep "T memset"


在 /usr/lib/ 目录下找出哪个库文件定义了memset函数。

nm AlipaySDK -arch arm64 | grep '_RSA_ver'


AlipaySDK
这个framework中,查找
arm64
架构下的
_RSA_ver
符号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 调试 nm 符号表