目标文件就是源代码编译后但未进行链接的那些中间文件。


COFF、ELF、PE又是什么?

COFF(Common file format)又称通用目标文件格式,是一种用于可执行文件、目标代码、共享库(shared library)的文件格式,使用于类UNIX系统上。它最早使用于UNIX System V上,用来取代先前的a.out格式,后来又发展出XCOFF与ECOFF。COFF最主要的贡献是引入了“段”的机制,不通的目标文件可以拥有不同数量及不同类型的“段”


ELF (Executable and Linkable Format)可执行与可链接格式 常被称为ELF格式,在计算机科学中,是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。COFF变种  LINUX使用ELF


PE (Portable Execuable)可移植性可执行文件是一种用于可执行文件、目标文件和动态链接库的文件格式,主要使用在32位和64位的Windows操作系统上。COFF变种   WINDOWS使用


目标文件格式


ELF文件类型 说明 实例
可重定位文件(Relocatable File)

这类文件包含了代码和数据,可以被用来
链接成可执行文件或共享目标文件,静态
链接库也可以归为这一类

Linux的.o

windows的.obj

可执行文件(Executable File)

这类文件包含了可以直接执行的程序,它
的代表就是ELF可执行文件,它们一般都
没有扩展名

如:Liunx /bin/bash

windows .exe 

共享目标文件(Shared Object File)

1、首先链接编辑器可以将它和其它可重定位文件和共享目标文件一起处理, 生成另外一个目标文件。

2、其次动态链接器(Dynamic Linker)可能将它与某 个可执行文件以及其它共享目标一起组合,创建进程映像。

如:Linuxx下的.so

widnows的DLL

核心转存文件(Code Dump File)

当进程意外终止时,系统可以将该进程的
地址空间的内容及终止时的一些其他信息
转储到核心转储文件

Linux下的core dump


Linux下查看文件格式

重定位文件

[root@localhost ~]# file /usr/lib64/crt1.o
/usr/lib64/crt1.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.32, not stripped


可执行文件

[root@localhost ~]# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared lib       s), for GNU/Linux 2.6.32, BuildID[sha1]=9223530b1aa05d3dbea7e72738b28b1e9d82fbad, stripped



目标共享文件

[root@localhost ~]# file /lib/ld-2.17.so
/lib/ld-2.17.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=33446bb2067122aef759b21f15245840c26afa0a, not stripped



目标文件样子

目标文件是什么鬼?

     上面少的.bss Section,未初始化的全局变量和局部变量一般放在.bss中,未初始化的变量默认值为0,实际上可以放在data段中,但是没啥意义还需要占用些内存。BSS中只是给变量预留位置并不占用内存

      总体来说,程序源代码编译以后主要分成两个段,程序指令和程序数据。代码段属于程序指令,而数据段和.BSS都属于程序数据


实战分析

  实验代码:

  1 int printf( const char* format, ... );
  2 
  3 int global_init_var = 84;
  4 int global_uninit_var;
  5 
  6 void func1( int i ) {
  7     printf( "%d\n", i );
  8 }
  9 
 10 int main( void ) {
 11     static int static_var = 85;
 12     static int static_var2;
 13     int a = 1;
 14     int b;
 15     func1( static_var + static_var2 + a + b );
 16     return a;
 17 }
View Code

相关文章: