链接器与调试器
文章平均质量分 94
记录《程序员自我修养——链接、装载与库》、Oracle官方的《链接程序和库指南》等系统软件读书笔记,以及一些链接器与调试器相关的东西
yelvens
我很懒,什么都没留下…
展开
-
线程局部存储(TLS)
(Thread Local Storage,TLS),是一种变量的存储方法,这个变量在它所在的线程内是全局可访问的,但是不能被其他线程访问到,这样就保持了数据的线程独立性。而熟知的全局变量,是所有线程都可以访问的,这样就不可避免需要锁来控制,增加了控制成本和代码复杂度。原创 2024-03-27 10:45:20 · 912 阅读 · 0 评论 -
DWARF常见section总结
中源代码行号与机器码指令地址之间的映射关系,要先读取其中的内容,再按照规则和方法解析读取到的内容,最终就可以得到如上面代码段所示的内容。节中声明了很多中不同的Dwarf类型组合(我们可以想象为C语言中的结构声明,而这些类型都是DWARF格式约定好的类型),然后在。段包含了程序中的行号信息,通过读取、解析该段的内容,我们就能知道源代码行号与机器码指令地址之间的映射关系。节中的那个类型,也就是说明自己是那个结构的实例。这两个节是天生在一起的两个节,它们是一个“实例和类型”的关系,也就是。节中的一个结构的实例。原创 2023-12-22 17:12:17 · 1317 阅读 · 0 评论 -
链接装载与库:第十二章——系统调用与API
在现代的操作系统里,程序运行的时候,本身是没有权利访问多少系统资源的。由于系统有限的资源有可能被多个不同的应用程序同时访问,因此,如果不加以保护,那么各个应用程序难免产生冲突。所以现代操作系统都将可能产生冲突的系统资源给保护起来,阻止应用程序直接访问。这些系统资源包括文件、网络、IO、各种设备等。举个例子,无论在Windows下还是Linux下,程序员都没有机会擅自去访问硬盘的某扇区上面的数据,而必须通过文件系统;也不能擅自修改任意文件,所有的这些操作都必须经由操作系统所规定的方式来进行,比如我们使用。原创 2022-09-05 17:02:02 · 739 阅读 · 0 评论 -
链接装载与库:第十一章——运行库
除了之前的14个头文件,剩下的15个头文件(C89标准)为:assert.h、ctype.h、errno.h、float.h、limits.h、locale.h、math.h、setjmp.h、signal.h、stdarg.h、stddef.h、stdio.h、stdlib.h、string.h、time.h。glibc的启动过程在不同的情况下差别很大,比如静态的glibc和动态的glibc的差别,glibc用于可执行文件和用于共享库的差别,这样的差别可以组合出4种情况,这里只选取最简单的。原创 2022-09-03 16:11:17 · 983 阅读 · 0 评论 -
链接装载与库:第八章——Linux共享库组织
这样保证了所有的以SO-NAME为名的软链接都指向系统中最新版的共享库。当共享库进行升级的时候,如果只是进行增量升级,即保持主版本号不变,只改变次版本号或发布版本号,那么我们可以直接将新版的共享库替换掉旧版,并且修改SO-NAME的软链接指向新版本共享库,即可实现升级;由于全局符号介入这个机制的存在,LD_PRELOAD里面指定的共享库或目标文件中的全局符号就会覆盖后面加载的同名全局符号,这使得我们可以很方便地做到改写标准C库中的某个或某几个函数而不影响其它函数,对于程序的调试或测试非常有用。原创 2022-09-01 19:50:13 · 647 阅读 · 0 评论 -
链接装载与库:第七章——动态链接
将程序的模块互相分割开,不让它们静态地链接在一起;即不对那些组成程序的目标文件进行链接,等到程序运行时再链接。有如Program1和Program2两个程序,并假定保留了Program1.o、Program2.o和Lib.o三个文件。当我们需要运行Program1这个程序时,系统首先加载 Program1.o,而系统发现Program1.o中用到了Lib.o,即Program1.o依赖于Lib.o,此时系统加载Lib.o,并将其加载至内存。所有需要的目标文件加载完毕后,若依赖关系满足,即所有的依赖文件都在磁原创 2022-08-16 08:49:39 · 3589 阅读 · 2 评论 -
链接装载与库:第六章——可执行文件的装载与进程
当linux系统在bash下输入一个命令执行ELF的时候。首先在用户层面,bash进程会调用fork系统调用创建一个新的进程,然后新的进程调用execve系统调用执行指定的ELF文件。原先的bash进程继续返回等待刚才启动的新进程结束,然后继续等待用户输入命令。在进入execve系统调用之后,linux内核就开始进行了真正的装载工作。httpshttpshttpshttpshttpshttps。...............原创 2022-07-27 13:16:09 · 558 阅读 · 0 评论 -
链接装载与库:第四章——静态链接
整个静态链接会使用下面两个源代码例子来展开分析,使用将源文件分别编译成目标文件和。一、空间与地址分配对于链接器来说,整个链接过程中,它就是将几个输入目标文件加工后合并成一个输出文件。在这里输入的目标文件是和,输出文件是可执行文件。可执行文件中的代码段和数据段都是由输入的目标文件合并而来的。对于多个输入目标文件,链接器如何将它们的各个段合并到输出文件?一个最简单的方案就是将输入的目标文件按照次序叠加起来,如下图所示:直接将各个目标文件依次合并。但是这样做会造成一个问题,在有很多输入文件的情况下,输出文件原创 2022-06-21 13:14:40 · 778 阅读 · 0 评论 -
链接装载与库:第三章——ELF文件结构
一、目标文件的格式目标文件就是源代码编译后但未进行链接的那些中间文件(Windows的.obj和Linux的.o),它跟可执行文件的内容与结构很相似,所以一般跟可执行文件格式一起采用一种格式存储。从广义上看,目标文件与可执行文件的格式其实几乎是一样的,所以我们可以广义地将目标文件与可执行文件看成是一种类型的文件。在Windows下,它们存储格式是PE-COFF文件格式。在Linux下,它们存储格式是ELF文件格式。Linux下符合ELF格式的文件主要有四种:可重定位文件、可执行文件、共享目标文件、核心转原创 2022-05-19 20:54:35 · 2069 阅读 · 0 评论