From 65a3453b7f2be6699c632a2f3980e45e960feac8 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 26 May 2022 16:02:15 +0100 Subject: [PATCH] build: Compile with large inode number support where possible On filesystems with large inode numbers, such as overlayfs, attempting to stat() a file on a 32-bit system using legacy syscalls can fail with EOVERFLOW. If we opt-in to more modern "large file support" syscalls, then source code references to functions like stat() are transparently replaced with ABIs that support large file sizes and inode numbers, such as stat64(). This cannot safely be done globally by Linux distributions, because some libraries expose types like `off_t` or `struct stat` in their ABI, meaning that enabling large file support would be an incompatible change that would cause crashes. However, SDL appears to be careful to avoid these types in header files, so it should be OK to enable this. Signed-off-by: Simon McVittie --- CMakeLists.txt | 7 +++++++ configure.ac | 1 + 2 files changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c512bb29..c988ef56c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,13 @@ set(CMAKE_MODULE_PATH "${SDL2_SOURCE_DIR}/cmake") include(${SDL2_SOURCE_DIR}/cmake/macros.cmake) include(${SDL2_SOURCE_DIR}/cmake/sdlchecks.cmake) +# Enable large file support on 32-bit glibc, so that we can access files +# with large inode numbers +check_symbol_exists("__GLIBC__" "stdlib.h" LIBC_IS_GLIBC) +if (LIBC_IS_GLIBC AND CMAKE_SIZEOF_VOID_P EQUAL 4) + add_compile_definitions(PRIVATE _FILE_OFFSET_BITS=64) +endif() + # See docs/release_checklist.md set(SDL_MAJOR_VERSION 2) set(SDL_MINOR_VERSION 23) diff --git a/configure.ac b/configure.ac index 2686db6b3..8bba0af0c 100644 --- a/configure.ac +++ b/configure.ac @@ -60,6 +60,7 @@ dnl AC_CANONICAL_HOST dnl Check for tools AC_PROG_CC AC_PROG_CXX +AC_SYS_LARGEFILE AC_PROG_INSTALL AC_PROG_MAKE_SET PKG_PROG_PKG_CONFIG