Skip to content

Linux ELF does not load correctly if page size is not 4KB #31

@trungnt2910

Description

@trungnt2910

This comment noted that when the page size is not 64KB, the loader just "forgets" to copy the data onto memory.

This problem was discovered in the first versions of blink on Emscripten before a hack hardcoding the page size to 4096 is enabled.

However, on Cygwin, this problem appears again:

Trung@DESKTOP-5OCA2N2 /cygdrive/d/CodingProjects/Blink
$ o//blink/blink -m /cygdrive/e/temporary\ media/uname
I2023-01-16T10:31:38.151550:blink/map.c:54:0 (mem) big created 16m map [0x6ffffeff0000,0x6fffffff1000)
I2023-01-16T10:31:38.152812:blink/map.c:54:8795 (mem) loader created 8872 map [0x6ffffefe0000,0x6ffffefe22a8)
I2023-01-16T10:31:38.152833:blink/map.c:54:8795 (mem) big created 256k map [0x6ffffefa0000,0x6ffffefe0000)
I2023-01-16T10:31:38.152842:blink/loader.c:61:8795 (elf) PROGRAM HEADER
I2023-01-16T10:31:38.152845:blink/loader.c:62:8795 (elf)   vaddr = 400000
I2023-01-16T10:31:38.152848:blink/loader.c:63:8795 (elf)   memsz = e8
I2023-01-16T10:31:38.152851:blink/loader.c:64:8795 (elf)   offset = 0
I2023-01-16T10:31:38.152853:blink/loader.c:65:8795 (elf)   filesz = e8
I2023-01-16T10:31:38.152856:blink/loader.c:66:8795 (elf)   pagesize = 10000
I2023-01-16T10:31:38.152858:blink/loader.c:67:8795 (elf)   start = 400000
I2023-01-16T10:31:38.152861:blink/loader.c:68:8795 (elf)   end = 410000
I2023-01-16T10:31:38.152863:blink/loader.c:69:8795 (elf)   skew = 0
I2023-01-16T10:31:38.152866:blink/loader.c:156:8795 (elf) alloc 400000-410000
I2023-01-16T10:31:38.152869:blink/memorymalloc.c:462:8795 (mem) reserving virtual [0x400000,0x410000) w/ 64 kb
I2023-01-16T10:31:38.152881:blink/loader.c:163:8795 (elf) copy 400000-4000e8 from 0-e8
I2023-01-16T10:31:38.152886:blink/loader.c:61:8795 (elf) PROGRAM HEADER
I2023-01-16T10:31:38.152888:blink/loader.c:62:8795 (elf)   vaddr = 401000
I2023-01-16T10:31:38.152891:blink/loader.c:63:8795 (elf)   memsz = 15a
I2023-01-16T10:31:38.152893:blink/loader.c:64:8795 (elf)   offset = 1000
I2023-01-16T10:31:38.152896:blink/loader.c:65:8795 (elf)   filesz = 15a
I2023-01-16T10:31:38.152898:blink/loader.c:66:8795 (elf)   pagesize = 10000
I2023-01-16T10:31:38.152901:blink/loader.c:67:8795 (elf)   start = 400000
I2023-01-16T10:31:38.152904:blink/loader.c:68:8795 (elf)   end = 410000
I2023-01-16T10:31:38.152906:blink/loader.c:69:8795 (elf)   skew = 1000
I2023-01-16T10:31:38.152909:blink/loader.c:61:8795 (elf) PROGRAM HEADER
I2023-01-16T10:31:38.152911:blink/loader.c:62:8795 (elf)   vaddr = 402000
I2023-01-16T10:31:38.152914:blink/loader.c:63:8795 (elf)   memsz = 2
I2023-01-16T10:31:38.152916:blink/loader.c:64:8795 (elf)   offset = 2000
I2023-01-16T10:31:38.152919:blink/loader.c:65:8795 (elf)   filesz = 2
I2023-01-16T10:31:38.152921:blink/loader.c:66:8795 (elf)   pagesize = 10000
I2023-01-16T10:31:38.152924:blink/loader.c:67:8795 (elf)   start = 400000
I2023-01-16T10:31:38.152926:blink/loader.c:68:8795 (elf)   end = 410000
I2023-01-16T10:31:38.152929:blink/loader.c:69:8795 (elf)   skew = 2000
I2023-01-16T10:31:38.152932:blink/memorymalloc.c:462:8795 (mem) reserving virtual [0x4fffff800000,0x500000000000) w/ 8192 kb
I2023-01-16T10:31:38.153202:blink/throw.c:91:8795 SEGMENTATION FAULT AT ADDRESS 0
         PC 401000 add %al,(%rax)
         AX 0000000000000000  CX 0000000000000000  DX 0000000000000000  BX 0000000000000000
         SP 00004fffffffdd10  BP 0000000000000000  SI 0000000000000000  DI 0000000000000000
         R8 0000000000000000  R9 0000000000000000 R10 0000000000000000 R11 0000000000000000
        R12 0000000000000000 R13 0000000000000000 R14 0000000000000000 R15 0000000000000000
         FS 0000000000000000  GS 0000000000000000 OPS 1                JIT 0
        /cygdrive/e/temporary media/uname
        000000000000 000000401000 _start
I2023-01-16T10:31:38.153217:blink/blink.c:67:8795 terminating due to signal SIGSEGV
Segmentation fault (core dumped)

While Windows can use 4096-byte page sizes for mprotect and stuff, it can only allocate pages with 64kb granularity.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions