-O2
gcc tail_call.c -O2 -o tail_call_const_O2
我拆开了二进制的零件:
main():00000000000010a0 <main>:
10a0: f3 0f 1e fa endbr64
10a4: 41 54 push %r12
10a6: ba 0a 00 00 00 mov $0xa,%edx
10ab: 48 83 ec 10 sub $0x10,%rsp
10af: 48 8b 7e 08 mov 0x8(%rsi),%rdi
10b3: 31 f6 xor %esi,%esi
10b5: e8 c6 ff ff ff callq 1080 <strtol@plt>
10ba: 48 8d 3d 43 0f 00 00 lea 0xf43(%rip),%rdi # 2004 <_IO_stdin_used+0x4>
10c1: 48 c7 44 24 08 67 45 movq $0x4567,0x8(%rsp)
10c8: 00 00
10ca: 4c 63 e0 movslq %eax,%r12
10cd: e8 9e ff ff ff callq 1070 <puts@plt>
10d2: 48 8d 3d 2b 0f 00 00 lea 0xf2b(%rip),%rdi # 2004 <_IO_stdin_used+0x4>
10d9: e8 92 ff ff ff callq 1070 <puts@plt>
-----------------------START----------------------
10de: 49 8d 54 24 be lea -0x42(%r12),%rdx
10e3: b8 57 03 00 00 mov $0x357,%eax
10e8: 48 83 fa 01 cmp $0x1,%rdx
10ec: 76 33 jbe 1121 <main+0x81>
10ee: 49 8d 74 24 fe lea -0x2(%r12),%rsi
10f3: 49 8d 54 24 ff lea -0x1(%r12),%rdx
10f8: b9 34 02 00 00 mov $0x234,%ecx
10fd: 48 83 fe 01 cmp $0x1,%rsi
1101: 77 08 ja 110b <main+0x6b>
1103: eb 5a jmp 115f <main+0xbf>
1105: 0f 1f 00 nopl (%rax)
1108: 48 89 f0 mov %rsi,%rax
110b: 48 83 ea 01 sub $0x1,%rdx
110f: 48 8d 34 01 lea (%rcx,%rax,1),%rsi
1113: 48 89 c1 mov %rax,%rcx
1116: 48 83 fa 02 cmp $0x2,%rdx
111a: 75 ec jne 1108 <main+0x68>
111c: 48 8d 44 30 31 lea 0x31(%rax,%rsi,1),%rax
1121: 48 8d 3d e2 0e 00 00 lea 0xee2(%rip),%rdi # 200a <_IO_stdin_used+0xa>
1128: 48 89 44 24 08 mov %rax,0x8(%rsp)
-----------------------END----------------------
112d: e8 3e ff ff ff callq 1070 <puts@plt>
1132: 48 8d 3d d1 0e 00 00 lea 0xed1(%rip),%rdi # 200a <_IO_stdin_used+0xa>
1139: e8 32 ff ff ff callq 1070 <puts@plt>
113e: 48 8b 4c 24 08 mov 0x8(%rsp),%rcx
1143: 48 83 c4 10 add $0x10,%rsp
1147: 31 c0 xor %eax,%eax
1149: 4c 89 e2 mov %r12,%rdx
114c: 48 8d 35 bd 0e 00 00 lea 0xebd(%rip),%rsi # 2010 <_IO_stdin_used+0x10>
1153: bf 01 00 00 00 mov $0x1,%edi
1158: 41 5c pop %r12
115a: e9 31 ff ff ff jmpq 1090 <__printf_chk@plt>
115f: be 57 03 00 00 mov $0x357,%esi
1164: b8 34 02 00 00 mov $0x234,%eax
1169: eb b1 jmp 111c <main+0x7c>
116b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
fib_tr_const():
00000000000012e0 <fib_tr_const>:
12e0: f3 0f 1e fa endbr64
12e4: 48 8d 4f be lea -0x42(%rdi),%rcx
12e8: 48 8d 04 16 lea (%rsi,%rdx,1),%rax
12ec: 48 83 f9 01 cmp $0x1,%rcx
12f0: 76 36 jbe 1328 <fib_tr_const+0x48>
12f2: 48 8d 4f ff lea -0x1(%rdi),%rcx
12f6: 48 83 ef 02 sub $0x2,%rdi
12fa: 48 83 ff 01 cmp $0x1,%rdi
12fe: 77 0b ja 130b <fib_tr_const+0x2b>
1300: eb 2e jmp 1330 <fib_tr_const+0x50>
1302: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
1308: 48 89 f0 mov %rsi,%rax
130b: 48 83 e9 01 sub $0x1,%rcx
130f: 48 8d 34 02 lea (%rdx,%rax,1),%rsi
1313: 48 89 c2 mov %rax,%rdx
1316: 48 83 f9 02 cmp $0x2,%rcx
131a: 75 ec jne 1308 <fib_tr_const+0x28>
131c: 48 8d 44 06 31 lea 0x31(%rsi,%rax,1),%rax
1321: c3 retq
1322: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
1328: c3 retq
1329: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
1330: 48 89 c6 mov %rax,%rsi
1333: 48 89 d0 mov %rdx,%rax
1336: eb e4 jmp 131c <fib_tr_const+0x3c>
1338: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
133f: 00
在地标
printf ("11111\n");
和
printf ("22222\n");
,因此在组装中,我相信
puts
和
START
之间的部分应该是END
呼叫main()
.。但我没有看到从main()到fib_tr_const()分支的任何
fib_tr_const()
或call
指令。 那么如何调用此功能?
和i比较了介于fib_tr_const()的组件之间的组件,它们看起来相似,因此fib_tr_const()函数似乎是
In-in-lined到main()。
因此,自然会出现另一个问题,如果该功能是衬有内衬的,为什么它仍然存在于二进制中?如果删除如果删除会节省更多空间? thanks.
这与
翻译单元的概念有关。编译器处理的“单元”是“单元”,可以看作是带有所有随附的标头文件的单个源文件。 commince是所有编译器所知道的,它只能从当前的TU上进行内联函数,而不是其他任何TU的函数。但是,因此,编译器不知道是否可以从另一个TU使用这些函数,因此该函数实际上需要存在,因此,如果从另一个Tu中调用了链接器,则可以找到它。