On Thu, Jul 05, 2018 at 09:18:08AM +0200, Oscar Salvador wrote: > > So, indeed "bss" needs to be aligned. > > But ELF_PAGESTART() or ELF_PAGEALIGN(), which one to use? > > > > #define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1)) > > #define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1)) > > > > Is > > > > - len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr + > > - ELF_MIN_ALIGN - 1); > > + len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr); > > > > suggesting that > > > > - bss = eppnt->p_memsz + eppnt->p_vaddr; > > + bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr); > > > > is the right choice? I don't know... > > Yes, I think that ELF_PAGEALIGN is the right choice here. > Given that bss is 0x7bf88676, using ELF_PAGESTART aligns it but backwards, while ELF_PAGEALIGN does > the right thing: > > bss = 0x7bf88676 > ELF_PAGESTART (bss) = 0x7bf88000 > ELF_PAGEALIGN (bss) = 0x7bf89000 I think this should do the trick: diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 0ac456b52bdd..6c7e005ae12d 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1259,9 +1259,9 @@ static int load_elf_library(struct file *file) goto out_free_ph; } - len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr + - ELF_MIN_ALIGN - 1); - bss = eppnt->p_memsz + eppnt->p_vaddr; + + len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr); + bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr); if (bss > len) { error = vm_brk(len, bss - len); if (error) I could only test it in x86_64 (with -m32). Could you test it on x86_32? -- Oscar Salvador SUSE L3