这些包含可执行代码的段称为正文段。同样地,数据段包含了不可执行的信息或数据。另一种类型的段,称为 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
标签: