当 iOS 应用程序链接到静态库时,如何获取丢弃的符号列表?
Posted
技术标签:
【中文标题】当 iOS 应用程序链接到静态库时,如何获取丢弃的符号列表?【英文标题】:How do get a list of discarded symbols when iOS app is linked against a static library? 【发布时间】:2010-12-01 17:58:17 【问题描述】:我正在构建一个供第三方使用的 ios 静态库。它是使用其他几个包含大量 C++ 的静态库构建的,从而产生了一个巨大的可交付库。
iOS 库的 API 非常简单,而且我知道它不会执行所有包含的代码。我想从各种库中删除不需要的模块,以便缩小最终大小。
我有一个使用所有库 API 的示例应用程序,当它被链接时,库中的大部分符号都被丢弃了。有没有办法获得这些符号的列表?
【问题讨论】:
【参考方案1】:这个答案似乎表明您想要做的事情在 GCC 3.x 和 4.x 中是不可能的:
Restricting symbols in a Linux static library
【讨论】:
【参考方案2】:有人告诉我,使用动态库的限制是由代码签名过程强制执行的,所以我认为这可能有效:
-
将示例应用程序的可执行文件链接到静态库
运行
nm -uj
以列出可执行文件中未定义的符号。由于库是静态链接的,唯一未定义的符号应该是标准 iOS 库定义的符号
创建静态库的动态版本
将示例应用程序的可执行文件链接到动态库
对这个可执行文件运行nm -uj
。未定义符号是第 2 步中列出的符号与可执行文件实际引用的库符号的联合
diff
第 2 步和第 5 步中的列表。这将只为您提供库中的符号列表
在目标文件上运行nm -js __TEXT __text
以获取每个目标文件导出的函数列表
仅将导出步骤 6 中列出的函数的目标文件添加到库中。
这可以自动化,可能需要改进以考虑函数以外的符号(例如全局变量)。
【讨论】:
以上是关于当 iOS 应用程序链接到静态库时,如何获取丢弃的符号列表?的主要内容,如果未能解决你的问题,请参考以下文章
当目标是静态库而目标链接是静态库时,target_link_libraries 会做啥