动态框架:如何隐藏局部符号?

dynamic framework: how to hide the local symbols?

我正在构建一个包含 iphonesimulator 和 iphoneos 框架的 .xcframework。有一些 Swift 代码和一些 C++ 代码,链接到一个共享对象(Mach-O 64 位动态链接共享库 arm64)。我用 -fvisibility=hidden 构建我的 C++,并且只导出我明确标记的符号。但是,当我 运行 nm -gC 时,我看到各种符号仍然存在 – 即使在使用此框架构建的 iOS 应用程序中,它们也是可见的。例如,我有一个内部 class Secret (它只在一个 cpp 文件中使用)。 nm -gC 向我展示(以及那里的所有黑客)

00010292 t Secret::getString() const

有没有办法隐藏此信息和其他敏感信息?

另一方面,我怎样才能保持自动生成的 _AlexSDKVersionNumber 导出?

您应该正确配置您的项目设置,以便剥离以隐藏内部名称。

前往 Your target > Build Settings > Deployment:

  1. Deployment Postprocessing 设置为 YES 以启用剥离。

  2. Strip Style 设置为 Non-Global Symbols

现在 nm 应该仅为您的二进制文件提供全局(外部)符号。

至于保持自动生成的 _AlexSDKVersionNumber 导出,我想出了一个不那么肮脏的技巧:

  1. 为我的项目添加一个头文件,命名为AlexSDK_vers.h:

    extern __attribute__ ((visibility("default"))) const double AlexSDKVersionNumber;
    
  2. 在构建设置中,添加OTHER_CFLAGS=-include${PWD}/AlexSDK/AlexSDK_vers.h