读书笔记第三周《程序员的自我修养》

第三周读书笔记 《程序员的自我修养》

??计划对这本书是精读,这周读了3,4章。

第三章 目标文件里有什么

?? 首先介绍了目标文件的格式,Windows下是pe-coff,linux下是elf,他们都源于coff,这与操作系统的发展历史有关,而且不仅可执行文件按这种格式存储,动态链接库(.dll),静态链接库(.lib)都是如此存储。

?? 在目标文件中,信息以段的形式存储(微机原理讲过),总体被分为指令与数据两部分。代码编译后的机器指令放在代码段(.text),全局变量与局部静态变量放在数据段(.data),未初始化的全局变量或者局部静态变量放在.bss段,此段为这些变量预留位置(初始化后才占用内存).

??看到这里必然会疑惑为什么要分开呢?

??一是是数据必然要有读写的权限,假如对于指令给予写权限可能会带来隐患

??二是可以适应CPU的cache体系,现代cache就分成了指令缓存与数据缓存。

??三是最重要的,系统运行多个相同程序的时候,他们可以共享指令,还有文本图片等,当然数据区是独立的,这极大的节省了内存。

?? 之后还介绍了文件头,以及对于一段代码编译后存放的分析。引起我兴趣的是关于重定位的文件,.o文件里会有一个叫做。rel.text的文件,类型为SHT——REL,存放代码段,数据段中重定位表的位置,并以符号文件作为接口

?? 当各种库文件出现,不可避免就要解决用户自己定义的变量与库文件变量可能重名的问题,c是在所有用户自定义编译后前面加_(但是多个用户写出的代码还是可能会冲突),之后像c++便有了命名空间之类的概念。

?? c++的复杂特性(类,继承,重载,命名空间)为符号管理增加了难度,人们发明了符号修饰机制解决了重载问题。对于返回变量,形参不同的函数,利用其特征生成不同的签名以区别。注意不同的编译器会采取不同的签名方法,这也导致不同的编译器不能互操作。

第四章 静态链接

?? 讲述了两个文件链接后在输出文件中的内存位置,为了避免浪费储存空间(各个段是用页的形式储存的),大都采用相似段合并的方法。一般分为两步,1地址与空间分配,2符号解析与重定位。

?? C++因为其语言特性使其必须编译器与链接器共同支持才能完成工作。 第一个问题是重复代码消除,例如不同的文件中实例化了相同的模板,每个文件各自以不同参数单独占据一个段,合并时将相同的实例合并在一个段。

??再就是解决目标文件中没有调用的函数的处理,因为现在的库都十分庞大,当链接时,很容易没用的函数包括进来,编译器一般会给与选项,可以让所有函数分到不同的段中,这样链接的时候就可以舍弃无用的函数段,但是因为要计算函数依赖关系,会较低编译速度。

??c++中ABI(二进制层面的接口)兼容性变差,导致不同公司用相同编译器编译的二进制代码都无法兼容,除非将所有源代码一块编译,对大型项目十分不友好。

?? 静态库就可以看成一些目标文件的集合,就是许多目标文件打包,windows上最常见的就是IDE自带的运行库。理论上我们可以从库中提取我们想要的目标文件,与我们写的代码生成的目标文件来链接来生成最终的目标文件。值得注意的是库文件中一个目标文件一般只包含一个函数,这样是为了避免链接时候将无用函数链接进来形成空间的浪费。

?? 后面一些链接控制什么的实在是太低层了,不想看了。

?? 为了解决不同硬件平台导致的目标文件格式的不同,这对像是GCC一样的跨平台工具提出了要求,BFD库就是解决了这一问题。其可以看作这些不同目标文件的一个接口,其把目标文件抽象成一个抽象的模型,这样就使得目标文件与编译器与链接器分割开来。

?? 以上就是本周看的内容。

原文地址:https://www.cnblogs.com/zsl96/p/8596016.html

时间: 2024-10-01 03:10:49

读书笔记第三周《程序员的自我修养》的相关文章

读书笔记:程序员的自我修养-----第三章(目标文件)

一 .目标文件格式 1. PE(Portabel Executable) 2. ELF (Executable Linkable Format) : 可重定位.可执行.共享目标文件.核心转储文件 思考: 弱符号和弱引用   VS   回调函数 __attrbute__ ((weakref)) void foo( ); int main() { if( foo ) foo(); } 可以被用户的强符号覆盖: 读书笔记:程序员的自我修养-----第三章(目标文件)

《程序员的自我修养》读书笔记 -- 第三章

第三章 目标文件里有什么 3.1 目标文件的格式 1.目标文件就是源代码编译后还未进行链接的中间文件.因为目标文件与可执行文件的内容和结构很相似,所以一般跟可执行文件的存储形式相同,Linux下统称为ELF可执行文件.动态链接库与动态链接库也使用可执行文件格式存储. 2.ELF文件标准里面把ELF文件归为4类: l  可重定位文件(这类文件包含代码和数据,可被用来链接成可执行文件,静态链接库属于此类.如linux下的.o文件和windows下的.obj ) l  可执行文件(这类文件包含可直接执

读书笔记:程序员的自我修养-----第一章(综述)

题前:30--45天读完,一周至少3篇读书笔记.不能坚持,不再联系,不再找你. 一. hello world 程序引出的问题,看40天后,再回来看看自己的答案,提升多少. Q1:程序为什么要被编译器编译之后才可以运行?   A1 : 系统执行的机器语言,即二进制文件,程序是文本文件需要编译之后,由链接器链接需要的基本库生成二进制文件. Q2: 编译器在把C语言程序转换成可以执行的机器码的过程中作了什么,怎么做的?   A2: 预处理,汇编器生成汇编文件,编译器生成目标文件,链接器链接生成可执行文

【读书笔记】程序员的自我修养总结(六)

[读书笔记]程序员的自我修养总结(六) 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:这是程序员的自我修养一书的读书总结,随着阅读的推进,逐步增加内容. 本文主要介绍可执行文件的装载与进程 程序与进程的区别 程序是静态的,指的是一些预先编译好的指令和数据集合的一个文件:而进程实际上就是运行着的程序,是动态的. 虚拟地址空间 程序运行起来后将拥有独立的虚拟地址空间 virtual address space,其大小由计算机的硬件平台决定,具体地说是

【读书笔记】程序员的自我修养总结(二)

程序员的自我修养总结(二) 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:这是程序员的自我修养一书的读书总结,随着阅读的推进,逐步增加内容. 由源文件到可执行文件 分为四个步骤: 预处理 处理源代码中以#开始的预编译指令,进行宏定义展开,处理所有条件预编译指令,将被包含文件插入到预编译指令的位置,删除所有注释,添加行号及文件标识,保留#pragma编译器指令,因为编译器需用到. 编译 进行一系列词法分析,语法分析,语义分析及优化后生成汇编代码文件

C++程序员的自我修养–读书笔记

 1:注意不要反回指向栈内存的指针或引用,因为在函数返回时改内存已经被销毁了 2:C/C++没有办法知道指针所指的内存容量大小 当数组作为参数传递时,数组将退化成相同类型的指针 不要指望要指针参数去申请动态内存,因为函数会为产生一个临时变量指向参数的内存,当函数内分配内存时,将内存的地址赋给了临时参数,而没有给实参赋值,所有实参没有发生任何变化,应该修改的是指针所指的内容,而不是修改指针的指向,所有可以用指向指针的指针 3:重载和内联机制既可用于全局函数也可用于类的成员函数,const和vi

《程序员的自我修养》第三章学习笔记

1,  编译器编译源代码生成的文件叫做目标文件. 从结构上说,是编译后的可执行文件,只不过还没有经过链接 3.1 目标文件的格式 1,可执行文件的格式: Windows下的PE  和   Linux下的ELF 2,从广义上说,目标文件与可执行文件的格式几乎是一样的,所以广义上可以将目标文件与可执行文件看成是一种类型的文件. 3,可执行文件,动态链接库,静态链接库都按照可执行文件格式存储(Windows下是 PE-COFF格式,Linux下是ELF格式). 4,Linux下命令: $: file 

程序员的自我修养 学习笔记(1)

本文源自在学习<程序员的自我修养>中的心得体会. 对于底层系统程序开发者来说,硬件平台可以抽象为三个主要部件,CPU.内存.I/O控制器. 早期的计算机没有复杂的图形功能,CPU和内存之间的频率差异不大,它们都是连接在同一个bus上面的.其他I/O设备,诸如显示设备.键盘.磁盘等速度比内存.CPU慢很多.为了IO设备与CPU.内存之间的协调通讯,一般每个IO设备商都有相应的IO控制器,早期的硬件结构图如下: 随着技术的进步,CPU的频率越来越高,内存跟不上CPU的速度,他们之间就需要一个转换机

程序员的自我修养笔记

1,为什么内存需要分段和分页机制? 早起的计算机中,程序都是直接运行在物理内存上的.这样做有几个问题: 1)地址空间不隔离,计算机的安全性和稳定性没有办法保证,由于所有的程序都可以访问物理内存,恶意的程序可以很容易修改其他程序的内容,达到破坏的目的. 2)内存使用效率低,当前执行的程序(列入进程A)必须被整个装载到内存中执行,如果需要执行另一个程序时,发现内存空间不足,则需要将进程A的数据整体换出到磁盘. 3)程序运行的地址不确定 为了解决上述的三个问题,引入了虚拟地址.分段和分页的概念. 有了