rtld: Revert mprotect optimization during .bss creation
authorJohn Marino <draco@marino.st>
Fri, 13 Jan 2012 19:53:42 +0000 (20:53 +0100)
committerJohn Marino <draco@marino.st>
Sat, 14 Jan 2012 10:59:44 +0000 (11:59 +0100)
Using only mprotect over .bss prevented it from writing .bss to the core
files as the whole region for the dso is mmapped with MAP_NOCORE flag.
Revert to previous mmap implementation.
Comes from FreeBSD SVN 225699

libexec/rtld-elf/map_object.c

index 4ca3ca5..b16afd5 100644 (file)
@@ -215,8 +215,9 @@ map_object(int fd, const char *path, const struct stat *sb)
            bss_vlimit = round_page(segs[i]->p_vaddr + segs[i]->p_memsz);
            bss_addr = mapbase +  (bss_vaddr - base_vaddr);
            if (bss_vlimit > bss_vaddr) {       /* There is something to do */
-               if (mprotect(bss_addr, bss_vlimit - bss_vaddr, data_prot) == -1) {
-                   _rtld_error("%s: mprotect of bss failed: %s", path,
+               if (mmap(bss_addr, bss_vlimit - bss_vaddr, data_prot,
+                   data_flags | MAP_ANON, -1, 0) == (caddr_t)-1) {
+                   _rtld_error("%s: mmap of bss failed: %s", path,
                        strerror(errno));
                    return NULL;
                }