FAT_MAGIC,FAT_CIGAM,MH_MAGIC,MH_CIGAM及大小端

在mach-o相关Api中会出现如下的常量

#define FAT_MAGIC   0xcafebabe
#define FAT_CIGAM   0xbebafeca  /* NXSwapLong(FAT_MAGIC) */

#define FAT_MAGIC_64    0xcafebabf
#define FAT_CIGAM_64    0xbfbafeca  /* NXSwapLong(FAT_MAGIC_64) */

struct fat_header {
    uint32_t    magic;      /* FAT_MAGIC or FAT_MAGIC_64 */
    uint32_t    nfat_arch;  /* number of structs that follow */
};

其中明确说明了
uint32_t magic;/* FAT_MAGIC or FAT_MAGIC_64 */
但是在MachOView工具打开微信App的时候:

FAT_MAGIC,FAT_CIGAM,MH_MAGIC,MH_CIGAM及大小端_第1张图片
image.png

居然是 FAT_CIGAM,这就让我百思不得其解。

查询到相关资料发现了注意涉及到内存布局中的大小端概念。

注意到这里CIGAMMAGIC的颠倒(reverse)字符串,0xbebafeca0xcafebabe的颠倒数字(这里是以2位为一个整体)。

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

FAT_MAGIC,FAT_CIGAM,MH_MAGIC,MH_CIGAM及大小端_第2张图片
image.png

而且现在绝大部分操作系统都是小端模式,猜测可能是因为可以方便的进行加减运算,毕竟操作系统中加减元素是占大部分的。

也可以用如下的代码来测试大小端模式:

    short int x;
    char x0,x1;
    x = 0x1122;
    x0 = ((char*)&x)[0]; //低地址单元
    x1 = ((char*)&x)[1]; //高地址单元
    NSLog(@"0x%x", x0);

若x0=0x11,则是大端; 若x0=0x22,则是小端。
经测试发现,iOS系统是小端模式,因此微信App的fat_headermagicCIGAM
以上就是MachO的MAGIC数字介绍。

你可能感兴趣的:(FAT_MAGIC,FAT_CIGAM,MH_MAGIC,MH_CIGAM及大小端)