(linux .elf)

(linux

linux内核映像文件与普通的ELF文件有什么区别?

其实 包括 shell 以及make出的一系列文件 *.o *.so 等但是*.a不是

Linux内核有多种格式的镜像,包括vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等.

vmlinuz是可引导的、可压缩的内核镜像,vm代表Virtual Memory.Linux支持虚拟内存,因此得名vm.它是由用户对内核源码编译得到,实质是elf格式的文件.也就是说,vmlinux是编译出来的最原始的内核文件,未压缩.这种格式的镜像文件多存放在PC机上.

而Image是经过objcopy处理的只包含二进制数据的内核代码,它已经不是elf格式了,但这种格式的内核镜像还没有经过压缩.

其他类型的文件就更不是了

只能说Linux 内核镜像有一种是elf格式的,因为elf通常都是被编译生成的,所以linux 内核映像文件与普通的ELF文件实现的功能不同阿

elf是什么格式?

在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的标准文件格式。是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息有ELF头中的各项值来决定。

linux生成文件中.so文件和.out文件的区别?

在链接的时候指定入口是可以制造可以运行的.so文件的典型的例子:/lib64/ld-linux-x86-64.so.2/lib64/libc.so.6因为它们都是ELF(Executable and Linking Format)文件顾名思义就知道这种文件同时兼具可执行于可连接的作用。Windows上我不熟悉,当时考虑到DLL于EXE都是PE文件,链接器那边做好入口理论上是可以执行的。但是如果Windows上有什么泾渭分明的区分就无解了

elf什么意思?

ELF文件(Executable Linkable Format)是一种文件存储格式。Linux下的目标文件和可执行文件都按照该格式进行存储,有必要做个总结。

文件头是什么?

首先,解释一下为什么可执行文件需要有文件头。

对于一个可执行文件来说,操作系统在执行它之前需要知道:

1、它所依赖的操作系统版本,比如有些只能在DOS下运行,有些可以在Windows里运行;有些必须在64位环境下运行等等。

2、它的入口在哪,并不是所有可执行文件的入口都在文件的最前面,还可以在中间,或者最后面,所以需要有东西来描述。

3、它的哪部分是代码,哪部分是数据,因为通常对于代码而言,代码部分应该是只读的,数据部分才是可读写的。

4、哪些数据需要初始化为0,通常,在可执行文件中,有一个叫BSS段的部分,这部分数据需要操作系统在加载可执行文件时对BSS清零。

5、它运行时的虚拟地址是什么,如果无法加载到指定的地址上,操作系统该怎么做(重定向表)。

6、初始的寄存器的值是多少。

……

所以,要描述这些信息,就必须给可执行文件加上一个文件头。否则操作系统就不能正确加载并运行可执行文件。

那么有没有不需要文件头的可执行文件呢?是有的。

我能记得的有两种:

第一种是DOS时代的COM文件,这种文件的入口就是它的第一个字节,寄存器的大部分初始化都由自己完成,尺寸不允许超过一个16位的段大小(64KB),功能非常有限。

另一种就是嵌入式开发里用的BIN文件,它的入口就是它的第一个字节,有些BIN文件能自己初始化段寄存器,所以可以基本认为它是一个没有文件头的可执行代码。但是由于BIN没有统一的规范,所以具体到某个BIN文件,就不好说它到底有没有文件头了。

然后,再解释一下为什么不同系统的文件头不一样。

一方面由于历史原因,不同的操作系统都是各个玩各自的,所以造成了格式的差异。但更本质的原因是操作系统环境不同。比如,WindowsXP32位系统中,虚拟地址空间里,用户地址占用的是0x00000000-0x7FFFFFFF的地址范围,内核空间地址是0x80000000-0xFFFFFFFF的地址范围,用户空间是2GB,内核空间是2GB,通常默认是这样的。但是在Linux里,用户空间是3GB,内核空间是1GB,这种内存分布的差异就造成了很多东西都是不同的,包括可执行文件的入口地址范围、可用内存等等,因此Linux里的ELF文件和Windows里的PE文件就不可能定义的完全一样。并且PE格式都包含一个DOS文件头,Linux里是没有这个东西的,PE里还要指定使用Windows子系统的类型,Linux肯定不会支持。而且DLL库和SO库也不一样。所以,因为以上的原因,不同操作系统里的可执行文件头格式也不一样。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平