先说编译、链接过程
1.预编译展开宏
2.为每一个.cxx源文件编译一个目标文件
3.编译器合成这些目标文件成一个库文件,同时解析可以找到的符号引用
4.连接器把目标的库文件和所需要的引用的静、动态链接库进行链接,即需要把其他静态库合成到可执行文件中,转换相应的符号引用为地址,然后确保所引用的其他动态链接库的符号存在。最终生成可执行文件。

windows程序的启动过程
1.操作系统首先创建相应的进程并分配私有的进程空间,然后操作系统的加载器负责把可执行文件的数据段和代码段映射到进程的虚拟内存空间中。
2.加载器读入可执行程序的导入符号表,根据这些符号表可以查找出该可执行程序的所有依赖的动态链接库。
3.加载器针对该程序的每一个动态链接库调用LoadLibrary
(1)查找对应的动态库文件,加载器为该动态链接库确定一个合适的基地址。如果该基地址和动态链接库希望记载的基地址不同,加载器还要为该库做rebase,然后吧整个动态链接库映射到进程的虚拟内存空间中。
(2)加载器读取该动态链接库的导入符号表和导出符号表,比较应用程序要求的导入符号是否匹配该库的导出符号。
(3)针对该库的导入符号表,查找对应的依赖的动态链接库,如有跳转,则跳到3
(4)调用该动态链接库的初始化函数
4.初始化应用程序的全局变量,对于全局对象自动调用构造函数。
5.进入应用程序入口点函数开始执行

Linux
1.输入命令,回车
2.exec系统调用接管,为应用程序的运行准备一些环境便利爱那个等,并且为运行的命令找到相应的解释器。
3.通常应用程序解释器就是ld,ld接管控制权后先需要读取这个可执行程序的文件的一部分,包括文件头及共享对象(so文件)
4.针对每一个依赖的库,ld需要首先读入这个so的一部分文件头和相关信息,然后递归查找该共享对象所依赖的其它共享对象,直到最底层。
5.ld会把所有依赖的so映射到该程序进程空间的虚拟内存中(注意是 映射不是读入),由于,每一个共享对象在该进程的虚拟内存空间中占据不同的连续区域,他们的“基地址各不相同”,从而其内部的一些用绝对地址表示的符号需要做出相应的修改
6.初始化应用程序的全局变量,对于全局对象子哦的那个调用构造函数
7.从入口函数开始执行

[转] - C++程序启动过程的更多相关文章

  1. Envoy 源码分析--程序启动过程

    目录 Envoy 源码分析--程序启动过程 初始化 main 入口 MainCommon 初始化 服务 InstanceImpl 初始化 启动 main 启动入口 服务启动流程 LDS 服务启动流程 ...

  2. 深入理解UIApplication和ios程序启动过程

    在深入理解UIApplication前我们先了解ios程序的启动过程: UIApplication类在ios里面为app的管理和协调提供一个集中的点,每一个app有一个UIApplication的实例 ...

  3. [iOS基础控件 - 6.10.6] UIApplicationDelegate & 程序启动过程

    A.概念 1.移动app非常容易受到其他的系统.软件事件的干扰,如来电.锁屏 2.app受到干扰的时候,UIApplication会通知delegate,来代理处理干扰事件 3.delegate可以处 ...

  4. Android应用程序启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6689748 前文简要介绍了Android应用程 ...

  5. Android 应用程序启动过程源代码分析

    本文转自:http://blog.csdn.net/luoshengyang/article/details/6689748 前文简要介绍了Android应用程序的Activity的启动过程.在And ...

  6. Android程序启动过程深入解析

    当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样的? 什么是Linux内核? 桌面系统linux内核与Android系统linux内核有什么区别? 什么是引导装载程序 ...

  7. Android应用程序启动过程(二)分析

    本文依据Android6.0源码,从点击Launcher图标,直至解析到MainActivity#OnCreate()被调用. Launcher简析 Launcher也是个应用程序,不过是个特殊的应用 ...

  8. iOS程序启动过程笔记

    CHENYILONG Blog 笔记 一.iOS程序的完整启动过程(有storyboard)1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicati ...

  9. ios程序启动过程和UIWidnow介绍

    一.iOS程序的完整启动过程(有storyboard) 1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicationMain函数里面做了什么事情: ...

随机推荐

  1. hdu2089

    基本的数位dp #include <cstdio> #include <cstring> using namespace std; #define D(x) x ; int n ...

  2. HTML、CSS选择题

    Java EE软件工程师认证考试 试题库-选择题   一.    选择题(包括单选和双选) 1.D 以下(    )是HTML常用的块状标签(选择一项) A. <span> B. < ...

  3. FragmentTabHost+ViewPager实现底部按钮

    package com.example.fragmenttabdemo; import java.util.ArrayList; import java.util.List; import andro ...

  4. 数码管的封装实验 --- verilog

    数码管的封装实验.显示使能信号置高才可以显示.对于小数点不用,故不显示. 数码管分为共阴数码管和共阳数码管,数码管不同,编码不同,下面是两种数码管显示0-F以及消隐的不同编码: 共阴数码管(高有效): ...

  5. ***linux下用cron定时执行任务的方法

    名称 : crontab  使用权限 : 所有使用者 使用方式 : crontab file [-u user]-用指定的文件替代目前的crontab. crontab-[-u user]-用标准输入 ...

  6. 总结sqlserver数据库性能优化相关的注意事项

    一.分析阶段一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性.可用性.可靠性.安全性需求往往吸引了我们大部分的注意力,但是,我们必须注意,性能是很重要的非功能性需求,必须根据系统的特点 ...

  7. poj 3253:Fence Repair(堆排序应用)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23913   Accepted: 7595 Des ...

  8. oracle的启动过程(各个模式启动)

    启动模式详解 1.NoMount 模式(启动实例不加载数据库) 命令:startup nomount 讲解:这种启动模式只会创建实例,并不加载数据库,Oracle仅为实例创建各种内存结构和服务进程,不 ...

  9. .NET Framework 4.6的新东西

    我们知道.NET Framework 4.6即将随着Visual Studio 2015一同到来,目前依然是预览版.4.6和4,4.5,4.5.1和4.5.2是兼容的,也即安装4.6后会升级替代他们. ...

  10. chromium浏览器开发系列第四篇:如何调试最新chromium源码

    转自:http://blog.itpub.net/20687969/viewspace-1586513/ 附上上几篇文章地址,方便大家查看: 下载源码 编译源码 目录结构 接二连三的事情,时间比较紧张 ...