电脑技术学习

UNIX 目标文件初探

dn001

  这些包含可执行代码的段称为正文段。同样地,数据段包含了不可执行的信息或数据。另一种类型的段,称为 BSS 段,它包含以符号数据开头的块。

  对于 nm 命令列出的每个符号,它们的值使用十六进制来表示(缺省行为),并且在该符号前面加上了一个表示符号类型的编码字符。常见的各种编码包括:A 表示绝对 (absolute),这意味着不能将该值更改为其他的连接;B 表示 BSS 段中的符号;而 C 表示引用未初始化的数据的一般符号。

  可以将目标文件中所包含的不同的部分划分为段。段可以包含可执行代码、符号名称、初始数据值和许多其他类型的数据。有关这些类型的数据的详细信息,可以阅读 Unix 中 nm 的 man 页面,其中按照该命令输出中的字符编码分别对每种类型进行了描述。

  细节,细节…

  在目标文件阶段,即使是一个简单的 Hello World 程序,其中也包含了大量的细节信息。nm 程序可用于列举符号及其类型和值,但是,要更仔细地研究目标文件中这些命名段的内容,需要使用功能更强大的工具。

  其中两种功能强大的工具是 objdump 和 readelf 程序。通过输入下面的命令,您可以看到目标文件中包含可执行代码的每个段的汇编清单。对于这么一个小的程序,编译器生成了这么多的代码,真的很令人惊异!

objdump -d a.out

  这个命令生成的输出如清单 3 所示。每个可执行代码段将在需要特定的事件时执行,这些事件包括库的初始化和该程序本身主入口点。

  清单 3. objdump 命令的输出a.out:   file format elf32-i386
Disassembly of section .init:
08048278 <_init>:
8048278:    55           push  %ebp
8048279:    89 e5          mov  %esp,%ebp
804827b:    83 ec 08        sub  $0x8,%esp
804827e:    e8 61 00 00 00     call  80482e4 <call_gmon_start>
8048283:    e8 b3 00 00 00     call  804833b <frame_dummy>
8048288:    e8 9f 01 00 00     call  804842c <__do_global_ctors_aux>
804828d:    c9           leave
804828e:    c3           ret
Disassembly of section .plt:
08048290 <puts@plt-0x10>:
8048290:    ff 35 78 95 04 08    pushl 0x8049578
8048296:    ff 25 7c 95 04 08    jmp  *0x804957c
804829c:    00 00          add  %al,(%eax)
    ...
