以下内容为<<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文件的节

bss  为初始化的数据
.data  已初始化的数据
.hash  符号散列表
.init   初始化代码
.symtab 符号表
.text  可执行的指令
.plt  过程链接表
.rodata 只读数据
.dynamic 动态链接信息
等等

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()和链接程序合作,为可执行程序在内存中创建进程映像,该过程如下:

1. 将可执行文件的段加入内存
2. 加载所有需要的共享库
3. 需要时重定向可执行文件及其共享对象
4. 将控制权交给程序

ELF二进制目标文件详解的更多相关文章

  1. Angular Npm Package.Json文件详解

    Angular7 Npm Package.Json文件详解   近期时间比较充裕,正好想了解下Angular Project相关内容.于是将Npm官网上关于Package.json的官方说明文档进行了 ...

  2. 史上最全的maven的pom.xml文件详解(转载)

    此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  3. 【maven】maven pom文件详解

    maven pom文件详解 最近配置maven中的pom文件,maven中有些属性不太清楚,在这里记录一下 <project xmlns="http://maven.apache.or ...

  4. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

  5. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

  6. jni.h头文件详解二

    作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shao ...

  7. 【转】 jni.h头文件详解(二)

    原文网址:http://blog.csdn.net/shaohuazuo/article/details/42932813 作者:左少华 博客:http://blog.csdn.net/shaohua ...

  8. Android.mk文件详解(转)

    源:Android.mk文件详解 从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解.了解了标准的Makefile后,发现Android.mk其实是把真 ...

  9. Liunx中fstab文件详解

    Liunx中fstab文件详解 /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc ...

随机推荐

  1. 使用 CXF 做 webservice 简单例子[转]

    Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量 ...

  2. xml:Invalid byte 2 of 2-byte UTF-8 sequence

    xml解析错误:Invalid byte 2 of 2-byte UTF-8 sequence 在做接口解析时候出现的错误:Invalid byte 2 of 2-byte UTF-8 sequenc ...

  3. C++中public,protected,private访问

    对于公有继承方式: (1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员:(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员:(3 ...

  4. HDU 3683 模拟&amp;搜索

    给出五子棋残局,推断三步内能否分出胜负,玩家为当前该走旗子的颜色,下一步为白棋或黑棋不定. 依照顺序推断就可以: 1:推断棋盘是否合法,并确定玩家颜色 2:推断当前玩家颜色是否有一个必胜点,有玩家则在 ...

  5. 基于Http替补新闻WebService数据交换

    该系统的工作之间的相互作用.随着信息化建设的发展,而业界SOA了解并带来低TOC(总拥有成本)其他优势.越来越多的高层次的信息使用者关注. 这里暂且不提SOA这种架构规划.在系统间集成协议简单的讨论. ...

  6. 20款最好的免费的IDES和编辑器

    程序员编程利器:20款最好的免费的IDES和编辑器 Posted on 2015-02-17 21:52 尛鱼 阅读(170) 评论(1) 编辑 收藏 程序员编程利器:20款最好的免费的IDEs和编辑 ...

  7. MVC验证10-到底用哪种方式实现客户端服务端双重异步验证

    原文:MVC验证10-到底用哪种方式实现客户端服务端双重异步验证 本篇将通过一个案例来体验使用MVC的Ajax.BeginForm或jQuery来实现异步提交,并在客户端和服务端双双获得验证.希望能梳 ...

  8. ASP.NET 5是如何通过XRE实现跨平台的

    挡不住的好奇心:ASP.NET 5是如何通过XRE实现跨平台的   .NET程序员也有自己的幸福,.NET的跨平台是一种幸福,.NET的开源也是一种幸福,而更幸福的是可以通过开源的.NET了解.NET ...

  9. javascript4

    javascript使用Unicode字符集编写的.javaScript是区分大小写的语言. 标示符就是一个名字.在javascript中用标示符来对变量和函数进行命名或者用做javascript代码 ...

  10. navicat连接oracle数据库报ORA-28547: connection to server failed, probable Oracle Net admin error错误的解决方法

    原文:navicat连接oracle数据库报ORA-28547: connection to server failed, probable Oracle Net admin error错误的解决方法 ...