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.
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
blinkon Emscripten before a hack hardcoding the page size to 4096 is enabled.However, on Cygwin, this problem appears again:
While Windows can use 4096-byte page sizes for
mprotectand stuff, it can only allocate pages with 64kb granularity.