linux文件类型elf,Linux下ELF文件的格式(1)

1.Linux下的可执行文件是什么格式?

2.假设我们有个文件 hello.c ,那么gcc hello.c 后输出什么,gcc  -c  hello.c 输出什么 ?

3.这些文件的内部是什么样子的?

这是我们的hello.c文件

#include

int global_init = 100;

int global_un_init ;

void function1(){

static int static_init = 10;

static int static_un_init;

printf("static_int = %d\n",static_init);

}

int main(int argc,char**argv){

printf("this is main \n");

function1();

return 0;

}

首先,先回答第一个问题。

一些历史的东西不想都搬出来,只想弄点有用的。

1. a.out 格式     意思 : assembler and link editor output

2. COFF格式    意思 :Common Object File Format

3. ELF 格式      意思 : Executable and Linking Format

这3种格式中,ELF是现在主流的格式。a.out很古老了,但是现在默认的a.out好像也是ELF格式了。ELF格式是从COFF格式变种而来的,还有Windows下的PE格式。

现在回答第2个问题。

gcc hello.c 输出的是 a.out,是可执行文件。

而加上参数 -o ,执行gcc hello.c -o hello ,输出的hello是可执行文件。

那么gcc -c hello.c 输出的是什么?是hello.o,它是目标文件。

现在我们有了3个文件a.out , hello , hello.o

为什么说a.out也是ELF格式呢?现在看a.out的文件头信息

0818b9ca8b590ca3270a3433284dd417.png

再来看hello的文件头:

0818b9ca8b590ca3270a3433284dd417.png

比较上面两张图片,你会发现左列最上面都写着ELF头,最重要的是,它们的魔数是相同的!魔数的概念应该都知道,操作系统并不是靠文件后缀来识别

,加载执行 可执行文件的,而是靠魔数来判断这个文件是否是可以执行的。就像java的class文件里的魔数一样,虚拟机是靠魔数来判断这个文件是否可以被

解释执行,class文件的魔数是0xCAFEBABE,占了class文件的前四个字节。

那么,我们的ELF文件的前4字节是什么意思呢 ?下面是magic这串数字的意义:

0818b9ca8b590ca3270a3433284dd417.png

这样,我们便得知了原来Linux下的执行文件同样是靠magic来识别的。

a.out和hello都是可执行文件,他们的格式是ELF,那么hello.o这个目标文件呢,它是什么?答案也是ELF。下面是它的头部信息:

0818b9ca8b590ca3270a3433284dd417.png

这说明hello.o也是ELF文件。

仔细对比这3个文件的头部信息,可以发现hello.o的头部信息里,入口点地址,程序头起点并没有数值,或者说为0.这是为什么呢 ?

现在回想程序源代码到可执行文件的过程:

预处理

编译

汇编

链接

hello.o是通过gcc -c hello.c 得到的。而-c 选项的意思简答来说,就是只编译,不链接。

没有经过链接这一步,所以这里是不能确定它的入口地址,不仅仅是入口地址,程序中的一些函数 变量等的地址也是不能确定的。

关于链接,在后面的文章里会继续深入讨论。

现在回答第3个问题。

首先,我们已经知道这些文件都是ELF文件

ELF文件的大致格式如下,

0818b9ca8b590ca3270a3433284dd417.png

当然这只是一个简单的轮廓,实际的要远远别这个复杂,以后会慢慢的道来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值