当 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 会做啥

当我链接动态库而不是静态库时,CMake 有效

链接静态库时链接器可以省略目标文件吗?

qt creator qt5.1 vs2010 使用静态库时链接器错误

如何防止静态库中的所有符号加载以及为什么在链接静态库时导出相同.o文件中的其他符号进行测试