http://blog.csdn.net/dadalan/article/details/2890957

可执行文件可以是具有不同格式的二进制文件,也可以是一个文本的脚本。可执行文件映像中包含了进程执行的代码和数据,同时也包含了操作系统用来将映像正确装入内存并执行的信息。在Linux中,当前的“本地”(系统默认的)可执行文件格式是ELF[15] (Executable and Linking Format)可执行链接格式。由于先前的a.out格式难于实现共享库,不能适用于动态链接,所以目前已经全部被ELF所替换。不过,Linux仍然为 a.out保留了一个二进制处理程序,但通常是使用ELF。
Linux的加载程序一般是根据内嵌在可执行文件开头的“magic序列”(一个特殊字节序列)来识别文件,有时也会通过文件名的一些特性。例如,Java编译处理程序可以保证其文件名以.class结尾,并且文件起始前四个字节是 0xcafebabe,这是Java标准所定义的。下面是2.4版本内核在Intel体系下所提供的二进制处理程序,理论上,Linux灵活到足以处理几乎所有的目标文件格式。
(1)a.out(在fs/binfmt_aout.c中):这是为了支持原来风格的Linux二进制文件。它的存在主要是为了满足一些系统的向后兼容的需要,但是基本上a.out已经光荣退役了。
(2) ELF(在fs/binfmt_elf.c中):目前是Linux默认的二进制文件格式。该格式在可执行文件和共享库中都广泛使用。最新的Linux系统 (例如Red Hat 9)一般只预装了ELF二进制文件解释器,但是特殊情况下要决定加载a.out二进制文件,那么系统也通过模块的方式,对它提供支持。虽然ELF被作为惯用的Linux本地格式,但也和其它格式一样使用同一个加载处理程序。
(3)EM86(在fs/binfmt_em86.c中):允许在Alpha机器上运行Intel的Linux二进制文件,仿佛它们就是Alpha的本地二进制文件。
(4) Java(在fs/binfmt_java.c中):可以不必每次都定义Java字节码的解释程序就可以执行Java的.class文件。这种机制和脚本中使用的机制类似,通过把.class文件的文件名作为参数传递,处理程序返回执行整型字节码的解释程序。从用户的观点来看,Java二进制文件是作为本地可执行文件处理的。
(5)misc(在fs/binfmt_misc.c中):这是最明智地使用二进制处理程序的方法,这个处理程序通过内嵌的特征数字或者文件名后缀可以识别出各种二进制格式,不过最优秀的特性是它可以在运行期配置,而不是只能在编译期配置。因此,只要遵循其规则,就可以快速的增加对新二进制文件的支持,而不用重新编译内核,也无须重新启动机器。Linux源程序文件中的注释建议最终使用它来取代Java和EM86二进制处理程序。
(6)脚本(在fs/binfmt_script.c中):对于shell脚本、Perl脚本等提供支持。宽松一点地说,所有前面两个字符是“#!”的可执行文件,都归由这个二进制处理程序进行处理。
这些Linux支持的二进制格式,可以在内核编译链接的时候直接建立在内核之中,也可以在内核运行的时候作为模块来加载。内核保存了支持的二进制格式解释程序的列表,当试图执行一个文件的时候,每一个二进制格式都会被依次尝试,直到判断出可识别的对应的二进制格式为止。

==============================

Linux 查看 elf可执行文件格式的两个命令

使用objdump 和readelf 两个命令,我们可以看到elf的各个节段的 信息还有 运行时需要那些动态链接库,elf中的汇编代码等等。 我就是想用来查看 这个elf运行需要哪些 *.so 文件

#include<stdio.h>

int test()
{
return 0;
}
int main(void)
{
int i;
int j =0;

//printf ("sizeof (int)=%d\n",sizeof (int));
if ( i = j )
     printf ("\ntrue\n",i);
return 0;
}

gcc main.c 编译后,

www.lnuxidc.com@linuxidc:~/桌面$ readelf -a a.out
ELF Header:
Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class:                             ELF32
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            UNIX - System V
ABI Version:                       0
Type:                              EXEC (Executable file)
Machine:                           Intel 80386
Version:                           0x1
Entry point address:               0x8048310
Start of program headers:          52 (bytes into file)
Start of section headers:          5996 (bytes into file)
Flags:                             0x0
Size of this header:               52 (bytes)
Size of program headers:           32 (bytes)
Number of program headers:         8
Size of section headers:           40 (bytes)
Number of section headers:         36
Section header string table index: 33

