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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Linux如何编译安装源码包软件
    安装python发行版本,并用conda来管理Environments,Python,packages
    命令远程传输文件
    CentOS7更换yum源为阿里云镜像源
    CentOS安装pip并修改源为豆瓣源
    查看SELinux状态及关闭SELinux
    解决CentOS查询不到ip
    chmod变更文件或目录的权限
    开启HTML5之旅。。。
    JDK 动态代理的实现
  • 原文地址:https://www.cnblogs.com/feng9exe/p/12459415.html
Copyright © 2011-2022 走看看