iOS framework/静态库 nm 调试

来源:互联网 发布:淘宝可以寄到台湾吗 编辑:程序博客网 时间:2024/06/11 03:01

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符号。

0 0
原创粉丝点击