这是关于《程序员的自我修养——装载,链接和库》一书的读书笔记,从第三章开始。第一章和第二章主要介绍操作系统和编译器的内容,不加赘述。
目标代码(英语:object code)指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。目标文件(英语:object file)即存放目标代码的计算机文件,它常被称作二进制文件(binaries)。(From WIKI)

3.1 目标文件的格式

目标文件,例如,windows下的PE文件,Linux下的ELF文件等等。“从广义上看,目标文件和可执行文件的格式几乎一样,我们将两者看成一种文件”。除了可执行文件,静态链接库(dll,so)文件和动态链接库(lib,a)文件也按照这种格式存储。
在linux下,可以用file命令来查看文件类型。


3.2 目标文件是什么样的
这一节大致描述了目标文件的格式,以ELF为例,包括.text段,.data段,.bss段等等。做过操作系统实习JOS,或者编译实习什么的,对这个肯定比较熟悉了。
以及,书中提问,为什么要把code和data分开?首先从OS的角度讲,在内存空间中data和code的区域的权限不同,code一般不会被写。其次,data和code的分离对cache的设计和运行效率有帮助。最后,code这片实际的物理内存,也许会被许多进程的虚拟内存同时映射,code可以重用。

3.3 挖掘SimpleSection.o
好吧,我们也编译一下这个SimpleSection.c.电脑是64位的,linux也是64位的,只好用32位的虚拟机来尝试。
 
Size指的是这个段的大小,text段的大小是50,是从地址0x00000034开始的。
利用objdump -s -d 命令查看16进制及反汇编。
 
text段的内容就是代码(汇编指令)
data段中存放的是已经初始化了的全局静态变量和局部静态变量,有两个,global_init_varabal 和 static_var 共8字节
rodata段(貌似是 read only data )存放的是字符串常量 和 只读变量 %d
comment段,版本信息
以及,书中提到一个问题,如何将一个图片image.jpeg作为目标文件的一个段?
利用objcopy工具。
http://blog.csdn.net/junhua198310/article/details/1669545
有介绍

3.4 ELF文件结构描述
ELF文件描述
这个链接有ELF文件的详细介绍:
http://blog.chinaunix.net/attachment/attach/20/94/00/9520940095749b425507abb1ce08ec3fde95896db3.pdf
查看ELF文件的内容用readelf命令,关于readelf命令可以参考这个文章:
http://blog.csdn.net/edonlii/article/details/8779075
总结一下:
读取ELF文件头        readelf -h 文件名
读取ELF程序头表     readelf -l 文件名
ELF节头表               readelf -S 文件名
符号表                    readelf -s 文件名
 
段类型
w:可写
A:需要分配空间
S:可执行
字符串表
把ELF文件中的各种字符串(比如段名,变量名)统一管理的表。
.strtab 和 .shstrtab
重定位表
存放重定位的信息


3.5 链接的接口——符号
链接的过程的本质是把不同的目标文件之间相互“粘”到一起
“粘”到一起的方式就是通过符号
对“粘”可能有帮助的符号包括,本目标文件中的全局符号,外部符号(比如例子中的printf)。而局部符号,段名等,对于别的目标文件是不可见的。
ELF符号表,.symtab

特殊符号
我们使用ld链接器的时候,ld链接器会自动生成一些特殊的符号,比如:
__executable_start
__etext
_edata
_end等等。
我们在程序中 用 extern char etext[]; 声明了之后,可以直接使用。
符号修饰和函数签名
这一节,主要讲了如何处理符号名冲突的问题
最简单的,加一个下划线
C++中,对符号进行修饰,函数进行签名之类的,其实就是把一个名字加上一些修饰,使得不仅仅通过符号的“名字”作为区别符,而是把“名字”加上一些信息作为区别符。
C++ 命名空间 http://blog.csdn.net/liufei_learning/article/details/5391334
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/ydfr/p/3174151.html

