use private maps even for read-only segments of FDPIC libraries
authorRich Felker <dalias@aerifal.cx>
Mon, 16 Nov 2015 02:28:41 +0000 (21:28 -0500)
committerRich Felker <dalias@aerifal.cx>
Mon, 16 Nov 2015 02:28:41 +0000 (21:28 -0500)
the nommu kernel shares memory when it can anyway for private
read-only maps, but semantically the map should be private. this can
make a difference when debugging breakpoints are to be used, in which
case the kernel may need to ensure that the mapping is not shared.

the new behavior matches how the kernel FDPIC loader maps the main
program and/or program interpreter (dynamic linker) binary.

src/ldso/dynlink.c

index 2d24c78d56b8efd6a5a481bef4593384fc8ef1aa..6495aeeac061bc68449ec07fd9edca2b92c66ab5 100644 (file)
@@ -602,7 +602,7 @@ static void *map_library(int fd, struct dso *dso)
                                ((ph->p_flags&PF_W) ? PROT_WRITE: 0) |
                                ((ph->p_flags&PF_X) ? PROT_EXEC : 0));
                        map = mmap(0, ph->p_memsz + (ph->p_vaddr & PAGE_SIZE-1),
-                               prot, (prot&PROT_WRITE) ? MAP_PRIVATE : MAP_SHARED,
+                               prot, MAP_PRIVATE,
                                fd, ph->p_offset & -PAGE_SIZE);
                        if (map == MAP_FAILED) {
                                unmap_library(dso);