Section Headers:
[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
[ 0]                   NULL            00000000 000000 000000 00      0   0 0
[ 1] .interp           PROGBITS        08048134 000134 000013 00   A 0   0 1
[ 2] .note.ABI-tag     NOTE            08048148 000148 000020 00   A 0   0 4
[ 3] .hash             HASH            08048168 000168 000028 04   A 5   0 4
[ 4] .gnu.hash         GNU_HASH        08048190 000190 000020 04   A 5   0 4
[ 5] .dynsym           DYNSYM          080481b0 0001b0 000050 10   A 6   1 4
[ 6] .dynstr           STRTAB          08048200 000200 00004c 00   A 0   0 1
[ 7] .gnu.version      VERSYM          0804824c 00024c 00000a 02   A 5   0 2
[ 8] .gnu.version_r    VERNEED         08048258 000258 000020 00   A 6   1 4
[ 9] .rel.dyn          REL             08048278 000278 000008 08   A 5   0 4
[10] .rel.plt          REL             08048280 000280 000018 08   A 5 12 4
[11] .init             PROGBITS        08048298 000298 000030 00 AX 0   0 4
[12] .plt              PROGBITS        080482c8 0002c8 000040 04 AX 0   0 4
[13] .text             PROGBITS        08048310 000310 0001ac 00 AX 0   0 16
[14] .fini             PROGBITS        080484bc 0004bc 00001c 00 AX 0   0 4
[15] .rodata           PROGBITS        080484d8 0004d8 00000f 00   A 0   0 4
[16] .eh_frame         PROGBITS        080484e8 0004e8 000004 00   A 0   0 4
[17] .ctors            PROGBITS        08049f0c 000f0c 000008 00 WA 0   0 4
[18] .dtors            PROGBITS        08049f14 000f14 000008 00 WA 0   0 4
[19] .jcr              PROGBITS        08049f1c 000f1c 000004 00 WA 0   0 4
[20] .dynamic          DYNAMIC         08049f20 000f20 0000d0 08 WA 6   0 4
[21] .got              PROGBITS        08049ff0 000ff0 000004 04 WA 0   0 4
[22] .got.plt          PROGBITS        08049ff4 000ff4 000018 04 WA 0   0 4
[23] .data             PROGBITS        0804a00c 00100c 000008 00 WA 0   0 4
[24] .bss              NOBITS          0804a014 001014 000008 00 WA 0   0 4
[25] .comment          PROGBITS        00000000 001014 0000fc 00      0   0 1
[26] .debug_aranges    PROGBITS        00000000 001110 000070 00      0   0 8
[27] .debug_pubnames   PROGBITS        00000000 001180 000025 00      0   0 1
[28] .debug_info       PROGBITS        00000000 0011a5 0001b5 00      0   0 1
[29] .debug_abbrev     PROGBITS        00000000 00135a 000083 00      0   0 1
[30] .debug_line       PROGBITS        00000000 0013dd 000180 00      0   0 1
[31] .debug_str        PROGBITS        00000000 00155d 00008e 01 MS 0   0 1
[32] .debug_ranges     PROGBITS        00000000 0015f0 000040 00      0   0 8
[33] .shstrtab         STRTAB          00000000 001630 000139 00      0   0 1
[34] .symtab           SYMTAB          00000000 001d0c 0004b0 10     35 54 4
[35] .strtab           STRTAB          00000000 0021bc 000213 00      0   0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Dynamic section at offset 0xf20 contains 21 entries: 用 readelf -d 命令可以单独查看这个Dynamic section
Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libc.so.6]   需要的动态链接库
0x0000000c (INIT)                       0x8048298
0x0000000d (FINI)                       0x80484bc
0x00000004 (HASH)                       0x8048168
0x6ffffef5 (GNU_HASH)                   0x8048190
0x00000005 (STRTAB)                     0x8048200
0x00000006 (SYMTAB)                     0x80481b0
0x0000000a (STRSZ)                      76 (bytes)
0x0000000b (SYMENT)                     16 (bytes)
0x00000015 (DEBUG)                      0x0
0x00000003 (PLTGOT)                     0x8049ff4
0x00000002 (PLTRELSZ)                   24 (bytes)
0x00000014 (PLTREL)                     REL
0x00000017 (JMPREL)                     0x8048280
0x00000011 (REL)                        0x8048278
0x00000012 (RELSZ)                      8 (bytes)
0x00000013 (RELENT)                     8 (bytes)
0x6ffffffe (VERNEED)                    0x8048258
0x6fffffff (VERNEEDNUM)                 1
0x6ffffff0 (VERSYM)                     0x804824c
0x00000000 (NULL)                       0x0

Relocation section '.rel.dyn' at offset 0x278 contains 1 entries:
Offset     Info    Type            Sym.Value Sym. Name
08049ff0 00000106 R_386_GLOB_DAT    00000000   __gmon_start__

Relocation section '.rel.plt' at offset 0x280 contains 3 entries:
Offset     Info    Type            Sym.Value Sym. Name
0804a000 00000107 R_386_JUMP_SLOT   00000000   __gmon_start__
0804a004 00000207 R_386_JUMP_SLOT   00000000   __libc_start_main
0804a008 00000307 R_386_JUMP_SLOT   00000000   printf

