From 50678d0942ae77c618d597dc3fec28cde5824e71 Mon Sep 17 00:00:00 2001 From: Rangi Date: Tue, 21 Jul 2026 14:38:14 -0400 Subject: [PATCH] Use `_fseeki64`/`_ftelli64` on Windows since `fseek`/`fell` are limited by 32-bit `long` --- include/platform.hpp | 6 ++++++ src/asm/section.cpp | 3 ++- src/util.cpp | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/include/platform.hpp b/include/platform.hpp index 5b64a572..7c20c9c1 100644 --- a/include/platform.hpp +++ b/include/platform.hpp @@ -55,6 +55,12 @@ #define setmode(fd, mode) (0) #endif +// Windows has 32-bit `long`, which limits `fseek` and `ftell` to 2 GiB +#if defined(_MSC_VER) || defined(__MINGW32__) + #define fseek _fseeki64 + #define ftell _ftelli64 +#endif + // MingGW and Cygwin need POSIX functions which are not standard C explicitly enabled, #if defined(__MINGW32__) || defined(__CYGWIN__) #define _POSIX_C_SOURCE 200809L diff --git a/src/asm/section.cpp b/src/asm/section.cpp index e5c6d49f..c9723f58 100644 --- a/src/asm/section.cpp +++ b/src/asm/section.cpp @@ -21,7 +21,8 @@ #include "helpers.hpp" #include "itertools.hpp" // InsertionOrderedMap #include "linkdefs.hpp" -#include "util.hpp" // xfclose, seekSize +#include "platform.hpp" // fseek +#include "util.hpp" // xfclose, seekSize #include "asm/fstack.hpp" #include "asm/lexer.hpp" diff --git a/src/util.cpp b/src/util.cpp index 5384107a..48d73f8a 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -29,7 +29,7 @@ std::optional seekSize(FILE *file) { if (fseek(file, 0, SEEK_END) != 0) { return std::nullopt; } - long size = ftell(file); + auto size = ftell(file); // Use `auto` since Windows' `_ftelli64` returns `__int64`, not `long` if (size < 0) { return std::nullopt; }