diff --git a/libguile/Makefile.am b/libguile/Makefile.am
index c3d1b8138..3c4d472a9 100644
--- a/libguile/Makefile.am
+++ b/libguile/Makefile.am
@@ -527,6 +527,7 @@ noinst_HEADERS = custom-ports.h \
cache-internal.h \
gc-inline.h \
gc-internal.h \
+ gsubr-internal.h \
posix-w32.h \
private-options.h \
programs.h \
diff --git a/libguile/foreign.c b/libguile/foreign.c
index 232532504..d029fbc95 100644
--- a/libguile/foreign.c
+++ b/libguile/foreign.c
@@ -40,7 +40,7 @@
#include "eval.h"
#include "extensions.h"
#include "finalizers.h"
-#include "gsubr.h"
+#include "gsubr-internal.h"
#include "instructions.h"
#include "intrinsics.h"
#include "keywords.h"
diff --git a/libguile/goops.c b/libguile/goops.c
index 8907dce50..e93f2e99e 100644
--- a/libguile/goops.c
+++ b/libguile/goops.c
@@ -38,7 +38,7 @@
#include "eval.h"
#include "extensions.h"
#include "foreign.h"
-#include "gsubr.h"
+#include "gsubr-internal.h"
#include "hashtab.h"
#include "keywords.h"
#include "macros.h"
diff --git a/libguile/gsubr-internal.h b/libguile/gsubr-internal.h
new file mode 100644
index 000000000..6c64120cf
--- /dev/null
+++ b/libguile/gsubr-internal.h
@@ -0,0 +1,60 @@
+#ifndef SCM_GSUBR_INTERNAL_H
+#define SCM_GSUBR_INTERNAL_H
+
+/* Copyright 1995-1996,1998,2000-2001,2006,2008,2009-2011,2013,2015,2018,2025
+ Free Software Foundation, Inc.
+
+ This file is part of Guile.
+
+ Guile is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Guile is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with Guile. If not, see
+ . */
+
+
+
+#include "libguile/gsubr.h"
+
+
+
+
+/* Max number of args to the C procedure backing a gsubr */
+#define SCM_GSUBR_MAX 10
+
+#define SCM_PRIMITIVE_P(x) (scm_is_primitive (x))
+#define SCM_PRIMITIVE_GENERIC_P(x) (scm_is_primitive_generic (x))
+
+
+
+struct scm_program;
+struct scm_thread;
+
+SCM_INTERNAL uint32_t *
+scm_i_alloc_primitive_code_with_instrumentation (size_t uint32_count,
+ uint32_t **write_ptr);
+SCM_INTERNAL int scm_i_primitive_code_p (const uint32_t *code);
+SCM_INTERNAL uintptr_t scm_i_primitive_call_ip (struct scm_program *subr);
+SCM_INTERNAL SCM scm_i_primitive_name (const uint32_t *code);
+
+SCM_INTERNAL int scm_is_primitive (SCM x);
+SCM_INTERNAL int scm_is_primitive_generic (SCM x);
+
+SCM_INTERNAL scm_t_subr scm_subr_function_by_index (uint32_t subr_idx);
+SCM_INTERNAL SCM* scm_subr_generic (SCM x);
+SCM_INTERNAL void scm_set_subr_generic (SCM x, SCM g);
+
+SCM_INTERNAL SCM scm_apply_subr (union scm_vm_stack_element *sp,
+ uint32_t subr_idx, ptrdiff_t nargs);
+
+SCM_INTERNAL void scm_init_gsubr (void);
+
+#endif /* SCM_GSUBR_INTERNAL_H */
diff --git a/libguile/gsubr.c b/libguile/gsubr.c
index 7a69523d4..e96f3d65b 100644
--- a/libguile/gsubr.c
+++ b/libguile/gsubr.c
@@ -40,7 +40,7 @@
#include "symbols.h"
#include "threads.h"
-#include "gsubr.h"
+#include "gsubr-internal.h"
diff --git a/libguile/gsubr.h b/libguile/gsubr.h
index d6217d52e..f214c46f9 100644
--- a/libguile/gsubr.h
+++ b/libguile/gsubr.h
@@ -31,37 +31,13 @@
/* Subrs
*/
-/* Max number of args to the C procedure backing a gsubr */
-#define SCM_GSUBR_MAX 10
-
-#define SCM_PRIMITIVE_P(x) (scm_is_primitive (x))
-#define SCM_PRIMITIVE_GENERIC_P(x) (scm_is_primitive_generic (x))
-
#define SCM_SUBRF(x) scm_subr_function (x)
#define SCM_SUBR_NAME(x) scm_subr_name (x)
-struct scm_program;
-
-SCM_INTERNAL uint32_t *
-scm_i_alloc_primitive_code_with_instrumentation (size_t uint32_count,
- uint32_t **write_ptr);
-SCM_INTERNAL int scm_i_primitive_code_p (const uint32_t *code);
-SCM_INTERNAL uintptr_t scm_i_primitive_call_ip (struct scm_program *subr);
-SCM_INTERNAL SCM scm_i_primitive_name (const uint32_t *code);
-
-SCM_INTERNAL int scm_is_primitive (SCM x);
-SCM_INTERNAL int scm_is_primitive_generic (SCM x);
-
SCM_API scm_t_subr scm_subr_function (SCM subr);
-SCM_INTERNAL scm_t_subr scm_subr_function_by_index (uint32_t subr_idx);
SCM_API SCM scm_subr_name (SCM subr);
-SCM_INTERNAL SCM* scm_subr_generic (SCM x);
-SCM_INTERNAL void scm_set_subr_generic (SCM x, SCM g);
-
-SCM_INTERNAL SCM scm_apply_subr (union scm_vm_stack_element *sp,
- uint32_t subr_idx, ptrdiff_t nargs);
SCM_API SCM scm_c_make_gsubr (const char *name,
int req, int opt, int rst, scm_t_subr fcn);
diff --git a/libguile/jit.c b/libguile/jit.c
index 699815ad9..158c5fafb 100644
--- a/libguile/jit.c
+++ b/libguile/jit.c
@@ -29,7 +29,7 @@
#include
#include "frames.h"
-#include "gsubr.h"
+#include "gsubr-internal.h"
#include "gc-inline.h"
#include "instructions.h"
#include "intrinsics.h"
diff --git a/libguile/programs.c b/libguile/programs.c
index 75c8f74c0..065120e7d 100644
--- a/libguile/programs.c
+++ b/libguile/programs.c
@@ -27,7 +27,7 @@
#include "boolean.h"
#include "eval.h"
#include "extensions.h"
-#include "gsubr.h"
+#include "gsubr-internal.h"
#include "instructions.h"
#include "modules.h"
#include "numbers.h"
diff --git a/libguile/vm.c b/libguile/vm.c
index 5b7cf0fcd..603e8fb98 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -48,7 +48,7 @@
#include "foreign.h"
#include "frames.h"
#include "gc-inline.h"
-#include "gsubr.h"
+#include "gsubr-internal.h"
#include "hooks.h"
#include "instructions.h"
#include "intrinsics.h"