Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

UNIX 目标文件初探

来源:linux.chinaunix.net 作者:Bill Zimmerly  时间:2007-04-22 点击: [收藏] [投稿]

对于那些着迷于底层编程细节的程序员来说,这是一个功能非常强大的工具,可用于研究编译器和汇编器的输出。细节信息,比如这段代码中所显示的这些信息,可以揭示有关本地处理器本身运行方式的很多内容。对该处理器制造商提供的技术文档进行深入的研究,您可以收集关于一些有价值的信息,通过这些信息可以深入地了解内部的运行机制,因为功能程序提供了清晰的输出。

类似地,readelf 程序也可以清楚地列出目标文件中的内容。输入下面的命令,您将可以看到这一点:

readelf -all a.out

这个命令生成的输出如清单 4 所示。ELF Header 为该文件中所有段入口显示了详细的摘要。在列举出这些 Header 中的内容之前,您可以看到 Header 的具体数目。在研究一个较大的目标文件时,该信息可能非常有用。


清单 4. readelf 命令的输出
	
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:               0x80482c0
  Start of program headers:          52 (bytes into file)
  Start of section headers:          3504 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           40 (bytes)
  Number of section headers:         34
  Section header string table index: 31

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        08048114 000114 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            08048128 000128 000020 00   A  0   0  4
  [ 3] .hash             HASH            08048148 000148 00002c 04   A  4   0  4
  [ 4] .dynsym           DYNSYM          08048174 000174 000060 10   A  5   1  4
  [ 5] .dynstr           STRTAB          080481d4 0001d4 00005e 00   A  0   0  1
  [ 6] .gnu.version      VERSYM          08048232 000232 00000c 02   A  4   0  2
  [ 7] .gnu.version_r    VERNEED         08048240 000240 000020 00   A  5   1  4
  [ 8] .rel.dyn          REL             08048260 000260 000008 08   A  4   0  4
  [ 9] .rel.plt          REL             08048268 000268 000010 08   A  4  11  4
  [10] .init             PROGBITS        08048278 000278 000017 00  AX  0   0  1
  [11] .plt              PROGBITS        08048290 000290 000030 04  AX  0   0  4
  [12] .text             PROGBITS        080482c0 0002c0 000198 00  AX  0   0  4
  [13] .fini             PROGBITS        08048458 000458 00001d 00  AX  0   0  1
  [14] .rodata           PROGBITS        08048478 000478 000015 00   A  0   0  4
  [15] .eh_frame         PROGBITS        08048490 000490 000004 00   A  0   0  4
  [16] .ctors            PROGBITS        08049494 000494 000008 00  WA  0   0  4
  [17] .dtors            PROGBITS        0804949c 00049c 000008 00  WA  0   0  4
  [18] .jcr              PROGBITS        080494a4 0004a4 000004 00  WA  0   0  4
  [19] .dynamic          DYNAMIC         080494a8 0004a8 0000c8 08  WA  5   0  4
  [20] .got              PROGBITS        08049570 000570 000004 04  WA  0   0  4
  [21] .got.plt          PROGBITS        08049574 000574 000014 04  WA  0   0  4
  [22] .data             PROGBITS        08049588 000588 00000c 00  WA  0   0  4
  [23] .bss              NOBITS          08049594 000594 000004 00  WA  0   0  4
  [24] .comment          PROGBITS        00000000 000594 000126 00      0   0  1
  [25] .debug_aranges    PROGBITS        00000000 0006c0 000088 00      0   0  8
  [26] .debug_pubnames   PROGBITS        00000000 000748 000025 00      0   0  1
  [27] .debug_info       PROGBITS        00000000 00076d 00022b 00      0   0  1
  [28] .debug_abbrev     PROGBITS        00000000 000998 000076 00      0   0  1
  [29] .debug_line       PROGBITS        00000000 000a0e 0001bb 00      0   0  1
  [30] .debug_str        PROGBITS        00000000 000bc9 0000bf 01  MS  0   0  1
  [31] .shstrtab         STRTAB          00000000 000c88 000127 00      0   0  1
  [32] .symtab           SYMTAB          00000000 001300 000520 10     33  63  4
  [33] .strtab           STRTAB          00000000 001820 0002d2 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.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x000e0 0x000e0 R E 0x4
  INTERP         0x000114 0x08048114 0x08048114 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x00494 0x00494 R E 0x1000
  LOAD           0x000494 0x08049494 0x08049494 0x00100 0x00104 RW  0x1000
  DYNAMIC        0x0004a8 0x080494a8 0x080494a8 0x000c8 0x000c8 RW  0x4
  NOTE           0x000128 0x08048128 0x08048128 0x00020 0x00020 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00
   01     .interp
   02     .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version 
          .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame
   03     .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
   04     .dynamic
   05     .note.ABI-tag
   06

