diff -ruN recode-3.7.8-orig/lib/hash.h recode-3.7.8/lib/hash.h
--- recode-3.7.8-orig/lib/hash.h	2019-12-12 13:52:52.000000000 -0600
+++ recode-3.7.8/lib/hash.h	2020-12-17 05:15:22.000000000 -0600
@@ -21,6 +21,11 @@
 /* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use
    obstacks instead of malloc, and recompile 'hash.c' with same setting.  */
 
+#define hash_lookup recode_hash_lookup
+#define hash_delete recode_hash_delete
+#define hash_free   recode_hash_free
+#define hash_insert recode_hash_insert
+
 #ifndef HASH_H_
 # define HASH_H_
 
diff -ruN recode-3.7.12-orig/src/Makefile.in recode-3.7.12/src/Makefile.in
--- recode-3.7.12-orig/src/Makefile.in	2022-02-17 06:34:53.000000000 -0500
+++ recode-3.7.12/src/Makefile.in	2022-12-26 05:40:52.000000000 -0500
@@ -1677,7 +1677,7 @@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = gnits
 lib_LTLIBRARIES = librecode.la
-noinst_LTLIBRARIES = libmerged.la
+noinst_LTLIBRARIES = libmerged.la librecode-static.la
 man_MANS = recode.1
 include_HEADERS = recode.h recodext.h
 H_STEPS = common.h decsteps.h inisteps.h tersteps.h \
@@ -1707,7 +1707,7 @@
 $(include_HEADERS) $(noinst_HEADERS) $(H_STEPS)
 
 librecode_la_LDFLAGS = -version-info $(VERSION_INFO) $(LTLIBINTL) \
-	$(LIB_CLOCK_GETTIME) $(LIB_GETRANDOM) $(LIB_HARD_LOCALE) $(LIB_MBRTOWC) $(LIB_SETLOCALE_NULL)
+	$(LIB_CLOCK_GETTIME) $(LIB_GETRANDOM) $(LIB_HARD_LOCALE) $(LIB_MBRTOWC) $(LIB_SETLOCALE_NULL) -no-undefined
 
 librecode_la_LIBADD = ../lib/libgnu.la libmerged.la
 libmerged_la_SOURCES = merged.c
@@ -1873,8 +1873,10 @@
 libmerged.la: $(libmerged_la_OBJECTS) $(libmerged_la_DEPENDENCIES) $(EXTRA_libmerged_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(LINK)  $(libmerged_la_OBJECTS) $(libmerged_la_LIBADD) $(LIBS)
 
-librecode.la: $(librecode_la_OBJECTS) $(librecode_la_DEPENDENCIES) $(EXTRA_librecode_la_DEPENDENCIES) 
+librecode.la: $(librecode_la_OBJECTS) $(librecode_la_DEPENDENCIES) $(EXTRA_librecode_la_DEPENDENCIES)
 	$(AM_V_CCLD)$(librecode_la_LINK) -rpath $(libdir) $(librecode_la_OBJECTS) $(librecode_la_LIBADD) $(LIBS)
+librecode-static.la: $(librecode_la_OBJECTS) $(librecode_la_DEPENDENCIES) $(EXTRA_librecode_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(librecode_la_LINK) -rpath $(libdir) $(librecode_la_OBJECTS) $(librecode_la_LIBADD) $(LIBS) -static
 
 recode$(EXEEXT): $(recode_OBJECTS) $(recode_DEPENDENCIES) $(EXTRA_recode_DEPENDENCIES) 
 	@rm -f recode$(EXEEXT)
diff -ruN recode-3.7.8-orig/tests/setup.py.in recode-3.7.8/tests/setup.py.in
--- recode-3.7.8-orig/tests/setup.py.in	2019-12-12 13:52:37.000000000 -0600
+++ recode-3.7.8/tests/setup.py.in	2020-12-17 05:19:00.000000000 -0600
@@ -13,6 +13,8 @@
 extra_libs = []
 extra_libs.extend(libintl.split())
 extra_libs.extend(libiconv.split())
+extra_libs.append(os.path.join(top_builddir, 'src', '.libs', 'librecode-static.a'))
+extra_libs.append(os.path.join(top_builddir, 'lib', '.libs', 'libgnu.a'))
 
 # FIXME: On Mingw, Cython seems to call gcc in such a way that it doesn't understand UNIX paths
 if os.name == 'nt':
@@ -32,9 +34,6 @@
         Extension('Recode', ['Recode.c'],
                   include_dirs=[top_builddir, os.path.join(top_srcdir, 'src'),
                                 os.path.join(top_srcdir, 'lib')],
-                  library_dirs=[os.path.join(top_builddir, 'src', '.libs'),
-                                os.path.join(top_builddir, 'lib', '.libs')],
-                  libraries=['recode', 'gnu'],
                   extra_link_args=extra_libs)
         ])