On Thu 01-02-18 08:43:34, Anshuman Khandual wrote:
[...]
> $dmesg | grep elf_brk
> [    9.571192] elf_brk 10030328 elf_bss 10030000
> 
> static int load_elf_binary(struct linux_binprm *bprm)
> ---------------------
> 
>       if (unlikely (elf_brk > elf_bss)) {
>                       unsigned long nbyte;
>                   
>                       /* There was a PT_LOAD segment with p_memsz > p_filesz
>                          before this one. Map anonymous pages, if needed,
>                          and clear the area.  */
>                       retval = set_brk(elf_bss + load_bias,
>                                        elf_brk + load_bias,
>                                        bss_prot);
> 
> 
> ---------------------

Just a blind shot... Does the following make any difference?
---
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 021fe78998ea..04b24d00c911 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -895,7 +895,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
           the correct location in memory. */
        for(i = 0, elf_ppnt = elf_phdata;
            i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
-               int elf_prot = 0, elf_flags;
+               int elf_prot = 0, elf_flags, elf_fixed = MAP_FIXED_NOREPLACE;
                unsigned long k, vaddr;
                unsigned long total_size = 0;
 
@@ -927,6 +927,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
                                         */
                                }
                        }
+                       elf_fixed = MAP_FIXED;
                }
 
                if (elf_ppnt->p_flags & PF_R)
@@ -944,7 +945,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
                 * the ET_DYN load_addr calculations, proceed normally.
                 */
                if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
-                       elf_flags |= MAP_FIXED_NOREPLACE;
+                       elf_flags |= elf_fixed;
                } else if (loc->elf_ex.e_type == ET_DYN) {
                        /*
                         * This logic is run once for the first LOAD Program
@@ -980,7 +981,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
                                load_bias = ELF_ET_DYN_BASE;
                                if (current->flags & PF_RANDOMIZE)
                                        load_bias += arch_mmap_rnd();
-                               elf_flags |= MAP_FIXED_NOREPLACE;
+                               elf_flags |= elf_fixed;
                        } else
                                load_bias = 0;
 

-- 
Michal Hocko
SUSE Labs

Reply via email to