Dynamic section at offset 0x4a8 contains 20 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x8048278
 0x0000000d (FINI)                       0x8048458
 0x00000004 (HASH)                       0x8048148
 0x00000005 (STRTAB)                     0x80481d4
 0x00000006 (SYMTAB)                     0x8048174
 0x0000000a (STRSZ)                      94 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x8049574
 0x00000002 (PLTRELSZ)                   16 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x8048268
 0x00000011 (REL)                        0x8048260
 0x00000012 (RELSZ)                      8 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x8048240
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x8048232
 0x00000000 (NULL)                       0x0

Relocation section '.rel.dyn' at offset 0x260 contains 1 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049570  00000506 R_386_GLOB_DAT    00000000   __gmon_start__

Relocation section '.rel.plt' at offset 0x268 contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049580  00000107 R_386_JUMP_SLOT   00000000   puts
08049584  00000207 R_386_JUMP_SLOT   00000000   __libc_start_main

There are no unwind sections in this file.

Symbol table '.dynsym' contains 6 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000   378 FUNC    GLOBAL DEFAULT  UND puts@GLIBC_2.0 (2)
     2: 00000000   230 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.0 (2)
     3: 0804847c     4 OBJECT  GLOBAL DEFAULT   14 _IO_stdin_used
     4: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
     5: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__

