程序员的自我修养第三章笔记

windows可执行文件格式:PE-COFF
linux的可执行文件格式:ELF
— —!还有其他系统的可执行文件格式..强调一点吧,某系统的可执行文件不能执行在其他不同可执行文件格式系统的上面…比如windows和Linxu
—> —>当然,不单可执行文件是用这个格式,动态库和静态库也是用这个格式来存储的!
准确来说,很多文件都是用同一个文件格式存储的,距离来说吧,linux下的ELF文件:
程序员的自我修养第三章笔记_第1张图片
多种多样吧…这么多的文件格式
命令查看验证:file 文件名

呃,简单说一下,linux也会,windows也好,都是参考unix的….据说windows刚出来很长一段时间都在挂在Unix的内核。。。。所以一些东西难免有点惊人的相似点,比如这个。。。文件格式,UNIX当年用的是COFF格式,所以linux,windows下的可执行文件都可以看做成COFF格式的变种

然后说了那么多,究竟这个文件格式里面有什么呢?我们先记住这个问题,但是这里不先给予回答,而是贴一些代码,讨论完代码后再回答吧

#include <stdio.h>
int global_a = 10;
int global_b;
void main()
{
  int auto_a = 10;
  int auto_b;
  static int static_a = 10;
  staitc int static_b;
  char *p = "hell world";
}

global_a 存放在那里?
global_b 存放在那里?
auto_a 存放在哪里?
auto_b 存放在哪里?
static_a 存放在哪里?
static_b 存放在哪里?
p 存放在那里?
“hell world”存放在那里?
诸如此类的问题,可能某强写的C语言教材里面说的是什么全局静态区,全局变量区。什么局部区。。。。但是如果此时我们看下linux进程虚拟地址空间
程序员的自我修养第三章笔记_第2张图片
根本就没有所谓的全局静态区,全局变量区。什么局部区。。。。
其实真正来说。。。。
global_a 存放在那里?.data段
global_b 存放在那里?编译期.bss段,链接期.data段
auto_a 存放在哪里?栈
auto_b 存放在哪里?栈
static_a 存放在哪里?.data段
static_b 存放在哪里?编译期.bss段,链接期.data段
p 存放在那里?栈
“hell world”存放在那里?.rodata段
自己好好看看那个图吧….这些都是存在的,或者不是凭空捏造出来的…
呃。这里先忽略编译期.bss段,链接期.data段的东西,因为这个东西是和强弱符号有关的,等下再讲。
这是各个段的介绍…….看不懂就姑且忽略吧
程序员的自我修养第三章笔记_第3张图片
但是程序里面有指令吧?这个没错吧?或者说代码是存放在那里?答案是.text段,那个地方只能读取。。。也就是说:程序编译之后,分开成了数据和代码分开存储,那么为什么要这样子呢???
原因1:方便管理,或者说更安全.当程序跑起来后,进程的代码和数据映射到两个不同的段上,这样不就是可以很好的进行权限管理了么。。。。而且不用担心某个蛋疼的程序员故意越界修改代码段了…..
原因2:更快,CPU代码段和数据段是分离的
程序员的自我修养第三章笔记_第4张图片
呃,,,CPU里面的缓存其实在图中应该分得更细一点,有代码和数据分开缓存。。。。不管这样,如果将代码和数据段分离,这样大大提供了CPU缓存的缓存命中率对吧????CPU在Cache中读取数据大概是内存读取的100倍~~然后你就知道为什么说这样做更快了吧???
原因3:更省内存,假设你发动麒麟臂,快速在一个极短时间内点击了10000次,进程几乎同时启动了10000份!那么这个时候,你愿意有10000个相同的代码段呢?还是愿意共享一个代码段呢?同学。。。
下面的是一些命令的用法
程序员的自我修养第三章笔记_第5张图片
程序员的自我修养第三章笔记_第6张图片
这里写图片描述
好!这时候继续回来讲我们的.bss段,为什么这个玩意儿要存在?
简单来说,这个就是类似我们的汽车厂制作汽车一样,有一些的组件(轮胎之类)的某一些东西可能会参与到全个整体的设计里面,比如轮胎的颜色!这些东西就对应项目里面的全局变量….有时候是这样子,假设别的组件比如引擎之类的,没有定义参与整体设计的东西,比如没有定义颜色。。。这时候不就很好了么,就是用轮胎的颜色!如果有其他组件,比如车顶这么超级大件的也定义了一些颜色,那么肯定少数服从多数,肯定都得使用车顶的颜色对吧?
这就是类似的吧,.bss段就是每个组件要参与全局决议的东西,一些没有初始化的全局符号,或者准确叫法是弱符号,而初始化的东西叫做强符号.
规则如下:
1.强符号遇到强符号直接链接爆错
2.强符号遇到弱符号选择用强符号
3.弱符号遇到弱符号用字节数大的那个符号

你可能感兴趣的:(linux,程序员,存储,链接,编译)