为什么 GCC 不将函数放在共享库中文本部分的开头?

问题描述 投票:0回答:1

我有一个C源文件

temp1.c

void foo(void){}

在我的 AMD64 Archlinux 环境中,我使用命令

gcc -o test1.so -shared test1.c
编译它,并生成一个共享库
test1.so
。然后,我使用命令
test1.so
转储
objdump -D -j .text test1.so
的文本部分,并得到以下输出:

test1.so:     file format elf64-x86-64


Disassembly of section .text:

0000000000001020 <foo-0xc9>:
    1020:       48 8d 3d e1 2f 00 00    lea    0x2fe1(%rip),%rdi        # 4008 <__TMC_END__>
    1027:       48 8d 05 da 2f 00 00    lea    0x2fda(%rip),%rax        # 4008 <__TMC_END__>
    102e:       48 39 f8                cmp    %rdi,%rax
    1031:       74 15                   je     1048 <_init+0x48>
    1033:       48 8b 05 8e 2f 00 00    mov    0x2f8e(%rip),%rax        # 3fc8 <_ITM_deregisterTMCloneTable@Base>
    103a:       48 85 c0                test   %rax,%rax
    103d:       74 09                   je     1048 <_init+0x48>
    103f:       ff e0                   jmp    *%rax
    1041:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    1048:       c3                      ret
    1049:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    1050:       48 8d 3d b1 2f 00 00    lea    0x2fb1(%rip),%rdi        # 4008 <__TMC_END__>
    1057:       48 8d 35 aa 2f 00 00    lea    0x2faa(%rip),%rsi        # 4008 <__TMC_END__>
    105e:       48 29 fe                sub    %rdi,%rsi
    1061:       48 89 f0                mov    %rsi,%rax
    1064:       48 c1 ee 3f             shr    $0x3f,%rsi
    1068:       48 c1 f8 03             sar    $0x3,%rax
    106c:       48 01 c6                add    %rax,%rsi
    106f:       48 d1 fe                sar    %rsi
    1072:       74 14                   je     1088 <_init+0x88>
    1074:       48 8b 05 5d 2f 00 00    mov    0x2f5d(%rip),%rax        # 3fd8 <_ITM_registerTMCloneTable@Base>
    107b:       48 85 c0                test   %rax,%rax
    107e:       74 08                   je     1088 <_init+0x88>
    1080:       ff e0                   jmp    *%rax
    1082:       66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
    1088:       c3                      ret
    1089:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    1090:       f3 0f 1e fa             endbr64
    1094:       80 3d 6d 2f 00 00 00    cmpb   $0x0,0x2f6d(%rip)        # 4008 <__TMC_END__>
    109b:       75 33                   jne    10d0 <_init+0xd0>
    109d:       55                      push   %rbp
    109e:       48 83 3d 3a 2f 00 00    cmpq   $0x0,0x2f3a(%rip)        # 3fe0 <__cxa_finalize@GLIBC_2.2.5>
    10a5:       00 
    10a6:       48 89 e5                mov    %rsp,%rbp
    10a9:       74 0d                   je     10b8 <_init+0xb8>
    10ab:       48 8b 3d 4e 2f 00 00    mov    0x2f4e(%rip),%rdi        # 4000 <__dso_handle>
    10b2:       ff 15 28 2f 00 00       call   *0x2f28(%rip)        # 3fe0 <__cxa_finalize@GLIBC_2.2.5>
    10b8:       e8 63 ff ff ff          call   1020 <_init+0x20>
    10bd:       c6 05 44 2f 00 00 01    movb   $0x1,0x2f44(%rip)        # 4008 <__TMC_END__>
    10c4:       5d                      pop    %rbp
    10c5:       c3                      ret
    10c6:       66 2e 0f 1f 84 00 00    cs nopw 0x0(%rax,%rax,1)
    10cd:       00 00 00 
    10d0:       c3                      ret
    10d1:       66 66 2e 0f 1f 84 00    data16 cs nopw 0x0(%rax,%rax,1)
    10d8:       00 00 00 00 
    10dc:       0f 1f 40 00             nopl   0x0(%rax)
    10e0:       f3 0f 1e fa             endbr64
    10e4:       e9 67 ff ff ff          jmp    1050 <_init+0x50>

00000000000010e9 <foo>:
    10e9:       55                      push   %rbp
    10ea:       48 89 e5                mov    %rsp,%rbp
    10ed:       90                      nop
    10ee:       5d                      pop    %rbp
    10ef:       c3                      ret

我对此输出有两个问题:

  1. 为什么函数
    foo
    的内容没有放在文本部分的开头?
  2. 从文本部分开始到函数开始
    foo
    的内容是什么意思?它只是一些随机值,还是实际上有用?
gcc shared-libraries elf objdump
1个回答
0
投票

为什么函数 foo 的内容没有放在文本部分的开头?

为什么要放在开头?没有要求

foo
必须位于
.text
的开头。

从文本部分开始到函数foo开始的内容是什么意思?我

您似乎在

objdump
stripped 版本上运行
test1.so
。不要这样做(特别是如果您想知道那里有什么)。

当我运行

objdump -D -j.text test1-stripped.so
时,我得到的输出与你的非常相似:

Disassembly of section .text:

