libc.so mmap strace

时间:2012-05-25 15:57:59

标签: c mmap libc

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

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

相关
  • open(“/ 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(写访问)。

1 个答案:

答案 0 :(得分:1)

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