关于代码段数据段的加载:
load_aout_binary中关于数据段代码段的加载片段如下:
/*加载代码段*/ error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text, PROT_READ | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, fd_offset);
/*加载数据段*/ error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, fd_offset + ex.a_text);
|
elf文件的处理比较特殊:
if (elf_ppnt->p_flags & PF_R) · elf_prot |= PROT_READ; · if (elf_ppnt->p_flags & PF_W) · elf_prot |= PROT_WRITE; · if (elf_ppnt->p_flags & PF_X) · elf_prot |= PROT_EXEC; · elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE; ...... error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, · elf_prot, elf_flags, 0); |
这里面关键的问题是,无论代码段还是数据段,一定是MAP_PRIVATE