IT袋

当前位置:主页 > 经验教程 > 系统教程 >

Linux

Linux 下“Hello World”的幕后发生了什么(5)

时间:2023-09-17 20:02:06 来源:IT袋 作者:苏晓敏
导读:Linux,你会发现,这样我们得到的输出结果与直接使用 cat 读取文件所获得的结果完全一致。 $ cat /usr/bin/python3.9 | hexdump -C | head00000000 7f 45 4c 46 02 01 01 00 00 00 00

Linux

你会发现,这样我们得到的输出结果与直接使用cat读取文件所获得的结果完全一致。

$ cat /usr/bin/python3.9 | hexdump -C | head
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  c0 a5 5e 00 00 00 00 00  |..>.......^.....|
00000020  40 00 00 00 00 00 00 00  b8 95 53 00 00 00 00 00  |@.........S.....|
00000030  00 00 00 00 40 00 38 00  0b 00 40 00 1e 00 1d 00  |....@.8...@.....|
00000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
00000050  40 00 40 00 00 00 00 00  40 00 40 00 00 00 00 00  |@.@.....@.@.....|
00000060  68 02 00 00 00 00 00 00  68 02 00 00 00 00 00 00  |h.......h.......|
00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................|
00000080  a8 02 00 00 00 00 00 00  a8 02 40 00 00 00 00 00  |..........@.....|
00000090  a8 02 40 00 00 00 00 00  1c 00 00 00 00 00 00 00  |..@.............|

关于魔术数字的额外说明

这个文件以ELF开头,这是一个被称为“魔术数字magic number”的标识符,它是一种字节序列,告诉我们这是一个 ELF 文件。在 Linux 上,ELF 是二进制文件的格式。

不同的文件格式有不同的魔术数字。例如,gzip 的魔数是1f8b。文件开头的魔术数字就是file blah.gz如何识别出它是一个 gzip 文件的方式。

我认为file命令使用了各种启发式方法来确定文件的类型,而其中,魔术数字是一个重要的特征。

7、寻找解释器

我们来解析这个 ELF 文件,看看里面都有什么内容。

自行验证:运行readelf -a /usr/bin/python3.9。我得到的结果是这样的(但是我删减了大量的内容):

$ readelf -a /usr/bin/python3.9
ELF Header:
    Class:                             ELF64
    Machine:                           Advanced Micro Devices X86-64
...
->  Entry point address:               0x5ea5c0
...
Program Headers:
  Type           Offset             VirtAddr           PhysAddr
  INTERP         0x00000000000002a8 0x00000000004002a8 0x00000000004002a8
                 0x000000000000001c 0x000000000000001c  R      0x1
->      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
        ...
->        1238: 00000000005ea5c0    43 FUNC    GLOBAL DEFAULT   13 _start

从这段内容中,我理解到:

  1. 请求内核运行/lib64/ld-linux-x86-64.so.2来启动这个程序。这就是所谓的动态链接器,我们将在随后的部分对其进行讨论。
  2. 该程序制定了一个入口点(位于0x5ea5c0),那里是这个程序代码开始的地方。

接下来,让我们一起来聊聊动态链接器。

8、动态链接

相关阅读