深入理解计算机系统第七章知识点总结(上)

简介: 深入理解计算机系统第七章知识点总结

详解ELF文件-> main.o

  • elf文件可以分成三部分
  • ELF头——ELF header
  • 不同的section——Sections
  • 以及描述这些section信息的表——Section header table

假设有如下main.c文件

#include<stdio.h>
int count = 10;
int value;
void func(int sum)
{
  printf("sum is:%d\n", sum);
}
int main()
{
  static int a = 1;
  static int b = 0;
  int x = 1;
  func(a + b + x);
  return 0;
}
  • ELF头
  • gcc -c编译后产生main.o文件然后使用readelf -h main.o查看ELF

前十六个字节的含义

  • 7f 45 4c 46前四个字节被称为ELF文件的魔数
  • 分别与ascll码中的DEL控制符、字符E、字符L、字符F对应
  • 魔数就是用来确认文件类型的
  • 02 01 01
  • 最后9个字节ELF的标准中没有定义,用0填充

推测elf的大小

  • 本头的大小可以推出sections的起始地址,这里就是0x40
  • 推测整个elf文件的大小, 利用本头的大小和下图的三个信息
  • start of section headers:可以确定节头部表的起始位置
  • 节头大小节头数量可以确定节头表的大小

查看节头部表

readelf -S main.o:查看节头部表的信息

推断每个sectionelf中的具体位置

  • 整个elf一共包含12section
  • offset代表每个section的起始位置
  • size每个section的大小
  • 例如.text这一section他的offset0x40,大小为0x54,由于elf头的大小为0x40,所以.text是紧跟在elf的后面的

查看.text的内容

已知.text是存放已编译程序的机器代码

objdump -s -d main.o

  • -s:查看机器指令
  • -d:查看汇编代码

  • 前两个字节是指令地址
  • 后面的指令是机器指令
  • 每个指令对应的汇编代码可以在-d中查看

查看.data的内容

已知.data是存放已初始化的全局和静态C变量,而初始化为0的全局和静态变量被存在.bss

objdump -s -d main.o

  • 由于.text的起始位置是0x40,大小为0x56,故可以推断出下一个section的起始位置是0x94,查表可知.dataoffset0x94,刚好对应的上

  • 小端存储
  • 初始化为0b不会出现在此处

关于.bss

已知其是存放未初始化的静态C变量(未初始化的全局变量放在COMMON中)和初始化为0的全局和静态变量

  • 观察节头部表可以发现,.bss.rodata的起始位置一样但大小不一样
  • 这是因为bss不占据实际的空间,他就是一个占位符,程序区分已初始化和未初始化的变量是为了节省空间,当程序运行是,会在内存中分配这些变量,并把初始值设为0

查看.rodata的内容

  • ro就是read only,代表只读,此区域就是存放只读数据的,例如printf语句中的格式串,或者是switch的跳转表

  • 0x73对应115(d)对应s的ascll

关于其他的节表示的信息

详解符号表

typedef struct{
    int name;  // 符号的名称  通过在字符串表中的字节偏移中得到
    char type:4,  // 该符号的类别  函数还是变量 
      binding:4;  // 全局还是本地
    char reserved;  // 没有被用到
    short section;  // 符号所属目标文件的节
    long value;  // 符号的地址相对于所属节起始位置的偏移
    long size;  // 符号的大小
} Elf64_Symbol;
  • 符号是链接的粘合剂,整个链接过程是基于符号才能正确完成

readelf -s main.o

  • Ndx对应section,代表符号所属目标文件的节
  • Ndx的取值还有三个,他们分别是ABS、UNDEF、COMMON,他们被统称为伪节,他们在节头部表中没有条目。只有可重定位目标文件才有这些伪节,可执行目标文件中没有
  • ABS:不该被重定位的符号
  • UNDEF:未定义的符号,但是在其他文件有定义
  • COMMON:还未被分配位置的未初始化的数据目标,也就是未初始化的全局变量会存放于此
  • Value代表符号的地址相对于所属节起始位置的偏移
  • 例如func符号,属于.text节,value0x00,大小为36

深入理解计算机系统第七章知识点总结(下)+https://developer.aliyun.com/article/1416627

相关文章
|
7月前
|
存储 编解码 并行计算
【软件设计师备考 专题 】计算机系统的组成、体系结构分类及特性
【软件设计师备考 专题 】计算机系统的组成、体系结构分类及特性
125 0
|
6月前
|
存储 数据库 芯片
计算机系统论述与相关概念-思维导图
计算机系统论述与相关概念-思维导图
|
7月前
|
存储 缓存 并行计算
【软件设计师】计算机系统基础知识考点
【软件设计师】计算机系统基础知识考点
|
存储
第六章 习题(6789B)【计算机系统结构】
第六章 习题(6789B)【计算机系统结构】
116 0
|
7月前
|
算法 编译器 Linux
深入理解计算机系统第七章知识点总结(下)
深入理解计算机系统第七章知识点总结(下)
87 0
|
7月前
|
存储 缓存 网络虚拟化
深入理解计算机系统第九章知识点总结
深入理解计算机系统第九章知识点总结
127 0
|
机器学习/深度学习 数据处理 vr&ar
【软考:软件设计师】1 计算机组成与体系结构(一)计算机系统基础知识
【软考:软件设计师】1 计算机组成与体系结构(一)计算机系统基础知识
291 0
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
78 1
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
|
存储 固态存储 芯片
【计算机追本溯源】「底层原理系列」 回归与本质,让本文带你认识什么是计算机软件系统(1)
【计算机追本溯源】「底层原理系列」 回归与本质,让本文带你认识什么是计算机软件系统(1)
191 0
【计算机追本溯源】「底层原理系列」 回归与本质,让本文带你认识什么是计算机软件系统(1)
【CSAPP】深入理解计算机系统 第一章 程序 1/26
【CSAPP】深入理解计算机系统 第一章 程序 1/26
103 0
【CSAPP】深入理解计算机系统 第一章 程序 1/26
下一篇
DataWorks