无法理解 readelf 输出中某个部分的“关闭”值?它是从“地址”偏移的吗?

问题描述

这里是 readelf -a test.elf 的输出

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        0000000040000000 010000 00007c 00  AX  0   0  8
  [ 2] .rodata           PROGBITS        0000000040000080 010080 000016 00   A  0   0  8
  [ 3] .debug_info       PROGBITS        0000000000000000 010096 0000af 00      0   0  1
  [ 4] .debug_abbrev     PROGBITS        0000000000000000 010145 000086 00      0   0  1
  [ 5] .debug_aranges    PROGBITS        0000000000000000 0101cb 000030 00      0   0  1

.text 部分从 0x40000000 开始。使用调试器,我可以看到 PC 值从 0x40000000 开始,并且那里的代码是 startup.s,它应该在那里。但我不确定为什么该部分的“关闭”值是 0x10000。这个“关闭”值是什么意思?一个部分的地址和大小还不够吗?

解决方法

Offset 字段表示该段在文件中的位置。这里的 .text 段从位置 0x10000 开始,长度为 0x7c 个字节,然后下一个段 .rodata 从 0x10080 等处开始。