There are no unwind sections in this file.

Symbol table '.dynsym' contains 5 entries:
   Num:    Value Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE LOCAL DEFAULT UND
     1: 00000000     0 NOTYPE WEAK   DEFAULT UND __gmon_start__
     2: 00000000     0 FUNC    GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.0 (2)
     3: 00000000     0 FUNC    GLOBAL DEFAULT UND printf@GLIBC_2.0 (2)
     4: 080484dc     4 OBJECT GLOBAL DEFAULT   15 _IO_stdin_used

Symbol table '.symtab' contains 75 entries:
   Num:    Value Size Type    Bind   Vis      Ndx Name
。。。。。。
    67: 00000000     0 FUNC    GLOBAL DEFAULT UND printf@@GLIBC_2.0
    68: 0804a014     0 NOTYPE GLOBAL DEFAULT ABS __bss_start
    69: 080483c4    10 FUNC    GLOBAL DEFAULT   13 test
    70: 0804a01c     0 NOTYPE GLOBAL DEFAULT ABS _end
    71: 0804a014     0 NOTYPE GLOBAL DEFAULT ABS _edata
    72: 0804848a     0 FUNC    GLOBAL HIDDEN   13 __i686.get_pc_thunk.bx
    73: 080483ce    69 FUNC    GLOBAL DEFAULT   13 main
    74: 08048298     0 FUNC    GLOBAL DEFAULT   11 _init

---------------------------------------------------
www.lnuxidc.com@linuxidc:~/桌面$ objdump -d a.out   反汇编

a.out:     file format elf32-i386

...

080482f8 <printf@plt>:
80482f8:    ff 25 08 a0 04 08        jmp    *0x804a008
80482fe:    68 10 00 00 00           push   $0x10
8048303:    e9 c0 ff ff ff           jmp    80482c8 <_init+0x30>

Disassembly of section .text:

080483ce <main>:
80483ce:    8d 4c 24 04              lea    0x4(%esp),%ecx
80483d2:    83 e4 f0                 and    $0xfffffff0,%esp
80483d5:    ff 71 fc                 pushl -0x4(%ecx)
80483d8:    55                       push   %ebp
80483d9:    89 e5                    mov    %esp,%ebp
80483db:    51                       push   %ecx
80483dc:    83 ec 24                 sub    $0x24,%esp
80483df:    c7 45 f4 00 00 00 00     movl   $0x0,-0xc(%ebp)
80483e6:    8b 45 f4                 mov    -0xc(%ebp),%eax
80483e9:    89 45 f8                 mov    %eax,-0x8(%ebp)
80483ec:    83 7d f8 00              cmpl   $0x0,-0x8(%ebp)
80483f0:    74 13                    je     8048405 <main+0x37>
80483f2:    8b 45 f8                 mov    -0x8(%ebp),%eax
80483f5:    89 44 24 04              mov    %eax,0x4(%esp)
80483f9:    c7 04 24 e0 84 04 08     movl   $0x80484e0,(%esp)
8048400:    e8 f3 fe ff ff           call   80482f8 <printf@plt>
8048405:    b8 00 00 00 00           mov    $0x0,%eax
804840a:    83 c4 24                 add    $0x24,%esp
804840d:    59                       pop    %ecx
804840e:    5d                       pop    %ebp
804840f:    8d 61 fc                 lea    -0x4(%ecx),%esp
8048412:    c3                       ret   
8048413:    90                       nop   
8048414:    90                       nop   
8048415:    90                       nop   
8048416:    90                       nop   
8048417:    90                       nop   
8048418:    90                       nop   
8048419:    90                       nop   
804841a:    90                       nop   
804841b:    90                       nop   
804841c:    90                       nop   
804841d:    90                       nop   
804841e:    90                       nop   
804841f:    90                       nop

======================================================
关于ELF格式的链接 可以看

1. Intel平台下Linux中 ELF文件动态链接的加载、解析及实例分析): 加载

IBM developerWorks 中国网站 王瑞川 (jeppeterone@163.com)

2. Linkers and Loaders
http://www.iecc.com/linker/

=======================================

2009-05-06 widebright 补充

上面两个命令都是 gnu binutils工具附带的,可能比较有帮助的还有addr2line 可以根据 你出错的堆栈地址找到对应的代码的行数吧。

http://www.gnu.org/software/binutils/

GNU Binutils
The GNU Binutils are a collection of binary tools. The main ones are:

ld - the GNU linker.
as - the GNU assembler.
But they also include:

