返回介绍

1. 段

发布于 2024-10-13 10:58:56 字数 3179 浏览 0 评论 0 收藏 0

可执行文件由不同用途的段(section/segment)组成。

  • .text : 二进制机器码。
  • .data : 有初始化值的全局变量。
  • .bss : 无初始化值的全局变量。
  • .rodata : 只读数据。

查看段相关信息。

$ readelf -S ./test

Section Headers:
  [Nr] Name        Type       Address       Offset
     Size        EntSize      Flags  Link  Info  Align
  [ 0]           NULL       0000000000000000  00000000
     0000000000000000  0000000000000000       0   0   0
  [ 1] .text       PROGBITS     0000000000401000  00001000
     0000000000000029  0000000000000000  AX     0   0   16
  [ 2] .roata      PROGBITS     0000000000402000  00002000
     000000000000000e  0000000000000000   A     0   0   1
  [ 3] .stab       PROGBITS     0000000000000000  00002010
     000000000000009c  0000000000000014       4   0   4
  [ 4] .stabstr      STRTAB       0000000000000000  000020ac
     0000000000000008  0000000000000000       0   0   1
  [ 5] .symtab       SYMTAB       0000000000000000  000020b8
     0000000000000138  0000000000000018       6   9   8
  [ 6] .strtab       STRTAB       0000000000000000  000021f0
     0000000000000030  0000000000000000       0   0   1
  [ 7] .shstrtab     STRTAB       0000000000000000  00002220
     0000000000000037  0000000000000000       0   0   1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)
$ readelf -l ./test

Program Headers:
  Type       Offset       VirtAddr       PhysAddr
         FileSiz      MemSiz        Flags  Align
  LOAD       0x0000000000000000 0x0000000000400000 0x0000000000400000
         0x00000000000000e8 0x00000000000000e8  R    0x1000
  LOAD       0x0000000000001000 0x0000000000401000 0x0000000000401000
         0x0000000000000029 0x0000000000000029  R E  0x1000
  LOAD       0x0000000000002000 0x0000000000402000 0x0000000000402000
         0x000000000000000e 0x000000000000000e  R    0x1000

 Section to Segment mapping:
  Segment Sections...
   00   
   01   .text 
   02   .roata 

注意,段名区分大小写。错误拼写可能导致段无法被赋予正确的权限属性,造成程序头映射错误、反汇编故障、调试故障等。如果将源码中的 .text 改成 .TEXT

$ readelf -S ./test

Section Headers:
  [Nr] Name        Type       Address       Offset
     Size        EntSize      Flags  Link  Info  Align
  [ 2] .TEXT       PROGBITS     000000000040100e  0000100e
     0000000000000029  0000000000000000   A     0   0   1
                      # 没有 X !!!
$ readelf -l ./test

Program Headers:
  Type       Offset       VirtAddr       PhysAddr
         FileSiz      MemSiz        Flags  Align
  LOAD       0x0000000000000000 0x0000000000400000 0x0000000000400000
         0x0000000000001037 0x0000000000001037  R    0x1000

 Section to Segment mapping:
  Segment Sections...
   00   .roata .TEXT          # 和 rodata 混在一起。
$ objdump -d -M intel ./test

./test:   file format elf64-x86-64    # 找不到代码段。
$ gdb ./test

Reading symbols from ./test...
Can't find any code sections in symbol file

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文