热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

第三周读书笔记《程序员的自我修养》  计划对这本书是精读,这周读了3,4章。第三章目标文件里有什么  首先介绍了目标文件的格式,Windows下是pe-coff,

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

 

  计划对这本书是精读,这周读了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库就是解决了这一问题。其可以看作这些不同目标文件的一个接口,其把目标文件抽象成一个抽象的模型,这样就使得目标文件与编译器与链接器分割开来。 
   以上就是本周看的内容。

 


推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
author-avatar
白开水
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有