iOS framework/静态库 nm 调试
2016-05-24 15:01
411 查看
iOS开发引入静态库时, 经常遇到类似错误
有用的options:
常见的符号类型:
显示hello.o 中的未定义符号,需要和其他对象文件进行链接。
在 /usr/lib/ 目录下找出哪个库文件定义了memset函数。
在
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使用对象文件中的调试信息,为每一个符号查找和显示所在源文件及行号;
-Ndebug用的符号;
-n按照地址/符号值来排序;
-rconst型只读的变量(readonly);
-T位于代码区的符号,比如函数main;
-t位于代码区的符号,一般是static函数;
-u打印出那些未定义的符号,即位于目标模块的外部符号,比如系统的printf()函数;
-w给出更多警告信息;
-Vnm命令版本号;
常见的符号类型:
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符号。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- Linux 自检和 SystemTap
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- Python 七步捉虫法
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 修复mysql数据库
- 路由器的配置与调试
- 对于技术人员的出现了运行时间错误,是否要进行调试的解决方法
- nodejs中的fiber(纤程)库详解
- 桌面中心(一)创建数据库
- 在ASP.NET 2.0中操作数据之七十二:调试存储过程
- 讲解WordPress开发中一些常用的debug技巧
- JavaScript程序设计之JS调试
- 可以用来调试JavaScript错误的解决方案
- 如何调试异步加载页面里包含的js文件
- jQuery下的Ajax调试步骤