目标文件

目标文件可分为三类:

  • 可重定位目标文件(Relocatable file):包含二进制代码和数据,其形式可以和其他目标文件进行合并,创建一个可执行目标文件

  • 可执行目标文件(Executable file):包含二进制代码和数据,可直接被加载器加载执行

  • 共享目标文件(shared object file):可被动态的加载和链接

目标文件在不同的系统或平台上具有不同的命名格式,在Unix和X86-64 Linux上称为ELF(Executable and Linkable Format, ELF)–可执行链接格式。 windows上为PE格式文件。

ELF文件是一种用于二进制文件、可执行文件、目标代码、共享库和core转存格式文件。它是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式

使用file 查看文件的基本信息

file test.o 查看可重定位目标文件
test.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

file system 查看可执行目标文件
system: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=2ba1eb42dc0e59c636459370bc864294e06fb067, not stripped

使用size 查看目标文件每个部分的大小

size system
text data bss dec hex filename
1247 548 4 1799 707 system
其中text表示文本段 data表示数据段 bss表示未初始化的存储段 dec为八进制表示 hex为16进制表示

ELF 文件格式的两种视图

ELF文件格式提供两种视图,分别为链接视图和执行视图:
两种视图

链接视图是以(section)为单位,执行视图是以(segment)为单位。链接视图就是在链接时用到的视图,而执行视图则是在执行时用到的视图。

目标文件.o里的代码段.text 是section(汇编中.text同理),当多个可重定向文件最终要整合成一个可执行的文件的时候(链接过程),链接器把目标文件中相同的 section 整合成一个segment,在程序运行的时候,方便加载器的加载。

视图区别

linux 下查看elf文件的命令

readelf
-a –all 所有选项集合
-h 显示elf文件开始的头文件信息
-l 显示程序头信息
-S –section-headers 显示section头
-g –section-groups 显示section group
-t –section-details 显示section细节
-e –headers Equivalent to: -h -l -S
-s –syms 显示符号表
–dyn-syms 显示动态符号表
-r 显示可重定位段的信息
-W 显示成一行
-x –hex-dump=<number|name> 以字节方式显示指定的部分
-p –string-dump=<number|name> 以 字符串方式显示指定部分

objdump -x 查看二进制文件
hexdump 以十六进制方式显示内容

ELF 文件的组成

elf文件由三个部分组成: ELF头(ELF Header)、 程序头表(Program header table)、节头表(section header table)

  • ELF 头 : 用于描述整个文件的组织
  • 程序头表: 如果存在的话,告诉系统如何创建进程镜像。用于构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
  • 节区头部表:包含描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称,节区大小这类信息。 用于链接的目标文件必须包含节区头部表,其他目标文件可以有或没有这个表。

ELF 格式查看

一种文件, 可以使用readelf命令查看内容
使用方法 readelf 选项 文件

查看elf文件头信息

readelf -h test.o

[root@iz2zecj7a5r32f2axsctb9z extern]# readelf -h test.o
ELF 头:
  Magic:  7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  类别:                              ELF64
  数据:                              2 补码,小端序 (little endian)
  版本:                              1 (current)
  OS/ABI:                            UNIX - System V
  ABI 版本:                          0
  类型:                              REL (可重定位文件)
  系统架构:                          Advanced Micro Devices X86-64
  版本:                              0x1
  入口点地址:              0x0
  程序头起点:              0 (bytes into file)
  Start of section headers:          768 (bytes into file)
  标志:             0x0
  本头的大小:       64 (字节)
  程序头大小:       0 (字节)
  Number of program headers:         0
  节头大小:         64 (字节)
  节头数量:         13
  字符串表索引节头: 12
文档更新时间: 2021-03-10 01:30   作者:周国强