目标文件ELF

目标文件ELF(Executable Linkable Format)

可执行文件:主流上有两种,PE 和 ELF 。目标文件就是.o文件,它和可执行文件有相似几乎相同的文件结构,所以我们可以将他们两个看成是一种类型的文件,其实库文件就是.o文件,这足以说明它和可执行文件的关系。

ELF文件类型                                   说明                                                                                                                           示例

可重定位文件                          主要包含代码和数据,静态库也可以包含到这一类。                                       linux ->.o     windos->.obj

可执行文件                               就是可执行文件,没有扩展名                                                                               /bin/bash 文件   exe文件

共享目标文件                         连接器可以使用,动态链接库的实现                                                                    linux->.so 文件     DLL

核心转储文件                         当进程终止时可以将进程的地址空间内容等信息转移到核心转储文件           core dump

目标文件的结构:

目标文件中一般以段 或者 节来存放信息。大体上由四个部分。

头文件部分,文本段,数据段,BSS段,只读数据段,注释信息段,堆栈段。

现在来逐一解析这些段:

头文件:

目标文件的头文件包含有,系统平台信息,硬件信息,环境信息,函数的借口入口等最重要的时还包含一个名叫“段表”的东西。段表记录了目标文件中的各个段信息。

text ,   rel.text , data, bss , rodata  ,comment  , not-GNU-stack,shstrtab ,symtab,strtab  这些段信息。

可以通过readelf  -S XXX.o  来查看这些东西。

文本段:

就是存放代码的段,一般以ASCII的形式来存放代码,使用gcc -s XXX.o   可以反汇编代码。

数据段:

存放已经声明并且初始化过的数据,全局静态变量,局部静态变量,函数内的数据不会在这里边,一般在函数运行时才会生成在函数栈上。全局变量未初始化

或者初始化为0,则不再数据段中。

BSS段:

存放未初始化的全局静态变量和局部静态变量,同时未初始化的全局变量也不会在BSS段存放而是作为一种符号的存在,被放在符号表中。

comment(注释表):

用来存放我们所写的注释。

堆栈段:

提示这个可执行文件的堆栈,一般来说堆栈应该是可重入的,

其他段:

debug 调试信息,dynamic 动态链接信息,HASH 哈希表,line调试的行号表还有符号表等等。

时间: 2024-11-10 22:27:15

目标文件ELF的相关文章

程序员的自我修养:(1)目标文件

程序员的自我修养:(1)目标文件 1.目标文件 1.1 编译与链接 在使用像Visual Studio或Qt Creator等IDE时,通常有一个叫做"构建"的按钮.当编辑完成要运行和测试时点一下它,程序就能跑起来了,所以我们很少关心编译和链接.其实,编译和链接合并在一起就称为 构建(Build).简单的一次按键,实际背后却是异常复杂的过程: 预编译(Preprocessing) 编译(Compilation) 扫描:算法类似有限状态机(FSM),将字符转换成Token. 语法分析:分

在Unix系统上,从源文件、目标文件、可执行文件的编译过程

是由“编译器驱动”(compiler driver)完成的: unix> gcc -o hello hello.c 在这里,gcc的编译器驱动程序读取源文件hello.c, [cpp] view plaincopy #include <stdio.h> int main() { printf("hello, world/n"); return 0; } 并把它翻译成一个可执行目标文件hello,这个过程是分为四个阶段完成的.如下图所示,执行这四个阶段的程序(预处理器.

目标文件里的秘密

目标文件内包含指令代码.数据和链接环节所需要的一些信息,如符号表.调试信息.字符串表等.一般目标文件将这些信息按不同的属性分类,以"段"的形式存储.本文将在Linux环境下,用bjdump.readelf工具查看目标文件存储的具体形式,可得目标文件中由C语言编译后执行语句放在.text段,已经初始化的全局变量和和局部静态变量放在.data段,未初始化的全局变量和局部静态变量放在.bss段,ELF文件中各个段的基本属性放在.symtab段,段表中很重要的还有重定位表以及ELF文件头. 详

挖掘目标文件

一般C语言编译后的执行语句都编译成及其代码,保存在.text段:已初始化的全局变量和局部静态变量都保存在.data段:未初始化的全局变量和局部静态变量一般放在.bss段里.我们知道未初始化的全局变量和局部静态变量默认都是0,本来他们可以存放在.data段中,但它们的值都为0,放在.data段中是没必要的.程序运行的时候它们的确要占空间,并且可执行文件必须记录所有未初始化的全局变量和局部静态变量的大小综合,记为.bss段.所以.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内

《程序员自我修养》阅读笔记-目标文件里有什么

linux下的目标文件(.o文件)采用ELF格式.目标文件里采用段section的格式存储,比如代码段啊(存代码),数据段啊(初始化了的全局变量和局部静态变量),BSS段啊(未初始化的全局和局部静态变量),只读数据段啊(程序中用到的字符串)等.在所有的段外,有一个重要的结构叫做文件头.所以这里从文件头开始说. 1 文件头主要包含以下内容(没什么用的就不写了): (1)e_ident:这里面一个重要的内容就是魔数和机器的位数.魔数用来标识文件的类型,比如elf啊,a.out啊,MZ啊等.机器位数就

读书笔记:程序员的自我修养-----第三章(目标文件)

一 .目标文件格式 1. PE(Portabel Executable) 2. ELF (Executable Linkable Format) : 可重定位.可执行.共享目标文件.核心转储文件 思考: 弱符号和弱引用   VS   回调函数 __attrbute__ ((weakref)) void foo( ); int main() { if( foo ) foo(); } 可以被用户的强符号覆盖: 读书笔记:程序员的自我修养-----第三章(目标文件)

软件构件基础--&gt;目标文件分析

目标文件格式 目标文件是已经编译但还没有链接的文件,其格式与可执行文件格式很类似. 在Windows中目标文件格式为PE(Portable Executable),文件以".obj"为后缀. 在Linux中目标文件格式为ELF(Executable Linkable Format),文件名称没有明确规定一般以".o"结尾. 目标文件内容 目标文件内容是已经经过整理的内容,将代码.数据.符号表.调试信息.字符串等以"节"(Section)或&quo

浅谈linux 中的目标文件 即.o后缀名的文件

实际上 目标文件从结构上讲,已经非常接近可执行文件,只是没有经过链接的过程,所以其中有些符号或者地址还没有被调整. 实际上上在linux下 都是可以称之为ELF文件. 看一下这个图,a.out 就是我们的hello.c的执行文件.hello.o 就是目标文件 所以实际上他们2 几乎是一样的. 一般目标文件有很多属性,比如符号表啊,字符串之类的,然后目标文件 把这些属性 按照 segment的形式存储,也叫段.就是大家经常遇到的段错误 里的那个段. 一般来说程序代码被编译以后 主要分为程序指令和程

执行目标文件引发的问题:syntax error: word unexpected (expe...

今天不小心把一个目标文件当成了可执行文件放到开发板上进行执行,结果出现了这样一个问题:./hello_qt: line 1: syntax error: word unexpected (expecting ")"),因为以前没有碰到过这事,一时间有点蒙,就是一个简单的hello world按道理不会有问题才对.于是google了一下,原来是一个小小的-c编译选项搞得鬼.顺带也扩展学习总结了一下. arm和pc上执行目标文件的区别 一般来说,gcc -c选项编译出来的目标文件是不可执行