计算机系统基础pptICS-ex8

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
$ readelf –l main
程序头(段头)表的信息
• 程序头表中包含了可执行文件中连续的片(chunk)如何映射到
连续的存储段的信息。
也可用命令:$ readelf –l main
• 以下是由OBJDUMP得到某可执行文件的段头部表内容
Read-only code segment
LOAD off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
• 对照前页的可重定 位模块swap.o的信 息,对左图中每一 个重定位引用,给 出其:
• 行号
• 运行时内存地址
•值
15
0x80483cb 0x804945c
16
0x80483d0 0x8049458
18
Байду номын сангаас
0x80483d8 0x8049548
18
0x80483dc 0x8049458
23
0x80483e7 0x8049548
Size of section headers: 40 (bytes)
Number of section headers: 29
Section header string table index: 26
回顾:重定位算法
• swap.o 模块 的源代码与 重定位条目
不同模式 MOV指令
• 左图中可执行程序 的swap函数包含5 个已重定位的引用。
• 该模块重定位时,链接器 将修改.text节的哪些指令?
• 对每一这样的指令,给出 其重定位表项中的信息: 节偏移、重定位类型、符 号名。
• 该模块重定位时,链接器 将修改.data节的哪些数 据对象?
• 对每一这样的数据对象, 给出其重定位表项中的信 息:节偏移、重定位类型、 符号名。
• 该模块重定位时,链接器 将修改.text节的哪些指令?
可执行文件的加载
• 通过调用execve系统调用函数来调 用加载器
程序被启动 如 $ ./P
• 加载器(loader)根据可执行文件 的程序(段)头表中的信息,将可 执行文件的代码和数据从磁盘“拷 贝”到存储器中(实际上不会真正 拷贝,仅建立一种映像,这涉及到 许多复杂的过程和一些重要概念, 将在后续课上学习)
• 对每一这样的指令,给出其 重定位表项中的信息:节 偏移、重定位类型、符号 名。
程序的链接(二)
可执行文件的存储器映像
程序(段)头表描述如何映射!
0 Headers 系统代码
0xC00000000
内核虚存区
用户栈 动态生成
main() swap()
.text
共享库区域
1GB
%esp
更多系统代码
系统数据 int buf[2]={1,2} int *bufp0=&buf[0]
int *bufp1 .symtab .debug
Start of section headers: 3232 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 8
代码段:从0x8048000开始,按4KB对齐,具有读/执行权限,对应可执行文 件第0~447H的内容(包括ELF头、段头部表以及.init、.text和.rodata节)
数据段:从0x8049448开始,按4KB对齐,具有读/写权限,前E8H字节用可 执行文件.data节内容初始化,后面104H-E8H=10H(32)字节对应.bss节, 被初始化为0
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: x8048580
Start of program headers: 52 (bytes into file)
ELF文件信息举例
$ readelf -h main
可执行目标文件的ELF头
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
filesz 0x00000448 memsz 0x00000448 flags r-x
Read/write data segment LOAD off 0x00000448 vaddr 0x08049448 paddr 0x08049448 align 2**12
filesz 0x000000e8 memsz 0x00000104 flags rw-
可执行目标文件
.data .bss
堆(heap) 动态生成)
读写数据段
(.data, .bss)
0x08048000 0
只读代码段
(.text, .rodata等)
未使用
brk
从可 执行 文件 装入
回顾:可执行文件中的程序头表
typedef struct { Elf32_Word Elf32_Off Elf32_Addr Elf32_Addr Elf32_Word Elf32_Word Elf32_Word Elf32_Word
调用fork()
以构造的argv和envp 为参数调用execve()
• 加载后,将PC(EIP)设定指向
Entry point (即符号_start处),最终执
行main函数,以启动程序执行。
execve()调用加载器 进行可执行文件加载, 并最终转去执行main
_start: __libc_init_first _init atexit main _exit
} Elf32_Phdr;
p_type; p_offset; p_vaddr; p_paddr; p_filesz; p_memsz; p_flags; p_align;
程序头表能够描述可执行文件中的节与 虚拟空间中的存储段之间的映射关系
一个表项说明虚拟地址空间中一个连续 的片段或一个特殊的节
以下是GNU READELF显示的某可执行 目标文件的程序头表信息
相关文档
最新文档