On 05/30/2018 09:25 AM, Michal Hocko wrote: > Could you add a debugging data to dump the VMA which overlaps the > requested adress and who requested that? E.g. hook into do_mmap and dump > all requests from the linker. Here you go. I added a bunch of stuff as I clearly do not understand how elf loading works. To me, the 'sections' parsed by the kernel code do not seem to directly align with those produced by objdump. [ 38.899260] load_elf_binary: attempting to load file ./tests/obj32/xB.linkhuge_nofd [ 38.902340] dumping section headers [ 38.903534] index 0 p_offset = 34 [ 38.904683] index 0 p_vaddr = 8048034 [ 38.905680] index 0 p_paddr = 8048034 [ 38.906442] index 0 p_filesz = 120 [ 38.907110] index 0 p_memsz = 120 [ 38.907764] [ 38.908019] index 1 p_offset = 154 [ 38.908521] index 1 p_vaddr = 8048154 [ 38.909081] index 1 p_paddr = 8048154 [ 38.909496] index 1 p_filesz = 13 [ 38.909855] index 1 p_memsz = 13 [ 38.910453] [ 38.910731] index 2 p_offset = 0 [ 38.911317] index 2 p_vaddr = 8048000 [ 38.911997] index 2 p_paddr = 8048000 [ 38.912590] index 2 p_filesz = 169c [ 38.913141] index 2 p_memsz = 169c [ 38.913713] [ 38.913987] index 3 p_offset = 169c [ 38.914518] index 3 p_vaddr = 804969c [ 38.915101] index 3 p_paddr = 804969c [ 38.915718] index 3 p_filesz = 1878 [ 38.916266] index 3 p_memsz = 1878 [ 38.916799] [ 38.917032] index 4 p_offset = 3000 [ 38.917537] index 4 p_vaddr = 9000000 [ 38.918119] index 4 p_paddr = 9000000 [ 38.918709] index 4 p_filesz = 0 [ 38.919525] index 4 p_memsz = 10 [ 38.919993] [ 38.920275] index 5 p_offset = 2d88 [ 38.920791] index 5 p_vaddr = 804ad88 [ 38.921307] index 5 p_paddr = 804ad88 [ 38.921800] index 5 p_filesz = 18c [ 38.922288] index 5 p_memsz = 18c [ 38.922739] [ 38.922973] index 6 p_offset = 168 [ 38.923431] index 6 p_vaddr = 8048168 [ 38.923946] index 6 p_paddr = 8048168 [ 38.924457] index 6 p_filesz = 44 [ 38.924931] index 6 p_memsz = 44 [ 38.925414] [ 38.925593] index 7 p_offset = 0 [ 38.926031] index 7 p_vaddr = 0 [ 38.926510] index 7 p_paddr = 0 [ 38.926957] index 7 p_filesz = 0 [ 38.927443] index 7 p_memsz = 0 [ 38.927879] [ 38.928115] index 8 p_offset = 169c [ 38.928594] index 8 p_vaddr = 804969c [ 38.929091] index 8 p_paddr = 804969c [ 38.929646] index 8 p_filesz = 8c [ 38.930177] index 8 p_memsz = 8c [ 38.930710] [ 38.931497] load_elf_binary: skipping index 0 p_vaddr = 8048034 [ 38.932321] load_elf_binary: skipping index 1 p_vaddr = 8048154 [ 38.933165] load_elf_binary: calling elf_map() index 2 bias 0 vaddr 8048000 [ 38.934087] map_addr ELF_PAGESTART(addr) 8048000 total_size 0 ELF_PAGEALIGN(size) 2000 [ 38.935101] eppnt->p_offset = 0 [ 38.935561] eppnt->p_vaddr = 8048000 [ 38.936073] eppnt->p_paddr = 8048000 [ 38.936897] eppnt->p_filesz = 169c [ 38.937493] eppnt->p_memsz = 169c [ 38.938042] load_elf_binary: calling elf_map() index 3 bias 0 vaddr 804969c [ 38.939002] map_addr ELF_PAGESTART(addr) 8049000 total_size 0 ELF_PAGEALIGN(size) 2000 [ 38.939959] eppnt->p_offset = 169c [ 38.940410] eppnt->p_vaddr = 804969c [ 38.940897] eppnt->p_paddr = 804969c [ 38.941507] eppnt->p_filesz = 1878 [ 38.942019] eppnt->p_memsz = 1878 [ 38.942516] 1123 (xB.linkhuge_nof): Uhuuh, elf segment at 8049000 requested but the memory is mapped already It is pretty easy to see the mmap conflict. I'm still trying to determine if the executable file is 'valid'. It did not throw an error previously as MAP_FIXED unmapped the overlapping page. However, this does not seem right. -- Mike Kravetz