从静态库(.a)中删除方法调用而不重新编译

时间:2012-03-04 10:33:30

标签: objective-c ios xcode

我正在使用一个静态库,在上传我的二进制文件时会给我一个警告,供苹果审核。

静态库中导致警告的方法(非公共选择器)从不被我调用,其相应的.h从我的项目中删除,但警告仍然存在。

鉴于我知道导致问题的方法名称,有没有办法让我打开/编辑这个.a并注释/删除有问题的代码片段,然后在我的项目中使用修改后的.a。

我无法访问.a源代码来重新编译它,它的旧版本及其创建者没有联系方式供我追踪。

非常感谢, -Cake

4 个答案:

答案 0 :(得分:6)

快速而肮脏的解决方案:在十六进制编辑器中打开.a文件并更改名称的所有实例。保留函数名称的长度相同,以便文件中的偏移不会改变,只需更改字母或类似的东西即可。我做了一个快速测试,在我们构建为静态库的子项目中添加了一个虚函数,然后调整.a文件中的函数名称(有五个实例,这是值得的),一切都构建好了。我认为没有任何理由在此之后它不会通过App Store检查。

我真的很惊讶函数在最终构建中仍然存在,但我认为死代码剥离应该清除任何未使用的代码。咦。

答案 1 :(得分:2)

http://opensource.apple.com/source/cctools/cctools-809/

我不认为得到你的赏金,因为我没有提供一个简单的解决方案。但是,理论上它是可能的。你的工作已经完成了。

答案 2 :(得分:0)

无需破解二进制文件。只需关闭编译器的“未使用的选择器”警告:-fno-unused-selectors。

答案 3 :(得分:0)

根据你的lib和项目,有几种解决方案。

在您的构建设置中:

  1. 如果可能,启用“死代码剥离”:如果从未使用该方法(甚至是内部),则该符号将被删除。

  2. 使用“未导出的符号文件”:只需将符号添加到文件中,它就会从二进制文件中删除。即使符号在内部使用,也可以使用。

  3. 启用“部署后处理”和“剥离链接产品”并将“剥离样式”设置为“全部符号

  4. (不确定)使用“默认隐藏的符号”。这与代码生成有关,不应影响链接,但以防上述所有内容都失败...