My guess is that Purebasic uses `openat` instead of `openat64` for opening files which can be seen in a trace:
Code: Select all
nicolas@Rocky:~/tmp$ strace ./4gb_file
execve("./4gb_file", ["./4gb_file"], 0x7ffd22a30e70 /* 69 vars */) = 0
brk(NULL) = 0x55dee855a000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffeb512e2b0) = -1 EINVAL (Das Argument ist ungültig)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=192205, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 192205, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdfbc900000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\342\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0 \0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0"..., 48, 848) = 48
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0\270\3{b`\206SF\200#!\335\"V\270\255"..., 68, 896) = 68
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=2215936, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdfbc8fe000
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
mmap(NULL, 2260144, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fdfbc6d6000
mprotect(0x7fdfbc702000, 2002944, PROT_NONE) = 0
mmap(0x7fdfbc702000, 1654784, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2c000) = 0x7fdfbc702000
mmap(0x7fdfbc896000, 344064, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7fdfbc896000
mmap(0x7fdfbc8eb000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x214000) = 0x7fdfbc8eb000
mmap(0x7fdfbc8f1000, 52400, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fdfbc8f1000
close(3) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdfbc6d4000
arch_prctl(ARCH_SET_FS, 0x7fdfbc8ff5c0) = 0
set_tid_address(0x7fdfbc8ff890) = 1019221
set_robust_list(0x7fdfbc8ff8a0, 24) = 0
mprotect(0x7fdfbc8eb000, 12288, PROT_READ) = 0
mprotect(0x55dee70d6000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x55dee70d7000, 16384, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
mprotect(0x55dee70db000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x55dee70db000, 4096, PROT_READ) = 0
mprotect(0x55dee70d7000, 16384, PROT_READ|PROT_EXEC) = 0
mprotect(0x55dee70d6000, 4096, PROT_READ) = 0
mprotect(0x55dee70dc000, 4096, PROT_READ) = 0
mprotect(0x7fdfbc962000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
munmap(0x7fdfbc900000, 192205) = 0
getrandom("\x57\x40\x4d\x89\x3b\x83\xac\x3a", 8, GRND_NONBLOCK) = 8
brk(NULL) = 0x55dee855a000
brk(0x55dee857b000) = 0x55dee857b000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=6401952, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 6401952, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdfbc0b9000
close(3) = 0
mmap(NULL, 4194308096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdec20b8000
openat(AT_FDCWD, "/home/nicolas/Text.txt", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdfbc90e000
newfstatat(3, "", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_EMPTY_PATH) = 0
lseek(3, 0, SEEK_CUR) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7fdebc0b8008} ---
+++ killed by SIGSEGV +++
Speicherzugriffsfehler
I guess.