ELF二进制目标文件详解
以下内容为<<linux内核编程>>笔记
链接程序
找出所有引用的外部模块并链接起来,这些外部模块或函数库一般来自于开发者,操作系统和C运行库。
链接程序取出这些函数库,修订指针位置(重定位),并交叉引用模块中的符号解析,最终产生一个可执行模块。符号可以是全局的也可以是局部的。全局符号可以在模块内部定义,或由另一模块外部引用。
静态库是在链接时被找到并复制的,而动态库和共享库是在运行时才装载的,并让所有的进程共享。linux提供的系统调用dlopen(),dlsym(),dlclose(),用于加载/打开共享库,查找库中的符号,然后关闭共享库
ELF二进制目标文件
可执行ELF目标文件包括:ELF头,程序头表(用于加载的节),第1节,第2节。。。。节头表(可选)
1.ELF文件头
typedef struct elf32_hdr{
unsigned char e_ident[EI_NIDENT]; //标识该文件是否为ELF文件
Elf32_Half e_type; //指定目标文件类型,例如可执行文件,重定位文件,共享的目标文件
Elf32_Half e_machine; //被编译文件所在系统的体系结构
Elf32_Word e_version; //目标文件的版本
Elf32_Addr e_entry; /* Entry point */ //程序的起始地址
Elf32_Off e_phoff; //保存程序头表在文件中的偏移量
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 elf32_shdr {
Elf32_Word sh_name; //包含节名
Elf32_Word sh_type; //包含节的内容
Elf32_Word sh_flags; //各种属性的内容
Elf32_Addr sh_addr; //节在内存映像中的地址
Elf32_Off sh_offset; //保存ELF文件中这一节中初始字节的偏移量
Elf32_Word sh_size; //包含节的大小
Elf32_Word sh_link; //表链接的索引
Elf32_Word sh_info; //包含附加信息
Elf32_Word sh_addralign; //包含地址对其的约束
Elf32_Word sh_entsize; //节中每项的大小
} Elf32_Shdr;
3 非可执行ELF文件的节
4 程序头表
typedef struct elf64_phdr {
Elf64_Word p_type; //描述该段的类型
Elf64_Word p_flags; //以p_type而定
Elf64_Off p_offset; //该段的开始相对于文件开始的偏移量
Elf64_Addr p_vaddr; //段虚拟地址
Elf64_Addr p_paddr; //段的虚拟地址
Elf64_Xword p_filesz; //文件映像中该段的字节数
Elf64_Xword p_memsz; //内存映像中该段的字节数
Elf64_Xword p_align; //描述要对齐的段在内存中如何对齐,该值是2的整数次幂
} Elf64_Phdr;
通过这些信息,系统函数exec()和链接程序合作,为可执行程序在内存中创建进程映像,该过程如下:
ELF二进制目标文件详解的更多相关文章
- Angular Npm Package.Json文件详解
Angular7 Npm Package.Json文件详解 近期时间比较充裕,正好想了解下Angular Project相关内容.于是将Npm官网上关于Package.json的官方说明文档进行了 ...
- 史上最全的maven的pom.xml文件详解(转载)
此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- 【maven】maven pom文件详解
maven pom文件详解 最近配置maven中的pom文件,maven中有些属性不太清楚,在这里记录一下 <project xmlns="http://maven.apache.or ...
- Linux中/proc目录下文件详解
转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...
- [转]AndroidManifest.xml文件详解
转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...
- jni.h头文件详解二
作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shao ...
- 【转】 jni.h头文件详解(二)
原文网址:http://blog.csdn.net/shaohuazuo/article/details/42932813 作者:左少华 博客:http://blog.csdn.net/shaohua ...
- Android.mk文件详解(转)
源:Android.mk文件详解 从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解.了解了标准的Makefile后,发现Android.mk其实是把真 ...
- Liunx中fstab文件详解
Liunx中fstab文件详解 /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc ...
随机推荐
- JBoss7官方最新版下载地址
JBoss是全世界开发人员共同努力的成果,一个基于J2EE的开放源码的应用server. 由于JBoss代码遵循LGPL许可,能够在不论什么商业应用中免费使用它,而不用支付费用.2006年,Jboss ...
- .NET中IDisposable接口的基本使用
首先来看MSDN中关于这个接口的说明: [ComVisible(true)] public interface IDisposable { // Methods void Dispose(); } 1 ...
- HDU 2070 Fibbonacci Number
Fibbonacci Number Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 位记录——Windows 7已安装Sublime Text 3、cynwin、SublimeClang
转载请注明出处:http://blog.csdn.net/cywosp/article/details/34429697 1. 到https://www.cygwin.com/下载setup-x86_ ...
- MyEclipse2014 安装SVN小工具
1.下载svn小工具 下载链接:folderID=2240">http://subclipse.tigris.org/servlets/ProjectDocumentList?fold ...
- Swift语言指南(七)--语言基础之布尔值和类型别名
原文:Swift语言指南(七)--语言基础之布尔值和类型别名 布尔值 Swift有一个基本布尔类型,叫做布尔(bool),布尔值又称逻辑值(logical),因为它只能为真(true)或假(false ...
- [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
原文:[CLR via C#]4. 类型基础及类型.对象.栈和堆运行时的相互联系 CLR要求所有类型最终都要从System.Object派生.也就是所,下面的两个定义是完全相同的, //隐式派生自Sy ...
- Spark Standalone模式应用程序开发
作者:过往记忆 | 新浪微博:左手牵右手TEL | 能够转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明博客地址:http://www.iteblog.com/文章标题:<Spar ...
- Hibernat之关系的处理多对多
第一步:编写两个pojo,比如一个学生表一个课程表 这里使用注解. 需要 课程表: package com.qcf.pox; import java.util.HashSet; import jav ...
- PhotoShop CC安装抠图插件KnockOut 2
1.KnockOut 2只有32位版本,因此需要给32位的PhotoShop CC安装. 2.下载地址:http://www.cr173.com/soft/28207.html 3.安装KnockOu ...