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-o
由exec_mach_imgact
处理,fat binary
由exec_fat_imgact
处理,interpreter
(解释器)由exec_shell_imgact
处理
exec_mach_imgact
源码可以参考:
bsd/kern/kern_exec.c
主要是用来对Mach-O
做检测,会检测Mach-O
头部,解析其架构、检查imgp
等内容,并拒绝接受Dylib
和Bundle
这样的文件,这些文件会由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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。