0000000000001040 <foo-0xb9>:
    1040:       48 8d 3d c1 2f 00 00    lea    0x2fc1(%rip),%rdi        # 4008 <foo+0x2f0f>
    1047:       48 8d 05 ba 2f 00 00    lea    0x2fba(%rip),%rax        # 4008 <foo+0x2f0f>
    104e:       48 39 f8                cmp    %rdi,%rax
    1051:       74 15                   je     1068 <__cxa_finalize@plt+0x38>
    1053:       48 8b 05 7e 2f 00 00    mov    0x2f7e(%rip),%rax        # 3fd8 <foo+0x2edf>
    105a:       48 85 c0                test   %rax,%rax
    105d:       74 09                   je     1068 <__cxa_finalize@plt+0x38>
    105f:       ff e0                   jmp    *%rax
...
    10e8:       c3                      ret
    10e9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    10f0:       f3 0f 1e fa             endbr64
    10f4:       e9 77 ff ff ff          jmp    1070 <__cxa_finalize@plt+0x40>

00000000000010f9 <foo>:
    10f9:       55                      push   %rbp
    10fa:       48 89 e5                mov    %rsp,%rbp
    10fd:       90                      nop
    10fe:       5d                      pop    %rbp
    10ff:       c3                      ret

但是当我在

unstripped
版本上运行 objdump 时,我看到了这个:

Disassembly of section .text:

0000000000001040 <deregister_tm_clones>:
    1040:       48 8d 3d c1 2f 00 00    lea    0x2fc1(%rip),%rdi        # 4008 <completed.0>
    1047:       48 8d 05 ba 2f 00 00    lea    0x2fba(%rip),%rax        # 4008 <completed.0>
    104e:       48 39 f8                cmp    %rdi,%rax
    1051:       74 15                   je     1068 <deregister_tm_clones+0x28>
    1053:       48 8b 05 7e 2f 00 00    mov    0x2f7e(%rip),%rax        # 3fd8 <_ITM_deregisterTMCloneTable>
    105a:       48 85 c0                test   %rax,%rax
    105d:       74 09                   je     1068 <deregister_tm_clones+0x28>
    105f:       ff e0                   jmp    *%rax
    1061:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    1068:       c3                      ret
    1069:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

0000000000001070 <register_tm_clones>:
    1070:       48 8d 3d 91 2f 00 00    lea    0x2f91(%rip),%rdi        # 4008 <completed.0>
    1077:       48 8d 35 8a 2f 00 00    lea    0x2f8a(%rip),%rsi        # 4008 <completed.0>
    107e:       48 29 fe                sub    %rdi,%rsi
    1081:       48 89 f0                mov    %rsi,%rax
    1084:       48 c1 ee 3f             shr    $0x3f,%rsi
    1088:       48 c1 f8 03             sar    $0x3,%rax
    108c:       48 01 c6                add    %rax,%rsi
    108f:       48 d1 fe                sar    %rsi
    1092:       74 14                   je     10a8 <register_tm_clones+0x38>
    1094:       48 8b 05 35 2f 00 00    mov    0x2f35(%rip),%rax        # 3fd0 <_ITM_registerTMCloneTable>
    109b:       48 85 c0                test   %rax,%rax
    109e:       74 08                   je     10a8 <register_tm_clones+0x38>
    10a0:       ff e0                   jmp    *%rax
    10a2:       66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
    10a8:       c3                      ret
    10a9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

00000000000010b0 <__do_global_dtors_aux>:
    10b0:       f3 0f 1e fa             endbr64
    10b4:       80 3d 4d 2f 00 00 00    cmpb   $0x0,0x2f4d(%rip)        # 4008 <completed.0>
    10bb:       75 2b                   jne    10e8 <__do_global_dtors_aux+0x38>
    10bd:       55                      push   %rbp
    10be:       48 83 3d 02 2f 00 00    cmpq   $0x0,0x2f02(%rip)        # 3fc8 <__cxa_finalize>
    10c5:       00
    10c6:       48 89 e5                mov    %rsp,%rbp
    10c9:       74 0c                   je     10d7 <__do_global_dtors_aux+0x27>
    10cb:       48 8b 3d 2e 2f 00 00    mov    0x2f2e(%rip),%rdi        # 4000 <__dso_handle>
    10d2:       e8 59 ff ff ff          call   1030 <__cxa_finalize@plt>
    10d7:       e8 64 ff ff ff          call   1040 <deregister_tm_clones>
    10dc:       c6 05 25 2f 00 00 01    movb   $0x1,0x2f25(%rip)        # 4008 <completed.0>
    10e3:       5d                      pop    %rbp
    10e4:       c3                      ret
    10e5:       0f 1f 00                nopl   (%rax)
    10e8:       c3                      ret
    10e9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

00000000000010f0 <frame_dummy>:
    10f0:       f3 0f 1e fa             endbr64
    10f4:       e9 77 ff ff ff          jmp    1070 <register_tm_clones>

00000000000010f9 <foo>:
    10f9:       55                      push   %rbp
    10fa:       48 89 e5                mov    %rsp,%rbp
    10fd:       90                      nop
    10fe:       5d                      pop    %rbp
    10ff:       c3                      ret
© www.soinside.com 2019 - 2024. All rights reserved.