0

我明天正在准备考试,我遇到了这个问题:

在我们使用 strace 运行可执行文件后,关于标准 C lib 的系统调用结果如下:

  • 打开(“/lib/libc.so.6”,“O_RDONLY”)= 3
  • mmap(NULL, 36803630, PROT_READ | PROT_EXEC, MAP_PRIVATE | MAP_DENYWRITE, 3, 0) = 0x7f312ab35000
  • mmap(0x7f312aeae000, 20480, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x179000) = 0x7f312aeae000

问题是为什么 mmap 的第一个系统调用使用 PROT_READ|PROT_EXEC 而第二个系统调用使用 PROT_READ|PROT_WRITE。

请详细解释每次 mmap 调用后会发生什么。我不明白为什么一个进程需要修改 libc(写访问)。

4

1 回答 1

2

地图是私有的(MAP_PRIVATE),所以没有任何修改libc.so;相反,它正在修改从libc.so. 这将包括数据段(libc 中的全局变量)以及全局偏移表(GOT)以及可能在运行时将库重定位到特定地址所涉及的其他结构。

于 2012-05-25T16:01:29.383 回答