概述
《链接器与加载器》第1章链接与加载
1.
1.1 main.c
- cong@msi:/work/test/test/linkload$ cat m.c
- #include <stdio.h>
- #include <stdlib.h>
- extern void a(char*);
- int main (int argc, char *argv[])
- {
- static char string[]="hello,worldn";
- a(string);
- return 0;
- }
gcc -c -O0 m.c -o m.o ;这儿只是编译,没有链接
- cong@msi:/work/test/test/linkload$ objdump -S ./m.o --> -S的作用是:
-S
--source
Display source code intermixed with disassembly, if possible. Implies -d
-
- ./m.o: file format elf64-x86-64
-
-
- Disassembly of section .text:
-
- 0000000000000000 <main>:
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 48 83 ec 10 sub $0x10,%rsp
- 8: 89 7d fc mov %edi,-0x4(%rbp)
- b: 48 89 75 f0 mov %rsi,-0x10(%rbp)
- f: bf 00 00 00 00 mov $0x0,%edi
- 14: e8 00 00 00 00 callq 19 <main+0x19> -->《链接器与加载器》上是call 0
- 19: b8 00 00 00 00 mov $0x0,%eax -->这儿是下一行的地址
- 1e: c9 leaveq
- 1f: c3 retq
我的理解:程序本身就是顺序执行的,这儿的call不知道要call到哪个地址去,索性就顺序执行。
2.
2.1 a.c
- cong@msi:/work/test/test/linkload$ cat a.c
- #include <unistd.h>
- #include <string.h>
- void a(char* s)
- {
- write(1, s, strlen(s));
- }
gcc -c -O0 a.c -o a.o ;这儿只是编译,没有链接
- cong@msi:/work/test/test/linkload$ objdump -S ./a.o
-
- ./a.o: file format elf64-x86-64
-
-
- Disassembly of section .text:
-
- 0000000000000000 <a>:
- 0: 55 push %rbp
- 1: 48 89 e5 mov %rsp,%rbp
- 4: 48 83 ec 10 sub $0x10,%rsp
- 8: 48 89 7d f8 mov %rdi,-0x8(%rbp)
- c: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 10: 48 89 c7 mov %rax,%rdi
- 13: e8 00 00 00 00 callq 18 <a+0x18> -->《链接器与加载器》上是call 0
- 18: 48 89 c2 mov %rax,%rdx -->这儿是下一行的地址
- 1b: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 1f: 48 89 c6 mov %rax,%rsi
- 22: bf 01 00 00 00 mov $0x1,%edi
- 27: e8 00 00 00 00 callq 2c <a+0x2c>
- 2c: c9 leaveq
- 2d: c3 retq
3.完整程序的objdump
gcc a.o m.o -o test 链接之后
- cong@msi:/work/test/test/linkload$ objdump -S ./test
-
- ./test: file format elf64-x86-64
-
-
- Disassembly of section .init:
-
- 0000000000400418 <_init>:
- 400418: 48 83 ec 08 sub $0x8,%rsp
- 40041c: 48 8b 05 d5 0b 20 00 mov 0x200bd5(%rip),%rax # 600ff8 <_DYNAMIC+0x1d0>
- 400423: 48 85 c0 test %rax,%rax
- 400426: 74 05 je 40042d <_init+0x15>
- 400428: e8 53 00 00 00 callq 400480 <__gmon_start__@plt>
- 40042d: 48 83 c4 08 add $0x8,%rsp
- 400431: c3 retq
-
- Disassembly of section .plt:
-
- 0000000000400440 <write@plt-0x10>:
- 400440: ff 35 c2 0b 20 00 pushq 0x200bc2(%rip) # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
- 400446: ff 25 c4 0b 20 00 jmpq *0x200bc4(%rip) # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
- 40044c: 0f 1f 40 00 nopl 0x0(%rax)
-
- 0000000000400450 <write@plt>:
- 400450: ff 25 c2 0b 20 00 jmpq *0x200bc2(%rip) # 601018 <_GLOBAL_OFFSET_TABLE_+0x18>
- 400456: 68 00 00 00 00 pushq $0x0
- 40045b: e9 e0 ff ff ff jmpq 400440 <_init+0x28>
-
- 0000000000400460 <strlen@plt>:
- 400460: ff 25 ba 0b 20 00 jmpq *0x200bba(%rip) # 601020 <_GLOBAL_OFFSET_TABLE_+0x20>
- 400466: 68 01 00 00 00 pushq $0x1
- 40046b: e9 d0 ff ff ff jmpq 400440 <_init+0x28>
-
- 0000000000400470 <__libc_start_main@plt>:
- 400470: ff 25 b2 0b 20 00 jmpq *0x200bb2(%rip) # 601028 <_GLOBAL_OFFSET_TABLE_+0x28>
- 400476: 68 02 00 00 00 pushq $0x2
- 40047b: e9 c0 ff ff ff jmpq 400440 <_init+0x28>
-
- 0000000000400480 <__gmon_start__@plt>:
- 400480: ff 25 aa 0b 20 00 jmpq *0x200baa(%rip) # 601030 <_GLOBAL_OFFSET_TABLE_+0x30>
- 400486: 68 03 00 00 00 pushq $0x3
- 40048b: e9 b0 ff ff ff jmpq 400440 <_init+0x28>
-
- Disassembly of section .text:
-
- 0000000000400490 <_start>:
- 400490: 31 ed xor %ebp,%ebp
- 400492: 49 89 d1 mov %rdx,%r9
- 400495: 5e pop %rsi
- 400496: 48 89 e2 mov %rsp,%rdx
- 400499: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
- 40049d: 50 push %rax
- 40049e: 54 push %rsp
- 40049f: 49 c7 c0 40 06 40 00 mov $0x400640,%r8
- 4004a6: 48 c7 c1 d0 05 40 00 mov $0x4005d0,%rcx
- 4004ad: 48 c7 c7 ab 05 40 00 mov $0x4005ab,%rdi
- 4004b4: e8 b7 ff ff ff callq 400470 <__libc_start_main@plt>
- 4004b9: f4 hlt
- 4004ba: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
-
- 00000000004004c0 <deregister_tm_clones>:
- 4004c0: b8 5f 10 60 00 mov $0x60105f,%eax
- 4004c5: 55 push %rbp
- 4004c6: 48 2d 58 10 60 00 sub $0x601058,%rax
- 4004cc: 48 83 f8 0e cmp $0xe,%rax
- 4004d0: 48 89 e5 mov %rsp,%rbp
- 4004d3: 77 02 ja 4004d7 <deregister_tm_clones+0x17>
- 4004d5: 5d pop %rbp
- 4004d6: c3 retq
- 4004d7: b8 00 00 00 00 mov $0x0,%eax
- 4004dc: 48 85 c0 test %rax,%rax
- 4004df: 74 f4 je 4004d5 <deregister_tm_clones+0x15>
- 4004e1: 5d pop %rbp
- 4004e2: bf 58 10 60 00 mov $0x601058,%edi
- 4004e7: ff e0 jmpq *%rax
- 4004e9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
-
- 00000000004004f0 <register_tm_clones>:
- 4004f0: b8 58 10 60 00 mov $0x601058,%eax
- 4004f5: 55 push %rbp
- 4004f6: 48 2d 58 10 60 00 sub $0x601058,%rax
- 4004fc: 48 c1 f8 03 sar $0x3,%rax
- 400500: 48 89 e5 mov %rsp,%rbp
- 400503: 48 89 c2 mov %rax,%rdx
- 400506: 48 c1 ea 3f shr $0x3f,%rdx
- 40050a: 48 01 d0 add %rdx,%rax
- 40050d: 48 d1 f8 sar %rax
- 400510: 75 02 jne 400514 <register_tm_clones+0x24>
- 400512: 5d pop %rbp
- 400513: c3 retq
- 400514: ba 00 00 00 00 mov $0x0,%edx
- 400519: 48 85 d2 test %rdx,%rdx
- 40051c: 74 f4 je 400512 <register_tm_clones+0x22>
- 40051e: 5d pop %rbp
- 40051f: 48 89 c6 mov %rax,%rsi
- 400522: bf 58 10 60 00 mov $0x601058,%edi
- 400527: ff e2 jmpq *%rdx
- 400529: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
-
- 0000000000400530 <__do_global_dtors_aux>:
- 400530: 80 3d 1e 0b 20 00 00 cmpb $0x0,0x200b1e(%rip) # 601055 <_edata>
- 400537: 75 11 jne 40054a <__do_global_dtors_aux+0x1a>
- 400539: 55 push %rbp
- 40053a: 48 89 e5 mov %rsp,%rbp
- 40053d: e8 7e ff ff ff callq 4004c0 <deregister_tm_clones>
- 400542: 5d pop %rbp
- 400543: c6 05 0b 0b 20 00 01 movb $0x1,0x200b0b(%rip) # 601055 <_edata>
- 40054a: f3 c3 repz retq
- 40054c: 0f 1f 40 00 nopl 0x0(%rax)
-
- 0000000000400550 <frame_dummy>:
- 400550: 48 83 3d c8 08 20 00 cmpq $0x0,0x2008c8(%rip) # 600e20 <__JCR_END__>
- 400557: 00
- 400558: 74 1e je 400578 <frame_dummy+0x28>
- 40055a: b8 00 00 00 00 mov $0x0,%eax
- 40055f: 48 85 c0 test %rax,%rax
- 400562: 74 14 je 400578 <frame_dummy+0x28>
- 400564: 55 push %rbp
- 400565: bf 20 0e 60 00 mov $0x600e20,%edi
- 40056a: 48 89 e5 mov %rsp,%rbp
- 40056d: ff d0 callq *%rax
- 40056f: 5d pop %rbp
- 400570: e9 7b ff ff ff jmpq 4004f0 <register_tm_clones>
- 400575: 0f 1f 00 nopl (%rax)
- 400578: e9 73 ff ff ff jmpq 4004f0 <register_tm_clones>
-
- 000000000040057d <a>:
- 40057d: 55 push %rbp
- 40057e: 48 89 e5 mov %rsp,%rbp
- 400581: 48 83 ec 10 sub $0x10,%rsp
- 400585: 48 89 7d f8 mov %rdi,-0x8(%rbp)
- 400589: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 40058d: 48 89 c7 mov %rax,%rdi
- 400590: e8 cb fe ff ff callq 400460 <strlen@plt> -->在编译时是 callq 18,链接后变成了符号strlen的地址
- 400595: 48 89 c2 mov %rax,%rdx
- 400598: 48 8b 45 f8 mov -0x8(%rbp),%rax
- 40059c: 48 89 c6 mov %rax,%rsi
- 40059f: bf 01 00 00 00 mov $0x1,%edi
- 4005a4: e8 a7 fe ff ff callq 400450 <write@plt> -->在编译时是 callq 2c,链接后变成了符号write的地址
- 4005a9: c9 leaveq
- 4005aa: c3 retq
-
- 00000000004005ab <main>:
- 4005ab: 55 push %rbp
- 4005ac: 48 89 e5 mov %rsp,%rbp
- 4005af: 48 83 ec 10 sub $0x10,%rsp
- 4005b3: 89 7d fc mov %edi,-0x4(%rbp)
- 4005b6: 48 89 75 f0 mov %rsi,-0x10(%rbp)
- 4005ba: bf 48 10 60 00 mov $0x601048,%edi
- 4005bf: e8 b9 ff ff ff callq 40057d <a> -->在编译时是 callq 19,链接后变成了符号a的地址
- 4005c4: b8 00 00 00 00 mov $0x0,%eax
- 4005c9: c9 leaveq
- 4005ca: c3 retq
- 4005cb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
-
- 00000000004005d0 <__libc_csu_init>:
- 4005d0: 41 57 push %r15
- 4005d2: 41 89 ff mov %edi,%r15d
- 4005d5: 41 56 push %r14
- 4005d7: 49 89 f6 mov %rsi,%r14
- 4005da: 41 55 push %r13
- 4005dc: 49 89 d5 mov %rdx,%r13
- 4005df: 41 54 push %r12
- 4005e1: 4c 8d 25 28 08 20 00 lea 0x200828(%rip),%r12 # 600e10 <__frame_dummy_init_array_entry>
- 4005e8: 55 push %rbp
- 4005e9: 48 8d 2d 28 08 20 00 lea 0x200828(%rip),%rbp # 600e18 <__init_array_end>
- 4005f0: 53 push %rbx
- 4005f1: 4c 29 e5 sub %r12,%rbp
- 4005f4: 31 db xor %ebx,%ebx
- 4005f6: 48 c1 fd 03 sar $0x3,%rbp
- 4005fa: 48 83 ec 08 sub $0x8,%rsp
- 4005fe: e8 15 fe ff ff callq 400418 <_init>
- 400603: 48 85 ed test %rbp,%rbp
- 400606: 74 1e je 400626 <__libc_csu_init+0x56>
- 400608: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
- 40060f: 00
- 400610: 4c 89 ea mov %r13,%rdx
- 400613: 4c 89 f6 mov %r14,%rsi
- 400616: 44 89 ff mov %r15d,%edi
- 400619: 41 ff 14 dc callq *(%r12,%rbx,8)
- 40061d: 48 83 c3 01 add $0x1,%rbx
- 400621: 48 39 eb cmp %rbp,%rbx
- 400624: 75 ea jne 400610 <__libc_csu_init+0x40>
- 400626: 48 83 c4 08 add $0x8,%rsp
- 40062a: 5b pop %rbx
- 40062b: 5d pop %rbp
- 40062c: 41 5c pop %r12
- 40062e: 41 5d pop %r13
- 400630: 41 5e pop %r14
- 400632: 41 5f pop %r15
- 400634: c3 retq
- 400635: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1)
- 40063c: 00 00 00 00
-
- 0000000000400640 <__libc_csu_fini>:
- 400640: f3 c3 repz retq
-
- Disassembly of section .fini:
-
- 0000000000400644 <_fini>:
- 400644: 48 83 ec 08 sub $0x8,%rsp
- 400648: 48 83 c4 08 add $0x8,%rsp
- 40064c: c3 retq
最后
以上就是腼腆蛋挞为你收集整理的链接与加载---1.objdump查看机器码的全部内容,希望文章能够帮你解决链接与加载---1.objdump查看机器码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复