《程序员自我修养》读书笔记 第三章 目标文件里面有什么相关推荐

  1. 程序员的修养--读书笔记

    第一章 温故而知新 -- cpu.内存.显示设备.io设备早期都链接在一个总线上.后来出现了北桥芯片使得cpu,内存和高速的图形设备能够高速的交换数据.南桥芯片处理低速设备,比如磁盘,usb,键盘,鼠 ...

  2. 程序员自我修养阅读笔记——运行库

    主要关注程序的启动过程. 1 入口函数和程序初始化 1.1 程序真正的入口   通常写代码时,我们认为程序的入口是main函数,但是实际上有一些现象值得我们怀疑该结论是不是正确的.比如全局变量的初始化 ...

  3. 程序员自我修养阅读笔记——可执行文件的装载过程

    1 可执行文件的装载过程 1.1 进程虚拟地址空间   一个可执行文件被装载到内存变成程序后(进程和程序的区别在于一个是静态的一个是动态的,程序就是菜谱,进程就是厨师参考菜谱做菜的过程),拥有自己独立 ...

  4. 程序员自我修养阅读笔记——动态链接

    1 为什么需要动态链接   动态链接,顾名思义,就是只有在程序需要调用对应的库中的实现时才将对应的库的映像文件加载到内存.相比而言,静态链接是在编译阶段就将需要的目标文件中的相关实现连接到可执行文件中 ...

  5. 程序员自我修养阅读笔记——系统调用与API

    1 系统调用 1.1 系统调用简介   由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API).是应用程序同 ...

  6. 程序员自我修养阅读笔记——Linux共享库管理

      有了共享库那么就存在对库版本的管理问题. 1 共享库版本 1.1 共享库兼容   共享库更新时一般会存在两种形式的更新,兼容更新和不兼容更新.这里的兼容不仅仅指接口兼容,也指ABI(Applica ...

  7. 程序员自我修养学习笔记

    分页 线程 处于运行中线程拥有一段可以执行的时间,这段时间称为时间片(Time Slice),当时间片用尽的时候,该进程将进入就 绪状态.如果在时间片用尽之前进程就开始等待某事件,那么它将进入等待状态 ...

  8. 《Linux Shell脚本攻略》读书笔记第三章 以文件之名

    1.生成任意大小文件 dd [root@stone ~]# dd if=/dev/zero of=f1_dd bs=1M count=1 1+0 records in 1+0 records out ...

  9. 《程序员自我修养》第七章读书笔记

    书还是接上回,本篇主要对第七章的相关内容进行总结.第七章主要对动态链接的相关内容进行分析. 7.1 为什么要动态链接 既然要对动态链接进行分析,首先应对动态链接出现的原因进行一个简单的分析.动态链接从 ...

  10. 高效能程序员的修炼 --读书笔记

    高效能程序员的修炼 –读书笔记 这是我读完Jeff Atwood的<高效能程序员的修炼>这本书后的一些回顾, 我会根据这本书的章节依次写下对每章节的理解和认识. 高效能程序员的修炼 读书笔 ...

最新文章

  1. 干货丨 一文概览深度学习中的激活函数
  2. docker安装wget_Docker: docker pull, wget, curl, git clone 等如何更快?
  3. gis里创建要素面板怎么打开_gis、mike学习
  4. 复数域上x^n ±1=0的解
  5. Windows 下开发PHP扩展资源
  6. ibm收购red hat_IBM将收购Red Hat:面向Java的初衷
  7. Google Guava新手教程
  8. lua 和 c交互详解(一)
  9. vision应用教程中文版
  10. 上海CISSP认证培训课程圆满举办
  11. win10无线投屏_win10投屏快捷键无需频繁插拔
  12. i9023 中国联通 3G 西安信息中心号码
  13. 3.17 Inappropriate Intimacy 狎昵关系
  14. 下拉推荐在 Shopee Chatbot 中的探索和实践
  15. Swift编程二十四(不透明类型)
  16. 安装 Node.js
  17. 如何将json数据并格式化—html
  18. 第十届颗携枪通过固定障碍
  19. 用node.js和express.js和jade搭建轻型cms系统
  20. 基于 Docker 搭建 MySQL 一主两从复制

热门文章

  1. 移动端中 H5输入框在弹起键盘后被遮挡
  2. 【vedio】html 视频有声音没有图像
  3. SpringMVC学习(五)处理前端的请求参数及数据回显
  4. Dubbo 服务 IP 注册错误踩坑经历
  5. mysql (mariadb)数据库使用 mysqldump 备份全部数据库,并自动按当前时间名保存文件
  6. LayaAir UI组件 # Tab 选项卡按钮组
  7. Html meta 标签定义页面元信息 详解
  8. html写彩虹,HTML5 Canvas彩虹粒子组成的动画文本
  9. 阶段3 1.Mybatis_09.Mybatis的多表操作_9 mybatis多对多操作-查询用户获取用户所包含的角色信息...
  10. 正则表达式(三)操作符的运算优先级、全部符号的解释