当iOS应用程序链接到静态库时,如何获取丢弃的符号列表?

时间:2010-12-01 17:58:18

标签: xcode gcc ios

我正在构建一个iOS静态库供第三方使用。它是使用包含大量C ++的其他几个静态库构建的,从而产生了一个巨大的可交付库。

iOS库的API非常简单,我知道它不会运用所有包含的代码。我想从各种库中删除不需要的模块,这样我就可以减小最终的大小。

我有一个使用所有库API的示例应用程序,当它链接时,库中的大多数符号都被丢弃。有没有办法获得这些符号的列表?

2 个答案:

答案 0 :(得分:0)

这个答案似乎表明你想要做的事情在GCC 3.x和4.x中是不可能的:

Restricting symbols in a Linux static library

答案 1 :(得分:0)

我被告知使用动态库的限制是由代码签名过程强制执行的,所以我认为这可能有用:

  1. 将示例应用程序的可执行文件与静态库链接
  2. 运行nm -uj列出可执行文件中的未定义符号。由于库已静态链接,因此唯一未定义的符号应该是标准iOS库定义的符号
  3. 创建静态库的动态版本
  4. 将示例应用程序的可执行文件与动态库链接
  5. 针对此可执行文件运行nm -uj。未定义的符号是步骤2中列出的符号与可执行文件
  6. 实际引用的库符号的并集
  7. diff第2步和第5步中的列表。这将只为您提供图书馆中的符号列表
  8. 对目标文件运行nm -js __TEXT __text以获取每个目标文件导出的函数列表
  9. 仅向库中添加导出步骤6中列出的函数的目标文件。
  10. 这可以自动化,可能需要改进以考虑除功能之外的符号(例如全局变量)。