zoukankan      html  css  js  c++  java
  • 趣探 Mach-O:加载过程

    execve

    这个函数只是直接调用 __mac_execve(),对于源码内部实现细节,可以看XNU的源代码

    __mac_execve()

    源码可以参考:bsd/kern/kern_exec.c

    主要是为加载镜像进行数据的初始化,以及资源相关的操作,在其内部会执行exec_activate_image(),镜像加载的工作都是由它完成的

    int
    __mac_execve(proc_t p, struct __mac_execve_args *uap, int32_t *retval)
    {
    
        struct image_params *imgp;
        
        // 初始化imgp数据
        .......
        
        exec_activate_image(imgp);
        
    }
    

    exec_activate_image

    源码可以参考:bsd/kern/kern_exec.c

    主要是拷贝可执行文件到内存中,并根据不同的可执行文件类型选择不同的加载函数,所有的镜像的加载要么终止在一个错误上,要么最终完成加载镜像。在OS X中专门处理可执行文件格式的程序叫execsw镜像加载器

     
     

    OS X有三种可执行文件,mach-oexec_mach_imgact处理,fat binaryexec_fat_imgact处理,interpreter(解释器)由exec_shell_imgact处理

    exec_mach_imgact

    源码可以参考:bsd/kern/kern_exec.c

    主要是用来对Mach-O做检测,会检测Mach-O头部,解析其架构、检查imgp等内容,并拒绝接受DylibBundle这样的文件,这些文件会由dyld负责加载

    然后把Mach-O映射到内存中去,调用load_machfile()

    load_machfile

    源码可以参考:bsd/kern/mach_loader.c

    load_machfile会加载Mach-O中的各种load monmand命令。在其内部会禁止数据段执行,防止溢出漏洞攻击,还会设置地址空间布局随机化(ASLR),还有一些映射的调整。

    真正负责对加载命令解析的是parse_machfile()

    parse_machfile

    源码可以参考:bsd/kern/mach_loader.c

    parse_machfile会根据load_command的种类选择不同的函数来加载,内部是一个Switch语句来实现的



    作者:Joy___
    链接:https://www.jianshu.com/p/8498cec10a41
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    jquery实现选项卡(两句即可实现)
    常用特效积累
    jquery学习笔记
    idong常用js总结
    织梦添加幻灯片的方法
    LeetCode "Copy List with Random Pointer"
    LeetCode "Remove Nth Node From End of List"
    LeetCode "Sqrt(x)"
    LeetCode "Construct Binary Tree from Inorder and Postorder Traversal"
    LeetCode "Construct Binary Tree from Preorder and Inorder Traversal"
  • 原文地址:https://www.cnblogs.com/feng9exe/p/12459415.html
Copyright © 2011-2022 走看看