3

我需要为 Android 和 iPhone 项目中使用的跨平台库使用一些 RSA 签名方案。环顾四周后,我选择了cryptopp,但它对于静态链接来说太大了。因此,我将源代码和标题添加到我的项目中,以便仅将相关部分链接到我的库中。它仍在为最终的库添加几 MB 的发布版本。

  1. 有没有更简单或更有效的方法来减少库或cryptopp的大小?

  2. 我对编译过程中的模板生成并不十分熟悉。但我记得模板可以添加相当多的代码。有没有办法停止/改进这个(编译器选项?)?

  3. 如果我想从项目中手动删除我的简单用例未使用的所有源/头文件,是否有任何工具可以提供帮助?用它的模板挖掘cryptopp需要相当长的时间,我总是支持自动流程;)

任何帮助是极大的赞赏!

4

2 回答 2

4

如果你想使用crypto++(并且有很多很好的理由你想要),这可能是你最好让链接器完成他们的工作的场景。前段时间我担心过这个问题,我手工做的比优化链接器做得更好。

我通过清理我的旧测试应用程序来确认这一点,该应用程序使用 crypto++ 生成一个新的随机 RSA 密钥,签署一个字符串并验证该字符串。这是我看到的数字:

  • libcryptopp.a - 使用 clang++ 针对 iOS SDK 5.0 作为静态库构建的加密++。没有特殊的方法来最小化大小,只是使用 -fvisibility=hidden -fvisibility-inlines-hidden 和 -Os: 22.5MB

  • 来自默认 iOS 单一视图模板的空应用,使用 -Os 构建:34KB

  • 添加了“自测”代码的相同空应用程序生成密钥对,使用 RSA/SHA256 对字符串进行签名(并因此散列),对其进行十六进制编码,打印签名,解码签名并验证原始字符串上的签名,构建从上面的第一个项目符号中使用 -Os 针对 libcryptopp.a:389KB

链接器似乎在这里做得很好。如果您看到一些完全不同的东西,请确保您真的在查看发布二进制文件。

于 2012-02-06T03:17:24.100 回答
0

RSA 签名 ... 在 Android 和 iPhone 项目中。环顾四周后,我选择了cryptopp ...

相关(来自 Crypto++ wiki):Android(命令行)iOS(命令行)

有没有一种更简单或更有效的方法来减少库或cryptopp的大小?

不,iOS 上的编译器和 libtool 无法判断您可能需要(或不需要)什么,因此您可以在存档中获取所有内容。Android 上提供的 GNU 工具也是如此。

我对编译过程中的模板生成并不十分熟悉。但我记得模板可以添加相当多的代码。有没有办法停止/改进这个(编译器选项?)?

没有简单的方法。但是您可以浏览源代码并提取显式模板实例化。您想查找用CRYPTOPP_DLL_TEMPLATE_CLASS. 您可以在config.h 中看到它是如何定义的。

但我不会担心,因为您可以让链接器从静态库中丢弃大部分(或全部?)未使用的代码。

如果我想从项目中手动删除我的简单用例未使用的所有源/头文件,是否有任何工具可以提供帮助?

不,我不知道有任何工具可以做到这一点(类似于 Boost's bcp)。我过去曾尝试过此方法,但沮丧地放弃了。

你没有问什么:当链接到 Crypto++ 的静态版本时,你如何减小最终二进制文件的大小。以下是答案:

  • 两个都

    • 调整GNUmakefile

    • CXXFLAGS += -Os

    • CXXFLAGS += -ffunction-sections -fdata-sections

  • iOS

    • 调整GNUmakefile

    • CXXFLAGS += -gfull

    • LDFLAGS += -dead_strip

  • 安卓

    • CXXFLAGS += -Wl,--exclude-libs,ALL

    • arm-linux-androideabi-strip使用--strip-debug,--strip-unneeded--strip-all在您的最终库或可执行文件上运行

这两种技术都包含在 Wiki 页面中。如果你在 Linux 上工作,还有另一个 wiki 页面来介绍Crypto++ Linux上的大小缩减和剥离。

如需更多阅读,请参阅性能和响应性调优(适用于 iOS)、arm-eabi-strip 和二进制大小,以及删除未使用的函数/死代码(适用于 Android 和 Linux)。

于 2013-10-02T05:17:51.033 回答