我们有一个拥有多个应用程序的大型项目,因此我们将公共代码转移到单个动态框架中.到目前为止,在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
一点背景:我们已经将ffmpeg和其他几个针对ARM64,ARMv7和x86_64架构编译的胖库添加到框架中.我们有一些文本重定位错误,通过将-read_only_relocs suppress添加到链接器标志来解决.
如果我们取出ffmpeg和相关库,它可以在32位设备上正常工作.
有人遇到过这样的错误吗?任何指针或帮助将非常感激.
解决方法
在框架内使用Mach-O Type的“动态库”时,我们遇到了同样的问题.切换到“可重定位目标文件”修复了该问题.问题似乎在于库内的文本重定位.
如更多细节here所述:
“文本重定位是在运行时使用绝对寻址模式引用具有变量地址的对象的结果.指令编码本身包含地址,因此必须更改二进制文件的可执行文本以包含正确的地址考虑运行时的实际加载地址.“
FFMPEG使用文本重定位,这是Android M上的一个大问题(https://trac.ffmpeg.org/ticket/4928)
由于它们不会很快被修复,“可重定位目标文件”似乎是唯一的选择.