iOS怎么查看.a静态库所有打包进去的.o文件和函数接口信息?

77 篇文章 2 订阅

前言:

问题:iOS怎么查看.a静态库所有打包进去的.o文件和函数接口信息?

答案:其实就是使用 nm 命令,这个跟linux的命令是一样的。


正文:

本文来自 http://www.cnblogs.com/itech/archive/2012/09/16/2687423.html

感谢原创作者和转载者


Linux的nm查看动态和静态库中的符号

功能

列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。


使用

nm [option(s)] [file(s)]

有用的options:

  • -A 在每个符号信息的前面打印所在对象文件名称;
  • -C 输出demangle过了的符号名称;
  • -D 打印动态符号;
  • -l 使用对象文件中的调试信息打印出所在源文件及行号;
  • -n 按照地址/符号值来排序;
  • -u 打印出那些未定义的符号;

常见的符号类型:

  • A 该符号的值在今后的链接中将不再改变;
  • B 该符号放在BSS段中,通常是那些未初始化的全局变量;
  • D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
  • T 该符号放在代码段中,通常是那些全局非静态函数;
  • U 该符号未定义过,需要自其他对象文件中链接进来;
  • W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

注意几点:

  • -C 总是适用于c++编译出来的对象文件。还记得c++中有重载么?为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成一个mangle过的符号,那用这个选项列出符号的时候,做一个逆操作,输出那些原始的、我们可理解的符号名称。
  • 使用 -l 时,必须保证你的对象文件中带有符号调式信息,这一般要求你在编译的时候指定一个 -g 选项,见 Linux:Gcc
  • 使用nm前,最好先用Linux:File查看对象文件所属处理器架构,然后再用相应交叉版本的nm工具。


举例

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

nm -u hello.o
显示hello.o 中的未定义符号,需要和其他对象文件进行链接.
nm -A /usr/lib/* 2>/dev/null | grep "T memset"

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS工程中引入了两个不同的静态库(LibA和LibB),这两个库中存在相同的函数名称时,可能会导致编译错误或运行时冲突。因为在链接(Link)阶段,编译器无法判断该调用哪个库中的函数。 解决这个问题的方法有以下几种: 1. 改变函数名称:将其中一个库中的函数名称修改为不同的名称,例如在LibA中将函数名修改为A_Function,这样可以避免冲突。 2. 使用命名空间(Namespace):在两个库中给函数加上特定的命名空间,例如在LibA中使用namespace A {}命名空间来包裹函数,LibB中使用namespace B {}命名空间来包裹函数,这样就能区分开两个库中的函数。 3. 动态加载(Dynamic loading):如果在运行时能够确定使用哪个库,可以使用动态加载函数。通过使用dlopen()和dlsym()等动态链接库操作函数,可以在运行时决定加载哪个库,并调用对应的函数。 4. 修改链接顺序:在工程配置中,将使用的静态库的链接顺序调整为优先链接需要的函数的库,并排除其它库的链接。这样可以确保在链接时,只会链接到指定的库中的函数。 需要注意的是,以上解决方式都需要在工程配置中进行修改,并且在引用静态库时要明确调用的是哪个库中的函数,避免出现混淆和冲突。最好的解决方法是在引用静态库前,仔细查看库的文档和示例,了解库的使用方式和避免冲突的最佳实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值