程序员的自我修养: 目标文件的本质
来源:互联网 发布:小店记账软件 编辑:程序博客网 时间:2024/06/05 17:37
目标文件的格式
Windows下为PE(Portable Executalbe),Linux为ELF(Executable Linkable Format), 他们都是COFF的变种. 下面都是以ELF格式文件为例.
ELF文件类型分为:
可重定位文件(Relocatable File) Linux的.o, windows的.obj
可执行文件(Executable File) Linux的/bin/bash, windows的.exe
共享目标文件(Shared Object File Linux的.so, windows的DLL
核心转储文件(Core Dump File) Linux的core dump
ELF文件分为:
代码段
数据段和只读数据段
BSS段:存放未初始化的全局变量和局部静态变量. .bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容, 所以它在文件中也不占据空间.
其他段
ELF文件结构
1. ELF头文件
typedef struct{
unsigned char e_ident[16];
Elf32_Half e_type; //ELF文件类型
Elf32_Half e_machine; //ELf文件的CPU平台属性
Elf32_Word e_version;
Ellf32_Addr e_entry; //入口地址, 规定ELF程序的入口虚地址
Elf32_Off e_ohoff;
Elf32_Off e_shoff; //段表在在这个文件中的偏移
Elf32_Word e_flags;
Elf32_Half e_ehsize; //ELF文件头本身的大小
Elf32_Half e_phentsize;
Elf32_half e_phnum;
Elf32_Half e_shentsize; //段表描述符的大小
Elf32_Half e_shnum; //段表描述符数量
Elf32_Half e_shstrndx; //段表字符串表所在的段在段表中的下标
}Elf32_Ehdr;
2. 段表
typedef struct{
Elf_Word sh_name; //段名(是段名字符串在.shstrtab中的偏移)
Elf_Word sh_type; //段的类型
Elf_Word sh_flags; //段的标志位
Elf_Addr sh_addr; //段虚拟地址
Elf_Off sh_offset; //段偏移
Elf_Word sh_size; //段的长度
Elf_Word sh_link;
Elf_Word sh_info;
Elf_Word sh_addralign; //段地址对齐
Elf_Word sh_entsize; //项的长度
}Elf32_Shdr;
3. 重定位表 Relocation Table
如printf. 段的类型为: SHT_REL
4. 字符串表
.strtab .shstrtab 分别为字符串表(保存普通字符串)和段表字符串表(保存段表中用到的字符串)
5. 符号表
typedef struct{
Elf32_Word st_name; //符号名(符号名在字符串表中的下标)
Elf32_Addr st_value; //符号对应的值
Elf32_Word st_size; //符号大小
unsigned st_info;
unsigned st_other;
Elf32_Half st_shndx; //符号所在的段
}Elf32_Sym;
- 程序员的自我修养: 目标文件的本质
- 程序员自我修养-目标文件的结构
- 程序员的自我修养 ch3 目标文件
- 程序员的自我修养:(1)目标文件
- 《程序员的自我修养》笔记--目标文件详解
- 程序员的自我修养<3.目标文件有什么>
- 程序员的自我修养——目标文件
- 学习程序员的自我修养之目标文件
- 目标文件、ELF文件的一点小总结 《程序员的自我修养》·笔记
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- 程序员的自我修养
- Visual C++/MFC入门教程(三)
- GetDlgItemInt函数,SetDlgItemText函数,GetDlgItemText函数
- Socket.setSoTimeout()方法的使用
- ftp协议分析
- JNI技术介绍与简单示例
- 程序员的自我修养: 目标文件的本质
- 实现支持post和get的PHP函数
- don't know how to make 'D:/WINCE500/public/directx/oak/lib/x86/debug/l3aud32s.lib'
- 模块化Java
- 如何把std::string当char *使用?
- DOS操作系统历史
- 如何搞科研?(转)
- 在Debian lenny下安装ns-2.34
- Visual C++/MFC入门教程(四)