iOS framework/静态库 nm 调试

本文介绍了在iOS开发中如何使用nm命令来调试静态库,通过查看符号表解决链接错误。nm命令可以列出函数库中的符号,包括类型和值,并提供了多种选项以获取更详细信息,如显示未定义的符号、调试信息等。此外,文章还举例说明了如何找到未定义的符号和特定函数的定义位置。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值