![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
链接、装载、库
文章平均质量分 88
givemefive_001
这个作者很懒,什么都没留下…
展开
-
库与运行库 内存
库与运行库 内存一.栈栈保存了一个函数调用所需要的维护信息,称为堆栈帧或活动记录,包含的内容:函数的返回地址和参数临时变量:包含函数的非静态局部变量以及编译器自动生成的其他临时变量保存的上下文:包括在函数调用前后需要保持不变的寄存器一个函数的活动记录用ebp和esp两个寄存器划定范围。esp寄存器始终指向栈的顶部,同时也就指向了当前函数的活动记录的顶部。而ebp寄存器指向了函数活动记录的一个固定位置,ebp寄存器又被称为栈指针,ebp指向的数据是调用该函数前ebp的值,这样在函数返回的时候,原创 2020-09-22 23:40:34 · 175 阅读 · 0 评论 -
汇编语言指令入门
比较经典的文章:传送门原创 2020-09-01 23:47:24 · 153 阅读 · 0 评论 -
动态链接
动态链接命令:gcc:-static:产生静态库-shared:产生共享库一.静态链接和动态链接的优缺点:静态链接:空间的浪费:静态链接,程序最后都会链接成一个可执行文件,那么功能相同的模块(可以用来共享),在每一个需要使用的程序中都有一个份,这样就会对计算机的内存和磁盘空间造成浪费。更新、部署、发布困难:当需要更新功能相同的模块(可以用来共享)时,所有的程序需要重新连接。动态链接:不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。节省空间,提供缓存命中率:在内原创 2020-09-01 16:15:29 · 978 阅读 · 0 评论 -
可执行文件的装载与进程
可执行文件的装载与进程命令:readelf:-l:查看ELF可执行文件的程序头表(保存Segment信息)一. 装载的方式:程序运行时是有局部性原理的,所以我们将程序最常见的部分驻留在内存中,而将一些不太常见的数据存放在磁盘里面,这就是动态装入的基本原理。常用的动态装载的方式:页映射页映射:不是一次性将程序的所有数据和指令都装入内存,而是将内存和所有磁盘中的数据和指令按照“页”为单位划分成若干个页,以后所有的装载和操作的单位就是页。二. 从操作系统角度看可执行文件的装载:一个进程最关键原创 2020-08-26 09:03:46 · 238 阅读 · 0 评论 -
静态链接
静态链接命令:objdump:-r:查看目标文件的重定位表ld:-e:-e main将main函数作为程序入口,ld链接器默认的程序入口为_start一.空间与地址分配:多个目标文件链接过程是将相似段合并,一般采用两步链接的方法:第一步:空间与地址分配:扫描所有的输入目标文件,并且获得它们的各个段的长度、属性和位置,并且将输入目标文件中的符号表中所有的符号定义和符号引用收集起来,统一放到一个全局符号表。这一步中,链接器将能够获取所有输入目标文件的段长度,并且将它们合并,计算出输出文原创 2020-08-24 23:15:21 · 261 阅读 · 0 评论 -
ELF文件里有什么
ELF文件里有什么一.文件头:ELF文件的开头是一个“文件头”,它描述了整个文件的魔数:用来描述文件的类型、字节序、ELF的主版本号,其余的暂时没有使用。文件属性,包括文件是否可执行、是静态链接还是动态链接及入口地址(如果是可执行文件)、目标硬件、目标操作系统等信息,还包括段表,段表是一个描述文件中各个段的数组,描述各个段在文件中的偏移位置及段的属性等。二.分段的意义:数据区域对于进程来说是可读写的,而指令区域对于进程来说是只读的,所以这两个虚拟区域的权限可以被分别设置成可读写和原创 2020-08-22 15:43:44 · 424 阅读 · 0 评论