美文网首页
FAT_MAGIC,FAT_CIGAM,MH_MAGIC,MH_

FAT_MAGIC,FAT_CIGAM,MH_MAGIC,MH_

作者: 传说中的汽水枪 | 来源:发表于2019-08-20 10:27 被阅读0次

    在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的时候:

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

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

    注意到这里CIGAMMAGIC的颠倒(reverse)字符串,0xbebafeca0xcafebabe的颠倒数字(这里是以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_

          本文链接:https://www.haomeiwen.com/subject/zksusctx.html