为什么 elf 段没有页面对齐?

use*_*776 7 elf

readelf -l /bin/ls:

  LOAD           0x000000 0x08048000 0x08048000 0x18ff8 0x18ff8 R E 0x1000
  LOAD           0x019eec 0x08061eec 0x08061eec 0x003f4 0x01014 RW  0x1000
Run Code Online (Sandbox Code Playgroud)

那么两个段之间的边界页既是只读的又是可读写的,这怎么可能呢?

jko*_*shy 6

假设页面大小为 4096 (0x1000) 字节并将地址舍入到页面粒度:

  • 第一个可加载段将使用地址范围 [0x8048000--0x8060FFF],包括两端。
  • 第二个可加载段将使用地址范围 [0x8061000--0x8062FFF],其中从地址 0x8061EEC 开始的 0x3F4 字节将来自可执行文件,其余字节在加载时填充为零。

没有重叠。

  • 为什么第二段不从 ox8061000 开始? (2认同)
  • @user1608776 好问题。您可能需要查看“/bin/ls”的链接器映射来确定放置在偏移量 0x8061000 和 0x8061EEC 之间的数据。查看更简单的(hello world)可执行文件的链接器映射,相应的偏移范围似乎用于名为“.tdata”、“.tbss”和“.gcc_ except_table”的部分。 (2认同)