我们有一个包含多个应用程序的大型项目,因此我们已将通用代码移至单个动态框架中。到目前为止在 64 位设备上运行良好,但在 32 位设备上崩溃如下:
dyld: REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB has segment 0 which is not a writable segment (__TEXT) in
/path/to/MyApp.app/Frameworks/MyFramework.framework/MyFramework
一点背景:我们已经针对 ARM64
、ARMv7
和 x86_64
编译了 ffmpeg 和其他一些胖库> 然后将架构添加到框架中。我们有一些文本重定位错误,通过将 -read_only_relocs suppress
添加到链接器标志来解决。
如果我们去掉 ffmpeg 和相关库,它在 32 位设备上工作正常。
有人遇到过这样的错误吗?任何指针或帮助将不胜感激。
最佳答案
在您的框架内为 Mach-O 类型使用“动态库”时,我们遇到了同样的问题。切换到“可重定位目标文件”解决了这个问题。问题似乎与库内的文本重定位有关。
如更多详细信息所述here : “文本重定位是在运行时使用绝对寻址模式引用具有可变地址的对象的结果。指令编码本身包含地址,因此二进制文件的可执行文本必须更改为包含正确的地址考虑到运行时的实际加载地址。”
FFMPEG 使用文本重定位,这在 Android M 上是个大问题 (https://trac.ffmpeg.org/ticket/4928)
由于它们不会很快被修复,“可重定位目标文件”似乎是唯一的选择。
关于ios - Xcode 7.2 Dynamic Framework 32 位设备错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35486267/