gpt4 book ai didi

ios - 使用 Bitcode 更改 LC_ID_DYLIB 重新编译

转载 作者:行者123 更新时间:2023-12-01 15:44:48 26 4
gpt4 key购买 nike

我正在从源代码为 iOS 构建一个动态框架,启用位码(使用 cmakexcodebuild)。我用 lipoinstall_name_tool制作一个胖二进制文件并更新 LC_ID_DYLIB , 以便正确加载二进制文件。当我归档应用程序时,框架已正确签名并与应用程序一起打包。这是 file 的输出:

MyFramework: Mach-O universal binary with 3 architectures: [arm_v7: Mach-O dynamically linked shared library arm_v7] [arm_v7s] [arm64]
MyFramework (for architecture armv7): Mach-O dynamically linked shared library arm_v7
MyFramework (for architecture armv7s): Mach-O dynamically linked shared library arm_v7s
MyFramework (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64

看着 otool -l LC_ID_DYLIB 的输出显示这个:
Load command 4
cmd LC_ID_DYLIB
cmdsize 64
name @rpath/MyFramework.framework/MyFramework (offset 24)
time stamp 1 Thu Jan 1 01:00:01 1970
current version 1.0.0
compatibility version 1.0.0

这一切似乎都是正确的。如果我将此文件上传到 App Store,它会被正确上传和处理。从 App Store 运行它后,由于加载动态框架,它在启动后立即崩溃。众所周知,应用程序是从 App Store 上的 Bitcode 重新编译的,因此我通过导出为 Ad-Hoc 并按照 Technical Note TN2432 中的建议启用“从 Bitcode 重建”选项启用来模拟这一点。 .检查 .ipa(在启动后也崩溃了)和有问题的框架,这是 otool -l 的输出:
Load command 3
cmd LC_ID_DYLIB
cmdsize 128
name /Users/legoless/Downloads/ios/build/build-iphoneos/lib/Release/MyFramework_ios.framework/MyFramework_ios (offset 24)
time stamp 1 Thu Jan 1 01:00:01 1970
current version 1.0.0
compatibility version 1.0.0

很明显 LC_ID_DYLIB这个库的名称是不正确的,这是在制作胖二进制文件之前最初构建框架的位置的绝对路径。这被替换在 从位码重建 步骤,但我不知道为什么或什至不知道此路径存储在现有 中的位置Mach-O 文件。我两个都用了 otoolobjdump尝试在 Mach-O 二进制文件中找到引用的工具,但没有运气。

实际上,另一个框架依赖于这个框架,这是目标框架的加载命令:
Load command 14
cmd LC_LOAD_DYLIB
cmdsize 64
name @rpath/MyFramework.framework/MyFramework (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1.0.0
compatibility version 1.0.0

再次使用 Bitcode 重建后,这里的引用也发生了变化:
Load command 13
cmd LC_LOAD_DYLIB
cmdsize 128
name /Users/legoless/Downloads/ios/build/build-iphoneos/lib/Release/MyFramework_ios.framework/MyFramework_ios (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1.0.0
compatibility version 1.0.0

这仅适用于相关框架,但不适用于其他框架,其中 @rpath保持原样。

我的问题仍然存在:

这个绝对路径引用存储在哪里?以及如何删除它,以便从 Bitcode 重建不再影响它?

谢谢!

最佳答案

对此问题进行了详细调查,发现 .xar 在 Mach-O 文件中包含位代码的存档存储了相当多的信息,包括链接器标志。此信息存储在 目录 存档,用于在位码重新编译时重新编译/重新链接库。

就我而言,我正在使用 构建框架。 cmake ,将此信息添加到 链接器标志 .配置 INSTALL_NAME_DIRBUILD_WITH_INSTALL_RPATH并使用@rpath 有效地解决了该问题,install_name_tool不再需要了。

关于ios - 使用 Bitcode 更改 LC_ID_DYLIB 重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41119198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com