《链接器与加载器》第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,world\n";
-
a(string);
-
return 0;
-
}
1.2 main.o的objdump
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));
-
}
-
2.2 a.c的objdump
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
阅读(2140) | 评论(0) | 转发(0) |