《链接,装载和库》笔记

  1. 温故而知新

1硬件结构框架图:1)并没有以CPU或者主存为中心,而是一种三角架构;2PCI总线和ISA总线。(要记得)。

2软件系统结构图(要记得)。

3OS功能(主要就是针对CPU利用,I/O设备和内存):1CPU的利用:多通->分时->多任务,OS的权限不断增加的过程,分时和多任务不同,分时是在程序执行在特定指令时候才能切换到其他程序,如果有一个程序执行了while(1)整个系统就无法运行;2)设备驱动:驱动程序可以看成是OS一部分,运行在特权级,但它又与操作系统内核有一定的独立性。磁盘举例:read系统调用->OS文件系统(例如Linuxext3)->向磁盘驱动发送请求->磁盘驱动向硬件发送命令(通过读写I/O端口寄存器)。驱动程序上层是由操作系统定义的,就相当于补充了操作系统到硬件的那一段程序;3)内存问题:采用分段(虚拟地址)的方法解决了地址空间不隔离和程序运行的地址不确定问题,采用分页方法解决了内存使用效率低问题。

4 Linux的多线程:采用的是一种任务机制,fork创建一种写时复制的进程,clone可以产生共用资源的任务,就是线程。

  1. 编译和链接

1编译过程:1)预处理:gcc–E hello.c – o hello.i2)编译:gcc–S hello.i –o hello.s3)汇编:gcc–c hello.s –o hello.o

2编译过程:前端过程(不依赖处理器):词法分析(扫描器:记号)、语法分析(语法分析器:语法树)、语义分析(语义分析器:静态语义通常包括类型的匹配和类型的转换,会检测源码是否出错)、中间语言生成(源码级优化器)。后端过程:目标代码生成和目标代码优化。

3静态链接图

  1. 目标文件里有什么

1ELF格式的文件:目标文件(可重定位文件)、可执行文件、共享对象(动态链接库文件)、静态链接库文件。查看文件格式命令:filefoobar.o

2指令和数据段分开好处:1)安全;2)效率;3)在动态链接接中可以节省内存。

3挖掘SimpleSection.o

objdump–h SimpleSection.o各段基本信息,来自段表;

objdump–S –d SimpleSection.o十六进制显示各段内容,并反汇编代码段的内容;

readelf–h simplessection.o ELFHeader内容(e_entry可执行文件静态链接是虚拟入口地址,动态是连接器的地址;e_shstrndx段表字符串表在段表中的索引号);

readelf–S simpleSection.o 段表内容;

readelf–s simplesection.o符号表内容(sh_value:可执行文件是虚拟地址,目标文件COMMON是偏移,非COMMON是对称属性,sh_typeSAT_DYMATIC时是动态链接信息);

objump–r simplesection.o 重定位表

可执行文件和目标文件不同处:1sh_value2.bss3.rel.data或者.rel.textr_offset4)装载属性。

常用段:.text.data(初始化的全局静态变量和局部静态变量).rodata(只读变量,如const和字符串常量,如%d.bss(未初始化的全局变量和局部静态变量).shstrtab(段表字符串表,也就是段名表).strtab(字符串表:符号的名字和普通字符串).symtab(符号表).rel.text重定位表

4符号:弱符号(未定义的全局变量,不是引用,不是函数)和强符号(已经定义的全局变量),三条规则。

5强引用:都没有定义,符号决议时就算错;弱引用:都没有定义,符号决议时算警告。未定义的弱引用默认地址为0,。弱引用的作用:扩展功能和使用自定义函数。

  1. 静态链接

1静态链接过程:1)空间地址分配:合并相同段,收集符号,建立物理存储和虚拟存储的映射关系(可以告知进程虚存哪些地址可用,属于进程建立的步骤);2)重定位和符号解析:在符号地址确定的基础上重定位,使用到重定位表,有多种指令修正方式,此时的COMMON块最终在.bss中,符号解析得到符号决议的过程,容易产生连接错误的地方。

2静态库链接:一个c语言静态库libc.a和其他辅助性库(系统库,运行时库)才能让其编译连接成功。

3连接控制:实现最小的程序(从非main入口,只有一个段,不使用其他库函数)。

  1. 可执行文件的装载与进程

1进程建立:1)创建虚拟空间:就是虚存和物理存储映射建立;2)读取可执行文件头,建立虚存和可执行文件的映射关系,以数据结构形式保存在内核(这就是装载传统意义),因为产生的页错误就可以调用缺页进入虚存。

2 ELF的文件链接视图和执行视图:sectionsegment(作用:减少页,错做系统角度看);readelf–l sectionMapping.elf 查看elf文件的执行视图

cat/proc/21963/maps 查看运行程序的VMA

**3Linux内核装载ELF文件过程:bash程序(创建进程,调用execve函数,进入入口点,初始化进程环境,(就是十一章运行库的入口函数和初始化的工作,已经在内核中完成进程创建工作)地址修改成ELF文件的e_entry(静态是地址,动态是连接器,然后进行第六章第7步骤))。

  1. 动态链接

1动态链接的优点

2动态链接相比于静态链接的要解决的问题:1)怎么确定符号地址:装载时重定位(怎么知道是静态符号还是动态,链接时候引入了动态库,包含了动态符号);2)要把共享对象都先装入,再确定可执行文件(指的就是源文件生成的.o文件)装载位置;3)动态链接器的位置在.interp中;objump–s a.out(可执行文件)

3动态链接几个不同于静态连接的概念:1)连接后的文件就叫执行文件;2)共享对象肯定有动态链接器

4动态连接的几个段:1.dynamic;readelf–d lib.so (动态库文件)2.rel.dyn.rel.pltreadelf–r lib.so

5共享库就是动态连接库(共享文件组成的)

6动态链接器:1)动态链接时进程堆栈初始化信息:动态链接器要知道可执行文件的一些信息,如入口地址。

7动态装载步骤23)就是2要解决的问题):1)动态连接器自举;2)装载共享对象;3)重定位和初始化。

  1. 内存

  2. 运行库

1运行库包括的内容:1)启动及入口函数所需要依赖的其它函数等;2)标准函数:由c语言标准规范的c语言标准库所拥有的函数实现;3I/OI/O功能封装和实现;4)堆:堆的封装和实现;5)其他。

2概念区分:运行库,系统库,共享库,动态链接库,静态连接库。

  1. Linux系统调用和C标准库关系

系统调用,POSIX标准,C标准库函数。

系统调用和C库:很多c函数库中的函数名与系统调用的名称一样是因为该函数本身其实就是调用的系统调用,放到c函数库就是为了用户态的使用。但是大家可能注意到了为什么库函数为什么是通用的(同名),这是正是高级语言不依赖与特定的硬件。其实,都是编译器来负责库函数到系统调用之间的转换的。比如说VC可能通过把fopen()对应到windows的打印系统调用XXX(不知道具体是哪个)上去了,而linux的编译器gcc通过把fopen()对应到linux的系统调用open上去了。

POSIX和系统调用:在UNIX世界里,最通用的操作系统API基于POSIXPortableOperating System Interface ofUNIX,可移植操作系统接口)标准。这些API函数和系统调用之间有着直接的关系,一个API函数可以由一个系统调用实现,也可以通过调用多个系统调用来实现,还可以完全不使用任何系统调用。

POSIXC库:C库提供了POSIX的绝大部分API


objdump–s –h –x –d

readelf–h –S –s –l

gcc–static –e main 静态链接设置入口地址

gcc–fPIC –shared 生成共享对象文件

gccxx.c xx.so –o xx 动态连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《程序员的自我修养:链接,装载》是一本由林锐、郭晓东、郑蕾等人合著的计算机技术书籍,在该书中,作者从程序员的视角出发,对链接装载等概念进行了深入的阐述和解析。 在计算机编程中,链接是指将各个源文件中的代码模块组合成一个可执行的程序的过程。链接可以分为静态链接和动态链接两种方式。静态链接是在编译时将所有代码模块合并成一个独立的可执行文件,而动态链接是在运行时根据需要加载相应的代码模块。 装载是指将一个程序从磁盘上加载到内存中准备执行的过程。在装载过程中,操作系统会为程序分配内存空间,并将程序中的各个模块加载到相应的内存地址上。装载过程中还包括解析模块之间的引用关系,以及进行地址重定位等操作。 是指一组可重用的代码模块,通过链接装载的方式被程序调用。可以分为静态和动态。静态是在编译时将的代码链接到程序中,使程序与的代码合并为一个可执行文件。动态则是在运行时通过动态链接的方式加载并调用。 《程序员的自我修养:链接,装载》对于理解链接装载的原理和机制具有极大的帮助。通过学习这些概念,程序员可以更好地优化代码结构和组织,提高程序的性能和可维护性。同时,了解链接装载的工作原理也对于进行调试和故障排除具有重要意义。 总之,链接装载是计算机编程中的重要概念,对于程序员来说掌握这些知识是非常必要的。《程序员的自我修养:链接,装载》这本书提供了深入浅出的解释和实例,对于想要学习和掌握这些知识的程序员来说是一本非常有价值的参考书籍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值