ios 架构版本 - 相同的代码

ios architecture versions - same code

不同的 iOS 体系结构二进制文件相同的整体代码,或者它们可以不同。

如果我要检查这些二进制文件的某些内容,例如 PIE、ARC 或 memcpy 等字符串。我是否需要检查两个精简二进制文件的相同内容,或者它们是否相同只是内存不同地址?

例如a fat binary consisting of armv7 and arm64, if the armv7 binary has PIE enabled, so will the arm64?

if the armv7 binary uses strcpy, the arm64 binary will also use strcpy?

进一步说明的示例:两个二进制文件包含相同的发现,这意味着在 TLDR 中如下所示?相同的代码,只是每个架构的编译方式不同。

armv7
0x001e7e44   665 _memcpy
0x001e7ea4   770 _strlen
0x001e7eac   772 _strncpy
0x001e85b4   665 _memcpy

arm64
0x00000001001be7f0   645 _memcpy
0x00000001001be904   746 _strlen
0x00000001001be91c   748 _strncpy
0x0000000100220f18   645 _memcpy

TLDR; 2 iOS 个二进制文件是否是相同的代码,只是根据体系结构进行了不同的编译?

胖二进制文件包含多个独立的 Mach-O 文件,它们根本不需要任何共同点。

当只为一个平台编译二进制文件时,这个事实几乎不会变得明显,但是当构建跨平台二进制文件时(某些研究工具在 macOS 和越狱的 iDevices 上 运行 很常见),没有真的有办法手动完成:

gcc -o program.macos program.c
xcrun -sdk iphoneos gcc -arch armv7 -arch arm64 -o program.ios program.c
lipo -create -output program program.macos program.ios

现在,通常一个胖 Mach-O 的多个切片包含为不同架构编译的相同代码库——毕竟,这就是预期用途。但是,这不是必需的,因为您可以 (免责声明:由我回答)。但正如我在那篇文章中所写的那样 post,这样做的用处非常有限,因为您无法控制所选的切片。

虽然细微的差异很常见,并且可能来自例如像这样的 C 代码:

void some_function(void)
{
#if __LP64__
    // do something
#else
    // do something else
#endif
}

我知道的例子包括使用(官方禁止的)IOKit 框架,其中 io_* 函数在 32 位上导出但在 64 位上不导出,这允许对前者进行简单导入但需要自制软件dlsym()样式扫码就在后面。

总结:

不同 Mach-O 的切片通常是从相同的代码库编译而来的吗? .
他们应该是吗? .
这有任何保证吗? 没有.