●该章节主要讲解的是ELF文件的结构。 web
●静态库的概念编程
●动态库(又叫共享库)的概念,通常用于操做系统,普通应用程序做用不大。数组
●程序的加载过程。服务器
该书中对连接的解释也不够详细。在章节最后,做者也认可:在计算机系统文献中并无很好的记录连接。由于连接是处在编译器、计算机体系结构和操做系统的交叉点上,他要求理解代码生成、机器语言编程、程序实例化和虚拟存储器。它刚好不落在某个一般的计算机系统领域中。函数
该章节讲述Linux的X86系统,使用标准的ELF目标文件,不管是什么样的操做系统,细节可能不尽相同,可是概念是相同的。工具
读完这一章节后,对“符号”的概念非常模糊。性能
这里再说一下编译系统。大多数编译系统提供编译驱动程序,它表明用户在须要的时候调用语言预处理、编译器、汇编器、和连接器。我本身画了一个结构图。spa
7.2静态连接操作系统
可定位目标文件的结构:让你深刻了解程序段,数据段,bss段,符号表等等。.net
7.4可重定位目标文件——参考7.3
符号表是一个数组,数组里存放一个结构体。
原则是:编译器只容许每一个模块中每一个本地符号只有一个定义。并且对全局的符号的解析很棘手,由于多个目标文件可能会定义相同的符号。C++和Java使用mangling手段来支持重载。
多重定义的全局符号,请看下面的程序:
你们能猜到输出的结果是15212;这是由于:bar.c中的x全局变量没有初始化,致使函数f中使用的是foo文件中的x变量。
根据Unix链接器使用下面的规则来处理多重定义的符号:
●规则1:不容许有多个强符号。
●规则2:若是有一个强符号和多个弱符号,那么选择强符号(这就是上面这道题的答案,初始化的int x=15213是强符号,而int x;是弱符号)
●规则3:若是有多个弱符号,那么从这些弱符号中任意选择一个(多么可怕啊)
静态库
事先写好的一些可重定位的目标文件打包成一个单独的文件,它能够用做链接器的输入。当链接器构造一个输出的可执行文件时,它只拷贝静态库里被应用程序引用的目标模块。(稍后讲解动态连接库,也称之为共享库)。
在Unix系统中,静态库以一种成为存档(archive)的特殊文件格式存放在磁盘中。存档文件是一组链接起来的可重定位目标文件的集合。有一个头部用来描述每一个成员目标文件的大小和位置。存档文件的后缀是.a标识。是否能够这么理解.a文件的结构呢?(本身画图)
下面用展现一个静态库链接的过程:
7.7重定位
参考7.3节图中央部分。可执行文件跟可重定位目标文件很是类似。只是可执行文件多了“init”和“段头部表"少了,”.rel.text“和”.rel.data“两个节。
从7.3节图中能够发现,右部是加载后的程序结构。ELF目标文件被设计的很是容易加载到存储器。须要注意的是Unix中,程序总的代码段老是从0x0804800处开始(这就是虚拟存储器的做用)。数据段是在接下来的下一个4KB对齐的地址处。运行时堆在"读/写段"以后接下来的第一个4KB对齐的地址处,并经过malloc库往上增加。而栈老是往下生长。
动态库是为了解决静态库的两个弊端而出现的,静态库的两个弊端:1)静态库更新后,程序要得到该静态库而后再编译。2)不一样程序可能使用相同的静态库,致使不少静态库中的代码重复被加载到存储器中。
共享库是致力于解决静态库的缺陷而出现的现代创新型产物。共享库是一块目标模块,在运行时,能够加载到任意的存储器地址,并和一个在存储其中的程序连接起来。这个过程称之为”动态连接“,是由一个叫作”动态连接器“的程序来完成的。
共享库是以梁总方式来共享的:1)全部引用该库的程序都共享一个.so文件中的代码和数据,而不是静态库同样拷贝一份。2)在存储器中,一个共享库的.text节的一个副本能够被不一样正在运行的进城共享,从而节约宝贵的存储器资源。(Unix中动态库以.so后缀表示。)
理解动态库=共享库的概念很是重要。动态库通常是大型软件或者操做系统的最爱,由于对于普通应用来讲,没有那么多库给别人使用,绝大多数都是本身用,因此静态库就够了。
应用程序还可能从应用程序中加载和连接任意共享库,而无需编译时连接那些库到应用中(这个牛逼大了)!
Windows中的更新大部分是这个技术。另外还有构建高性能web服务器。
Linux为动态连接器提供了一系列简单的接口:
Java定义了一个标准的调用规则,叫作Java本地接口(Java NativeInterface,JNI),它容许Java程序调用本地的C和C++函数。JNI的基本思想是将本地的C函数,如foo,编译到共享库中,如foo.so .当一个正在运行的Java程序试图调用函数foo时,Java解析程序利用dlopen接口(或者相似的接口)动态连接和加载foo.so,而后调用foo。
7.12与位置无关的代码(PIC)
7.13处理目标文件的工具
原文:http://blog.csdn.net/hherima/article/details/8953787