diff --git a/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst b/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst new file mode 100644 index 000000000000000..17241c897905b0e --- /dev/null +++ b/Misc/NEWS.d/next/Build/2026-08-14-20-16-55.gh-issue-153400.9Oxi-N.rst @@ -0,0 +1 @@ +Support os.getrandom() when building Python with old glibc versions and recent Linux kernel (glibc 2.25 or older and Linux kernel 3.17 or newer). Get the syscall number from kernel headers, rather than glibc headers. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index d94291e2ae524bc..7838dd5497e3e5a 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -160,6 +160,9 @@ #ifdef HAVE_SYS_SYSCALL_H # include // syscall(), __NR_xxx syscall numbers #endif +#if !defined(SYS_getrandom) && defined(__NR_getrandom) +# define SYS_getrandom __NR_getrandom +#endif #ifdef HAVE_POSIX_SPAWN # include // posix_spawn() diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c index 5bc45d503360376..a22688827612657 100644 --- a/Python/bootstrap_hash.c +++ b/Python/bootstrap_hash.c @@ -23,7 +23,10 @@ # include // getrandom() # endif # if !defined(HAVE_GETRANDOM) && defined(HAVE_GETRANDOM_SYSCALL) -# include // SYS_getrandom +# include // __NR_getrandom, SYS_getrandom +# if !defined(SYS_getrandom) && defined(__NR_getrandom) +# define SYS_getrandom __NR_getrandom +# endif # endif #endif diff --git a/configure b/configure index ea560d600722592..af3d65cac1b35f8 100755 --- a/configure +++ b/configure @@ -34261,7 +34261,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext #include #include #include - #include + #include // GRND_NONBLOCK + + #if !defined(SYS_getrandom) && defined(__NR_getrandom) + # define SYS_getrandom __NR_getrandom + #endif int main(void) { char buffer[1]; diff --git a/configure.ac b/configure.ac index 7dfc6ca29297a8b..6c6dc9c75fe1ad6 100644 --- a/configure.ac +++ b/configure.ac @@ -7872,7 +7872,11 @@ AC_LINK_IFELSE( #include #include #include - #include + #include // GRND_NONBLOCK + + #if !defined(SYS_getrandom) && defined(__NR_getrandom) + # define SYS_getrandom __NR_getrandom + #endif int main(void) { char buffer[1];