Fork me on GitHub

随笔分类 -  程序员的自我修养

摘要:1. 动态链接器的自举 我们知道动态链接器本身也是一个共享对象,但是事实上它有一些特殊性。对于普通共享对象文件来说,它的重定位工作由动态链接器来完成。他也可以依赖其他共享对象,其中的被依赖共享对象由动态链接器负责链接和装载。可是对于动态链接器来说,它的重定位工作由谁来完成?它是否可以依赖于其他共享对 阅读全文
posted @ 2019-03-17 19:45 yooooooo 阅读(5441) 评论(2) 推荐(2) 编辑
摘要:在了解了共享对象的绝对地址的引用问题后,我们基本上对动态链接的原理有了初步的了解,接下来的问题是整个动态链接具体的实现过程了。动态链接在不同的系统上有不同的实现方式。ELF的动态链接的实现方式会比PE的简单一点,在这里我们先介绍ELF的动态链接过程在LINUX下的实现,最后我们会专门的章节中介绍PE 阅读全文
posted @ 2019-03-16 20:51 yooooooo 阅读(1135) 评论(0) 推荐(0) 编辑
摘要:动态链接的确有很多优势,比静态链接要灵活得多,但它是以牺牲一部分性能为代价的。据统计ELF程序在静态链接下要比动态库稍微快点,大约为1%~5%,当然这取决于程序本身的特性及运行环境等。我们知道动态链接比静态链接慢的主要原因是动态链接下对于全局和静态的数据访问都要进行复杂的GOT定位,然后间接寻址;对 阅读全文
posted @ 2019-03-10 22:52 yooooooo 阅读(1831) 评论(0) 推荐(4) 编辑
摘要:1. 固定装载地址的困扰 通过上一节的介绍我们已经基本了解了动态链接的概念,同时我们也得到了一个问题,那就是:共享对象在被装载时,如何确定它在进程虚拟地址空间中的位置?为了实现动态链接,我们首先会遇到的问题就是共享对象地址的冲突问题。 让我们先来回顾一下第2章提到的,程序模块的指令和数据中可能会包含 阅读全文
posted @ 2018-09-11 16:39 yooooooo 阅读(572) 评论(0) 推荐(1) 编辑
摘要:动态链接 要解决空间浪费和更新困难这两个问题最简单的办法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态地链接在一起。简单地讲,就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。也就是说,把链接这个过程推迟到了运行时再进行,这就是动态链接( Dynamic Linki 阅读全文
posted @ 2018-09-08 22:54 yooooooo 阅读(561) 评论(0) 推荐(0) 编辑
摘要:1.重定位 在完成空间与地址的分配步骤之后,链接器就进入了符号解析与重定位的步骤,这也就是静态链接的核心作用; 在分析符号解析和重定位之前,首先让我们来看看“a.o”里面是怎么使用这两个外部符号,也就是说我们在“a.c”源程序里面使用了“shared”变量和“swap”函数,那么编译器在将“a.c” 阅读全文
posted @ 2018-05-31 17:41 yooooooo 阅读(4197) 评论(3) 推荐(0) 编辑
摘要:当我们有两个目标文件时,如何将它链接起来成一个可执行文件?这个过程发生了什么?这基本上就是链接的核心内容:静态链接。 我们以使用下面源文件“a.c”和“b.c"作为例子展开分析: 我们首先将编译成a.o和b.o;从代码中可以看到,“b.c”总共定义了两个全局符号,一个是变量“shared”,另外一个 阅读全文
posted @ 2018-04-18 18:54 yooooooo 阅读(1057) 评论(0) 推荐(1) 编辑
摘要:ELF目标文件格式最前部ELF文件头(ELF Header),它包含了描述了整个文件的基本属性,比如ELF文件版本、目标机器型号、程序入口地址等。其中ELF文件与段有关的重要结构就是段表(Section Header Table) ELF文件格式 1. 可重定向文件:文件保存着代码和适当的数据,用来 阅读全文
posted @ 2018-04-16 12:08 yooooooo 阅读(9990) 评论(0) 推荐(9) 编辑
摘要:摘自《程序员自我修养》 链接的原因 在一个程序被分割为多个模块以后,这些模块之间最后如何组合形成一个单一的程序是须要解决的问题。模块之间如何组合的问题可以归结为 模块之间如何通信的问题 ,最常见的属于静态语言的C、C++之间通信的方式,一种是模块之间的函数调用,另外一种是模块间的变量访问。函数访问须 阅读全文
posted @ 2018-04-12 17:06 yooooooo 阅读(1944) 评论(0) 推荐(0) 编辑
摘要:以下内容摘自《程序员的自我修养》 什么是线程? 线程(Thread),有时被称为轻量级(Lightweight Process, LWP),是程序执行流程的最小单元。一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成 。通常意义上,一个进程由一个到多个线程,各个线程之间共享程序的内 阅读全文
posted @ 2018-04-10 19:42 yooooooo 阅读(907) 评论(0) 推荐(2) 编辑