我明天正在准备考试,我遇到了这个问题:
在我们使用 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(写访问)。