程序员的自我修养——链接,装载与库
Cry .
当你的能力配得上你的野心、梦想的时候,运气自然就会来了。
展开
-
程序员的自我修养——链接,装载与库(八)运行库
运行库是程序运行时所需要的库文件。 操作系统装载程序以后,首先运行的不是main函数,而是入口函数(往往是运行库的一部分)。 Linux下程序的运行步骤由4部分构成:操作系统在创建进程后,把控制权交到了程序的入口,这个入口往往是运行库的某个函数。 入口函数对运行库和程序运行环境进行初始化,包括堆栈,堆,I/O,线程,全局变量构造。 入口函数在完成初始化之后,调用main函数,正式开始执...原创 2020-02-15 17:02:26 · 300 阅读 · 0 评论 -
程序员的自我修养——链接,装载与库(七)内存
内存是承载程序的运行介质,也是程序进行各种运算和表达的场所。 栈(高地址->低地址)用于维护函数调用的上下文,离开了栈,函数调用无法实现。 堆(低地址->高地址)用于储存应用程序动态分配内存的内存区域。 可执行文件映像用于存储可执行文件在内存中的映像。 保留区存储内存中收到保护而非禁止访问的对象。 动态链接库映射区用于存储装载的动态链接库。 程序中出现的段错误或非法访问有两...原创 2020-02-14 16:48:55 · 291 阅读 · 0 评论 -
程序员的自我修养——链接,装载与库(六)Linux共享库的组织
Linux下共享库就是共享对象,因为共享对象可以被多个进程共享。 共享库的更新被分为两类:兼容更新(共享库更新后原有的接口不发生改变)和不兼容更新(共享库更新后原有的接口发生改变)。 ABI(二进制接口),主要包括一些函数调用的堆栈结构,符号命名,参数规则和数据结构的内存布局等方面。 使用共享库版本的方法可以解决共享库兼容性的问题。 共享库的文件libname.so.x.y.z x表示主...原创 2020-02-14 15:19:24 · 158 阅读 · 0 评论 -
程序员的自我修养——链接,装载与库(六)动态链接
静态链接使得不同的程序开发者和部门能够相对地开发和测试自己的程序模块,从某种意义上来讲大大促进了程序的开发效率,原来限制程序的规模也随之扩大,但是静态链接也存在浪费内存和磁盘空间,模块更新困难的问题。而且一旦程序中有任何模块的更新,整个程序就要重新链。 动态链接的基本思想:把程序按照块分成各个相对独立的部分,在程序运行时才将它们链接在一其形成一个完整的程序,而不是像静态链接一样把所有的程序模块都...原创 2020-02-12 18:53:33 · 341 阅读 · 0 评论 -
程序员的自我修养——链接,装载与库(五)
可执行文件只有装载到内存中才能被CPU执行。 程序是个静态的概念,它就是一些预先编译好的指令和数据集合的一个文件。进程是个动态的概念,它是程序运行时的一个过程,很多时候把动态库叫做运行时也有一定的含义。 程序运行时都会拥有自己的虚拟地址空,虚拟空间的大小由CPU的位数来决定(32位虚拟地址空间大小为4GB,64位虚拟地址空间的大小为无穷(目前阶段))。 C语言指针的大小的位数与虚拟地址空间的...原创 2020-02-11 21:36:45 · 229 阅读 · 0 评论 -
程序员的自我修养——链接,装载与库(四)静态链接
链接器在链接过程中将多个目标文件加工合并为一个文件。 层序链接:将多个目标文件安装次序叠加起来。但是这样会导致空间的浪费,产生大量的内部碎片。 相似段拟合:将相同性质段合并在一起。这个也是最实际的方法。 链接器合并各个段,也将.bss段进行合并,为目标文件分配地址空间(虚拟地址空间) 链接器进行链接时才用相似段拟合的方法,整个链接过程分为两步:第一 空间与地址的分配(链接器获得所有目标文件...原创 2020-02-10 20:33:23 · 223 阅读 · 0 评论 -
程序员的自我修养——链接,装载与库(三)
目标文件从结构上讲,它是编译后的可执行文件格式,只是还没有经过链接的过程。其中可能有些符号或有些地址还没有被调整。其实它本身就是按照可执行文件格式存储的,只是与真正的可执行文件在结构上稍有不同。 可执行文件的格式分为windows下的PE和linux下的ELF。 目标文件是源代码编译后未进行链接的中间文件(windows下的.obj,linux下的.o),与可执行文件的内容和结构很...原创 2020-02-09 16:45:20 · 215 阅读 · 0 评论 -
程序员的自我修养——链接,装载与库(二)
一个程序的运行,标准情况下,需要四个步骤:预处理,编译,汇编和链接。预处理阶段:源代码文件和相关的头文件被预编译成扩展名为.i的文件。预编译过程主要处理那些源代码文件中的以“#”开头的预编译指令。 编译阶段:编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。细分的化,编译过程一般可以分为6步:扫描,语法分析,语义分析,源代码优化,代码生成和目标...原创 2020-02-07 20:12:21 · 194 阅读 · 0 评论 -
程序员的自我修养——链接,装载与库(一)
程序员的自我修养——链接,装载与库这本书看了差不多有一个多月了,这本书讲了很多计算机底层的知识,也补充了我的知识盲区。但是感觉看完以后前面有的知识有遗忘,因此就想好好的总结一下,也可以更好的理解这本书。 计算机三个最重要的硬件是:中央处理器CPU,内存和I/O控制芯片。 为了协调I/O设备与总线之间的速度,也为了能够让CUP能够和I/O通信,每个设备都有一个I/O控制器。 ...原创 2020-02-07 12:06:07 · 630 阅读 · 0 评论