Symbol table '.symtab' contains 82 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 08048114     0 SECTION LOCAL  DEFAULT    1
     2: 08048128     0 SECTION LOCAL  DEFAULT    2
     3: 08048148     0 SECTION LOCAL  DEFAULT    3
     4: 08048174     0 SECTION LOCAL  DEFAULT    4
     5: 080481d4     0 SECTION LOCAL  DEFAULT    5
     6: 08048232     0 SECTION LOCAL  DEFAULT    6
     7: 08048240     0 SECTION LOCAL  DEFAULT    7
     8: 08048260     0 SECTION LOCAL  DEFAULT    8
     9: 08048268     0 SECTION LOCAL  DEFAULT    9
    10: 08048278     0 SECTION LOCAL  DEFAULT   10
    11: 08048290     0 SECTION LOCAL  DEFAULT   11
    12: 080482c0     0 SECTION LOCAL  DEFAULT   12
    13: 08048458     0 SECTION LOCAL  DEFAULT   13
    14: 08048478     0 SECTION LOCAL  DEFAULT   14
    15: 08048490     0 SECTION LOCAL  DEFAULT   15
    16: 08049494     0 SECTION LOCAL  DEFAULT   16
    17: 0804949c     0 SECTION LOCAL  DEFAULT   17
    18: 080494a4     0 SECTION LOCAL  DEFAULT   18
    19: 080494a8     0 SECTION LOCAL  DEFAULT   19
    20: 08049570     0 SECTION LOCAL  DEFAULT   20
    21: 08049574     0 SECTION LOCAL  DEFAULT   21
    22: 08049588     0 SECTION LOCAL  DEFAULT   22
    23: 08049594     0 SECTION LOCAL  DEFAULT   23
    24: 00000000     0 SECTION LOCAL  DEFAULT   24
    25: 00000000     0 SECTION LOCAL  DEFAULT   25
    26: 00000000     0 SECTION LOCAL  DEFAULT   26
    27: 00000000     0 SECTION LOCAL  DEFAULT   27
    28: 00000000     0 SECTION LOCAL  DEFAULT   28
    29: 00000000     0 SECTION LOCAL  DEFAULT   29
    30: 00000000     0 SECTION LOCAL  DEFAULT   30
    31: 00000000     0 SECTION LOCAL  DEFAULT   31
    32: 00000000     0 SECTION LOCAL  DEFAULT   32
    33: 00000000     0 SECTION LOCAL  DEFAULT   33
    34: 00000000     0 FILE    LOCAL  DEFAULT  ABS abi-note.S
    35: 00000000     0 FILE    LOCAL  DEFAULT  ABS ../sysdeps/i386/elf/start
    36: 00000000     0 FILE    LOCAL  DEFAULT  ABS init.c
    37: 00000000     0 FILE    LOCAL  DEFAULT  ABS initfini.c
    38: 00000000     0 FILE    LOCAL  DEFAULT  ABS /build/buildd/glibc-2.3.6
    39: 080482e4     0 FUNC    LOCAL  DEFAULT   12 call_gmon_start
    40: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    41: 08049494     0 OBJECT  LOCAL  DEFAULT   16 __CTOR_LIST__
    42: 0804949c     0 OBJECT  LOCAL  DEFAULT   17 __DTOR_LIST__
    43: 080494a4     0 OBJECT  LOCAL  DEFAULT   18 __JCR_LIST__
    44: 08049594     1 OBJECT  LOCAL  DEFAULT   23 completed.4463
    45: 08049590     0 OBJECT  LOCAL  DEFAULT   22 p.4462
    46: 0804830c     0 FUNC    LOCAL  DEFAULT   12 __do_global_dtors_aux
    47: 0804833b     0 FUNC    LOCAL  DEFAULT   12 frame_dummy
    48: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    49: 08049498     0 OBJECT  LOCAL  DEFAULT   16 __CTOR_END__
    50: 080494a0     0 OBJECT  LOCAL  DEFAULT   17 __DTOR_END__
    51: 08048490     0 OBJECT  LOCAL  DEFAULT   15 __FRAME_END__
    52: 080494a4     0 OBJECT  LOCAL  DEFAULT   18 __JCR_END__
    53: 0804842c     0 FUNC    LOCAL  DEFAULT   12 __do_global_ctors_aux
    54: 00000000     0 FILE    LOCAL  DEFAULT  ABS initfini.c
    55: 00000000     0 FILE    LOCAL  DEFAULT  ABS /build/buildd/glibc-2.3.6
    56: 00000000     0 FILE    LOCAL  DEFAULT  ABS hw.c
    57: 080494a8     0 OBJECT  LOCAL  HIDDEN   19 _DYNAMIC
    58: 08049494     0 NOTYPE  LOCAL  HIDDEN  ABS __fini_array_end
    59: 08049494     0 NOTYPE  LOCAL  HIDDEN  ABS __fini_array_start
    60: 08049494     0 NOTYPE  LOCAL  HIDDEN  ABS __init_array_end
    61: 08049574     0 OBJECT  LOCAL  HIDDEN   21 _GLOBAL_OFFSET_TABLE_
    62: 08049494     0 NOTYPE  LOCAL  HIDDEN  ABS __init_array_start
    63: 08048478     4 OBJECT  GLOBAL DEFAULT   14 _fp_hw
    64: 0804958c     0 OBJECT  GLOBAL HIDDEN   22 __dso_handle
    65: 080483e1    74 FUNC    GLOBAL DEFAULT   12 __libc_csu_fini
    66: 00000000   378 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.0
    67: 08048278     0 FUNC    GLOBAL DEFAULT   10 _init
    68: 080482c0     0 FUNC    GLOBAL DEFAULT   12 _start
    69: 08048390    81 FUNC    GLOBAL DEFAULT   12 __libc_csu_init
    70: 08049594     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    71: 08048360    47 FUNC    GLOBAL DEFAULT   12 main
    72: 00000000   230 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
    73: 08049588     0 NOTYPE  WEAK   DEFAULT   22 data_start
    74: 08048458     0 FUNC    GLOBAL DEFAULT   13 _fini
    75: 08049594     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    76: 08048308     0 FUNC    GLOBAL HIDDEN   12 __i686.get_pc_thunk.bx
    77: 08049598     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    78: 0804847c     4 OBJECT  GLOBAL DEFAULT   14 _IO_stdin_used
    79: 08049588     0 NOTYPE  GLOBAL DEFAULT   22 __data_start
    80: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    81: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__

Histogram for bucket list length (total of 3 buckets):
 Length  Number     % of total  Coverage
      0  0          (  0.0%)
      1  1          ( 33.3%)     20.0%
      2  2          ( 66.7%)    100.0%

Version symbols section '.gnu.version' contains 6 entries:
 Addr: 0000000008048232  Offset: 0x000232  Link: 4 (.dynsym)
  000:   0 (*local*)       2 (GLIBC_2.0)     2 (GLIBC_2.0)     1 (*global*)
  004:   0 (*local*)       0 (*local*)

Version needs section '.gnu.version_r' contains 1 entries:
 Addr: 0x0000000008048240  Offset: 0x000240  Link to section: 5 (.dynstr)
  000000: Version: 1  File: libc.so.6  Cnt: 1
  0x0010:   Name: GLIBC_2.0  Flags: none  Version: 2

Notes at offset 0x00000128 with length 0x00000020:
  Owner         Data size       Description
  GNU           0x00000010      NT_VERSION (version)


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:基于libmad 的简单MP3流媒体播放器的实现   下一篇:用 PHP 读取文件的正确方法

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号