080482a0 <puts@plt>:
80482a0:    ff 25 80 95 04 08    jmp  *0x8049580
80482a6:    68 00 00 00 00     push  $0x0
80482ab:    e9 e0 ff ff ff     jmp  8048290 <_init+0x18>
080482b0 <__libc_start_main@plt>:
80482b0:    ff 25 84 95 04 08    jmp  *0x8049584
80482b6:    68 08 00 00 00     push  $0x8
80482bb:    e9 d0 ff ff ff     jmp  8048290 <_init+0x18>
Disassembly of section .text:
080482c0 <_start>:
80482c0:    31 ed          xor  %ebp,%ebp
80482c2:    5e           pop  %esi
80482c3:    89 e1          mov  %esp,%ecx
80482c5:    83 e4 f0        and  $0xfffffff0,%esp
80482c8:    50           push  %eax
80482c9:    54           push  %esp
80482ca:    52           push  %edx
80482cb:    68 e1 83 04 08     push  $0x80483e1
80482d0:    68 90 83 04 08     push  $0x8048390
80482d5:    51           push  %ecx
80482d6:    56           push  %esi
80482d7:    68 60 83 04 08     push  $0x8048360
80482dc:    e8 cf ff ff ff     call  80482b0 <__libc_start_main@plt>
80482e1:    f4           hlt
80482e2:    90           nop
80482e3:    90           nop
080482e4 <call_gmon_start>:
80482e4:    55           push  %ebp
80482e5:    89 e5          mov  %esp,%ebp
80482e7:    53           push  %ebx
80482e8:    e8 1b 00 00 00     call  8048308 <__i686.get_pc_thunk.bx>
80482ed:    81 c3 87 12 00 00    add  $0x1287,%ebx
80482f3:    83 ec 04        sub  $0x4,%esp
80482f6:    8b 83 fc ff ff ff    mov  0xfffffffc(%ebx),%eax
80482fc:    85 c0          test  %eax,%eax
80482fe:    74 02          je   8048302 <call_gmon_start+0x1e>
8048300:    ff d0          call  *%eax
8048302:    83 c4 04        add  $0x4,%esp
8048305:    5b           pop  %ebx
8048306:    5d           pop  %ebp
8048307:    c3           ret
08048308 <__i686.get_pc_thunk.bx>:
8048308:    8b 1c 24        mov  (%esp),%ebx
804830b:    c3           ret
0804830c <__do_global_dtors_aux>:
804830c:    55           push  %ebp
804830d:    89 e5          mov  %esp,%ebp
804830f:    83 ec 08        sub  $0x8,%esp
8048312:    80 3d 94 95 04 08 00  cmpb  $0x0,0x8049594
8048319:    74 0c          je   8048327 <__do_global_dtors_aux+0x1b>
804831b:    eb 1c          jmp  8048339 <__do_global_dtors_aux+0x2d>
804831d:    83 c0 04        add  $0x4,%eax
8048320:    a3 90 95 04 08     mov  %eax,0x8049590
8048325:    ff d2          call  *%edx
8048327:    a1 90 95 04 08     mov  0x8049590,%eax
804832c:    8b 10          mov  (%eax),%edx
804832e:    85 d2          test  %edx,%edx
8048330:    75 eb          jne  804831d <__do_global_dtors_aux+0x11>
8048332:    c6 05 94 95 04 08 01  movb  $0x1,0x8049594
8048339:    c9           leave
804833a:    c3           ret
0804833b <frame_dummy>:
804833b:    55           push  %ebp
804833c:    89 e5          mov  %esp,%ebp
804833e:    83 ec 08        sub  $0x8,%esp
8048341:    a1 a4 94 04 08     mov  0x80494a4,%eax
8048346:    85 c0          test  %eax,%eax
8048348:    74 12          je   804835c <frame_dummy+0x21>
804834a:    b8 00 00 00 00     mov  $0x0,%eax
804834f:    85 c0          test  %eax,%eax
8048351:    74 09          je   804835c <frame_dummy+0x21>
8048353:    c7 04 24 a4 94 04 08  movl  $0x80494a4,(%esp)
804835a:    ff d0          call  *%eax
804835c:    c9           leave
804835d:    c3           ret
804835e:    90           nop
804835f:    90           nop
08048360 <main>:
8048360:    55           push  %ebp
8048361:    89 e5          mov  %esp,%ebp
8048363:    83 ec 08        sub  $0x8,%esp
8048366:    83 e4 f0        and  $0xfffffff0,%esp
8048369:    b8 00 00 00 00     mov  $0x0,%eax
804836e:    83 c0 0f        add  $0xf,%eax
8048371:    83 c0 0f        add  $0xf,%eax
8048374:    c1 e8 04        shr  $0x4,%eax
8048377:    c1 e0 04        shl  $0x4,%eax
804837a:    29 c4          sub  %eax,%esp
804837c:    c7 04 24 80 84 04 08  movl  $0x8048480,(%esp)
8048383:    e8 18 ff ff ff     call  80482a0 <puts@plt>
8048388:    b8 00 00 00 00     mov  $0x0,%eax
804838d:    c9           leave
804838e:    c3           ret
804838f:    90           nop
08048390 <__libc_csu_init>:
8048390:    55           push  %ebp
8048391:    89 e5          mov  %esp,%ebp
8048393:    57           push  %edi
8048394:    56           push  %esi
8048395:    31 f6          xor  %esi,%esi
8048397:    53           push  %ebx
8048398:    e8 6b ff ff ff     call  8048308 <__i686.get_pc_thunk.bx>
804839d:    81 c3 d7 11 00 00    add  $0x11d7,%ebx
80483a3:    83 ec 0c        sub  $0xc,%esp
80483a6:    e8 cd fe ff ff     call  8048278 <_init>
80483ab:    8d 83 20 ff ff ff    lea  0xffffff20(%ebx),%eax
80483b1:    8d 93 20 ff ff ff    lea  0xffffff20(%ebx),%edx
80483b7:    89 45 f0        mov  %eax,0xfffffff0(%ebp)
80483ba:    29 d0          sub  %edx,%eax
80483bc:    c1 f8 02        sar  $0x2,%eax
80483bf:    39 c6          cmp  %eax,%esi
80483c1:    73 16          jae  80483d9 <__libc_csu_init+0x49>
80483c3:    89 d7          mov  %edx,%edi
80483c5:    ff 14 b2        call  *(%edx,%esi,4)
80483c8:    8b 45 f0        mov  0xfffffff0(%ebp),%eax
80483cb:    83 c6 01        add  $0x1,%esi
80483ce:    29 f8          sub  %edi,%eax
80483d0:    89 fa          mov  %edi,%edx
80483d2:    c1 f8 02        sar  $0x2,%eax
80483d5:    39 c6          cmp  %eax,%esi
80483d7:    72 ec          jb   80483c5 <__libc_csu_init+0x35>
80483d9:    83 c4 0c        add  $0xc,%esp
80483dc:    5b           pop  %ebx
80483dd:    5e           pop  %esi
80483de:    5f           pop  %edi
80483df:    5d           pop  %ebp
80483e0:    c3           ret
080483e1 <__libc_csu_fini>:
80483e1:    55           push  %ebp
80483e2:    89 e5          mov  %esp,%ebp
80483e4:    83 ec 18        sub  $0x18,%esp
80483e7:    89 5d f4        mov  %ebx,0xfffffff4(%ebp)
80483ea:    e8 19 ff ff ff     call  8048308 <__i686.get_pc_thunk.bx>
80483ef:    81 c3 85 11 00 00    add  $0x1185,%ebx
80483f5:    89 75 f8        mov  %esi,0xfffffff8(%ebp)
80483f8:    89 7d fc        mov  %edi,0xfffffffc(%ebp)
80483fb:    8d b3 20 ff ff ff    lea  0xffffff20(%ebx),%esi
8048401:    8d bb 20 ff ff ff    lea  0xffffff20(%ebx),%edi
8048407:    29 fe          sub  %edi,%esi
8048409:    c1 fe 02        sar  $0x2,%esi
804840c:    eb 03          jmp  8048411 <__libc_csu_fini+0x30>
804840e:    ff 14 b7        call  *(%edi,%esi,4)
8048411:    83 ee 01        sub  $0x1,%esi
8048414:    83 fe ff        cmp  $0xffffffff,%esi
8048417:    75 f5          jne  804840e <__libc_csu_fini+0x2d>
8048419:    e8 3a 00 00 00     call  8048458 <_fini>
804841e:    8b 5d f4        mov  0xfffffff4(%ebp),%ebx
8048421:    8b 75 f8        mov  0xfffffff8(%ebp),%esi
8048424:    8b 7d fc        mov  0xfffffffc(%ebp),%edi
8048427:    89 ec          mov  %ebp,%esp
8048429:    5d           pop  %ebp
804842a:    c3           ret
804842b:    90           nop
0804842c <__do_global_ctors_aux>:
804842c:    55           push  %ebp
804842d:    89 e5          mov  %esp,%ebp
804842f:    53           push  %ebx
8048430:    83 ec 04        sub  $0x4,%esp
8048433:    a1 94 94 04 08     mov  0x8049494,%eax
8048438:    83 f8 ff        cmp  $0xffffffff,%eax
804843b:    74 12          je   804844f <__do_global_ctors_aux+0x23>
804843d:    bb 94 94 04 08     mov  $0x8049494,%ebx
8048442:    ff d0          call  *%eax
8048444:    8b 43 fc        mov  0xfffffffc(%ebx),%eax
8048447:    83 eb 04        sub  $0x4,%ebx
804844a:    83 f8 ff        cmp  $0xffffffff,%eax
804844d:    75 f3          jne  8048442 <__do_global_ctors_aux+0x16>
804844f:    83 c4 04        add  $0x4,%esp
8048452:    5b           pop  %ebx
8048453:    5d           pop  %ebp
8048454:    c3           ret
8048455:    90           nop
8048456:    90           nop
8048457:    90           nop
Disassembly of section .fini:
08048458 <_fini>:
8048458:    55           push  %ebp
8048459:    89 e5          mov  %esp,%ebp
804845b:    53           push  %ebx
804845c:    e8 a7 fe ff ff     call  8048308 <__i686.get_pc_thunk.bx>
8048461:    81 c3 13 11 00 00    add  $0x1113,%ebx
8048467:    83 ec 04        sub  $0x4,%esp
804846a:    e8 9d fe ff ff     call  804830c <__do_global_dtors_aux>
804846f:    83 c4 04        add  $0x4,%esp
8048472:    5b           pop  %ebx
8048473:    5d           pop  %ebp
8048474:    c3           ret

标签: