libc: Make sure C23 versions of strtol(), sscanf() are not used

When _GNU_SOURCE is defined, glibc will always use c23 versions
of strtol(), sscanf() and friends if available (introduced after
glibc 2.34). Which means that any binaries built with headers
from newer glibc won't load on glibc < 2.38. To work around this,
redefine the appropriate constants to zero make sure the c99 
versions are used instead.
This commit is contained in:
Daan De Meyer
2026-05-18 21:17:38 +00:00
parent b77c7b7cfc
commit 97f81508c5
3 changed files with 41 additions and 7 deletions
+6 -7
View File
@@ -1691,14 +1691,13 @@ system_includes = [
),
]
if get_option('libc') == 'musl'
system_include_args = [
'-isystem', meson.project_build_root() / 'src/include/musl',
'-isystem', meson.project_source_root() / 'src/include/musl',
] + system_include_args
libc_include_dir = 'src/include' / get_option('libc')
system_include_args = [
'-isystem', meson.project_build_root() / libc_include_dir,
'-isystem', meson.project_source_root() / libc_include_dir,
] + system_include_args
system_includes += include_directories('src/include/musl', is_system : true)
endif
system_includes += include_directories(libc_include_dir, is_system : true)
basic_includes = [
include_directories(
+18
View File
@@ -0,0 +1,18 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
/* Force glibc's stdio.h to route sscanf/fscanf to the old __isoc99_* siblings (GLIBC_2.7) rather
* than the newer __isoc23_* ones (GLIBC_2.38). The only behavioural difference is "0b" prefix
* support in %i conversions, which we don't use. We include features.h first so the macro is set
* to its normal value, then override it before stdio.h's body evaluates __GLIBC_USE(C23_STRTOL).
*
* The macro was named __GLIBC_USE_C2X_STRTOL on glibc 2.38–2.39 and renamed to the C23 spelling
* in glibc 2.40; clear both so this override works across that range. */
#include <features.h>
#undef __GLIBC_USE_C2X_STRTOL
#define __GLIBC_USE_C2X_STRTOL 0
#undef __GLIBC_USE_C23_STRTOL
#define __GLIBC_USE_C23_STRTOL 0
#include_next <stdio.h> /* IWYU pragma: export */
+17
View File
@@ -0,0 +1,17 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
/* Force glibc's stdlib.h to leave strtol/strtoul/strtoll/strtoull as their original GLIBC_2.2.5
* symbols rather than redirect to __isoc23_* (GLIBC_2.38). The only behavioural difference is
* "0b" prefix support in base 0/2 parsing, which we don't use.
*
* The macro was named __GLIBC_USE_C2X_STRTOL on glibc 2.38–2.39 and renamed to the C23 spelling
* in glibc 2.40; clear both so this override works across that range. */
#include <features.h>
#undef __GLIBC_USE_C2X_STRTOL
#define __GLIBC_USE_C2X_STRTOL 0
#undef __GLIBC_USE_C23_STRTOL
#define __GLIBC_USE_C23_STRTOL 0
#include_next <stdlib.h> /* IWYU pragma: export */