addr2line - Converts addresses into filenames and line numbers.
ar - A utility for creating, modifying and extracting from archives.
c++filt - Filter to demangle encoded C++ symbols.
dlltool - Creates files for building and using DLLs.
gold - A new, faster, ELF only linker, still in beta test.
gprof - Displays profiling information.
nlmconv - Converts object code into an NLM.
nm - Lists symbols from object files.
objcopy - Copys and translates object files.
objdump - Displays information from object files.
ranlib - Generates an index to the contents of an archive.
readelf - Displays information from any ELF format object file.
size - Lists the section sizes of an object or archive file.
strings - Lists printable strings from files.
strip - Discards symbols.
windmc - A Windows compatible message compiler.
windres - A compiler for Windows resource files.

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2011-05/35837.htm

linux可执行文件格式相关推荐

  1. linux 可执行文件格式分析

    UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出).COFF(Common Object F ...

  2. UNIX/LINUX 平台可执行文件格式分析

    UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出).COFF(Common Object F ...

  3. linux 可执行文件_linux中ELF二进制程序解析

    0. 简介 在Linux系统的可执行文件(ELF文件)中,开头是一个文件头,用来描述程序的布局,整个文件的属性等信息,包括文件是否可执行.静态还是动态链接及入口地址等信息:如下图所示: 程序文件中包含 ...

  4. linux 可执行文件的分析(gcc GUN BUILEIN)

    1.GCC The History of GCC 1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版的GCC横空出世, ...

  5. linux可执行文件签名,elf签名和可执行文件签名

    linux之所以容易清除病毒前面有文章谈过,就是说它可以随时删除文件,linux的文件管理没有和用户的任何策略胶合在一起,就是说打开文件的方式没有独占方式,所谓独占就是和用户的胶合,打开应该仅仅有文件 ...

  6. linux 下怎么将可执行文件做成镜像 开机就能运行这个可执行文件,圣诞老人的ELFs:在没有execve的情况下运行Linux可执行文件...

    这篇博客是年度的12 Days of HaXmas系列博客中的第11篇. Executable and Linkable Format ( ELF ) 是许多类Unix操作系统(如Linux,大多数现 ...

  7. 【Linux系统编程】Linux 可执行文件结构与进程结构

    Linux可执行文件结构 在 Linux 下,程序是一个普通的可执行文件,以下列出一个二进制可执行文件的基本情况: 可以看出,此可执行文件在存储时(没有调入到内存前)分为代码区(text).数据区(d ...

  8. Linux学习之第二课时--linux命令格式及命令概述

    命令概述 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘管理,文件存取,目录操作,进程管理,文件权限设定等 Linux命令格式 Linux命令的组成部分:命令字   命令选项参数( ...

  9. fastdfs windows部署_Go在windows下编译Linux可执行文件

    欢迎关注我的头条号:Wooola,专注于Java.Golang.微服务架构,致力于每天分享原创文章.快乐编码和开源技术. 前言 最近楼主做了一个滑块验证码登录功能,但有个问题,悲观估计一天大约会产生两 ...

最新文章

  1. Linux 系统学习梳理_【All】
  2. 老男孩Python全栈开发(92天全)视频教程 自学笔记20
  3. Lumen中启用session
  4. 对微型计算机工作影响最小的因数是,(已)保护试题9
  5. java spring 拦截器_Spring MVC拦截器(Interceptor)的配置及使用
  6. java整型和浮点型_Java基本的程序结构设计 整形和浮点型
  7. C/C++的readdir和readdir_r函数(遍历目录)
  8. 谷歌浏览器修复工具_奇安信代码卫士协助谷歌修复漏洞 获官方致谢
  9. springboot开篇 (一)简单邮件发送
  10. php中array_flip数组翻转
  11. war2 洛谷模拟赛day2 t3 状压
  12. 水经注下载地图,导出arcgis瓦片,然后通过geoserver+geowebcache发布地图
  13. Eclipse PHPEclipse 配置
  14. 第五节 电阻分压 蓦然回首,那人却在,灯火阑珊处
  15. 2021中国科学院文献情报中心期刊分区表 计算机(2)
  16. 解码M3U8在线流视频AES-128解密TS合并到MP4
  17. 辐射4 Hello World
  18. Window10 ie自带浏览器下载乱码
  19. 智慧城市产业热点板块及产业图谱
  20. Facade模式新解

热门文章

  1. 【数据结构与算法】之深入解析“最小覆盖子串”的求解思路与算法示例
  2. 【数据结构与算法】之深入解析“最优运动员比拼回合”的求解思路与算法示例
  3. iOS经典面试题之分析GCD的dispatch_group任务执行问题
  4. OpenGL ES之GLSL常用内建函数
  5. Label Studio 入门
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1055:判断闰年
  7. cdev_init() / cedev_alloc() / cdev_del()
  8. 【工业控制】什么是波形
  9. 【Linux】一步一步学Linux——cat/tac命令(38)
  10. socket连接时间太长受什么原因影响?_真全粮多功能酿酒设备-酿酒发酵前期为什么要通风处理?...