mach-o的执行

要想通过BSD系统调用来创建进程,父进程必须调用fork系统调用。fork调用会创建一个父进程副本,然后将新进程(子进程)的ID返回给父进程。父进程和新进程都会从fork调用处继续执行,唯一的区别是fork为父进程返回新进程ID,而为新进程返回零。(如果新进程创建失败,fork函数将返回-1给父进程,并设置errno给特定的错误值。)

要运行不同的可执行体,父进程必须调用execve系统调用,并将可执行体位置路径名传递给调用。execve调用会用一个不同的可执行文件来取代当前内存中的程序。

Mach-O可执行文件有一个头部,由一些加载命令(load commands)组成。对于那些使用共享库框架的程序来说,这些加载命令中有一条指定了用来加载程序的动态链接器的位置。如果你使用的是Xcode,那么这个位置始终是/usr/lib/dyld,也就是标准的OS X动态链接器。

当调用execve时,内核首先会加载指定的程序文件,并检查文件开始处的mach_header结构。内核会验证该文件是否是一个有效的Mach-O文件,并解释存放在头部的加载命令。然后,内核会加载由加载命令指定的动态链接器到内存中,并在程序文件上执行该动态链接器。

动态链接器会加载主程序链接的所有的共享库(依赖库),并绑定足够多的符号来启动该程序。然后,它会调用入口点函数。在生成时,静态加载器会通过目标文件/usr/lib/ctrl.o加载标准入口点函数到主可执行文件。该函数会为内核建立一个运行时环境状态,并为C++对象调用经常初始化器,初始化Objective-C运行时,而后调用程序的main函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值