Hello,
I am facing the same issue today, though I am presently on Ubuntu, not windows. I realized that Init_ext
was doing nothing (I couldn't then use require 'bigdecimal'
without a crash) by using a debugger and I noticed that it was picking up the empty one from dmyext.c
and not the auto-generated ext/extinit.c
one, and I identified this was because tof the INITOBJS in that AR call, which lead me to this issue. I have specifically uncommented all lines in ext/Setup
(except the win32 ones) to have option nodynamic
enabled in particular.
I tried specifically not linking to INITOBJS by patching Makefile.in as follow, but I get a failure to build. At that point in time when the libruby-static.a
target is called, the EXTOBJS / ENCOBJS do not exist on disk yet (EXTOBJS=ext/extinit.o, ENCOBJS=enc/encinit.o enc/libenc.a enc/libtrans.a).
And libruby-static.a
is needed for miniruby (I think), which is needed to build those EXT/ENC objects. So there needs to be some kind of final pass with AR overriding the Init_ext
/Init_enc
or something? And perhaps also merging the inidividual ext/ && enc .a
libraries into the libruby-static.a
itself so everything is self-contained?
Do you have any tips please?
(Failed) things I tried:
I'm not experienced enough with the ruby build system (I have trouble following how the extensions's target are called) to make that happen, so in the interim I tried to manually fix the libruby-static.a via new make target that calls ar
to replace INITOBJS with EXTOBJS / ENCOBJS but that failed too, because it's missing the individual Init_ (eg: Init_digest, Init_big5, etc).
Truncated failure when make && make final-libruby_a && verify-static-library
:
/usr/bin/ld: libruby-static.a(extinit.o): in function `Init_ext':
/home/julien/Software/Others/ruby-download/ruby-3.2.2-build/ext/extinit.c:12: undefined reference to `Init_bigdecimal'
/usr/bin/ld: /home/julien/Software/Others/ruby-download/ruby-3.2.2-build/ext/extinit.c:13: undefined reference to `Init_escape'
/usr/bin/ld: /home/julien/Software/Others/ruby-download/ruby-3.2.2-build/ext/extinit.c:14: undefined reference to `Init_continuation
Bad patch I tried to apply:
diff --git a/template/Makefile.in b/template/Makefile.in
--- a/template/Makefile.in
+++ b/template/Makefile.in
@@ -333,7 +333,18 @@ $(LIBRUBY_A):
@$(RM) $@
@-[ -z "$(EXTSTATIC)" ] || $(PRE_LIBRUBY_UPDATE)
$(ECHO) linking static-library $@
- $(Q) $(AR) $(ARFLAGS) $@ $(LIBRUBY_A_OBJS) $(INITOBJS)
+ $(ECHO) LIBRUBY_A_OBJS=$(LIBRUBY_A_OBJS)
+ $(ECHO) INITOBJS=$(INITOBJS)
+ $(ECHO) EXTOBJS=$(EXTOBJS)
+ $(ECHO) ENCOBJS=$(ENCOBJS)
+ $(ECHO) ext/extinit.$(OBJEXT) enc/encinit.$(OBJEXT)
+ $(Q) if [ -z "$(EXTSTATIC)" ]; then \
+ $(ECHO0) CMD=$(AR) $(ARFLAGS) $@ $(LIBRUBY_A_OBJS) $(INITOBJS); \
+ $(AR) $(ARFLAGS) $@ $(LIBRUBY_A_OBJS) $(INITOBJS); \
+ else \
+ $(ECHO0) CMD=$(AR) $(ARFLAGS) $@ $(LIBRUBY_A_OBJS) $(INITOBJS); \
+ $(AR) $(ARFLAGS) $@ $(LIBRUBY_A_OBJS) $(INITOBJS); \
+ fi
$(Q) if [ 'no' != '$(YJIT_SUPPORT)' ]; then \
set -eu$(V0:1=x) && \
$(ECHO0) 'merging $(YJIT_LIBS) into $@' && \
@@ -346,7 +357,18 @@ $(LIBRUBY_A):
fi
@-$(RANLIB) $@ 2> /dev/null || true
-verify-static-library: $(LIBRUBY_A)
+final-libruby_a:
+ @-[ -z "$(EXTSTATIC)" ]
+ $(ECHO) Replacing INCOBJS with EXTOBJS and ENCOBS in static-library $(LIBRUBY_A)
+ $(ECHO) LIBRUBY_A_OBJS=$(LIBRUBY_A_OBJS)
+ $(ECHO) INITOBJS=$(INITOBJS)
+ $(ECHO) EXTOBJS=$(EXTOBJS)
+ $(ECHO) ENCOBJS=$(ENCOBJS)
+ $(AR) dD $(LIBRUBY_A) $(INITOBJS)
+ $(AR) rD $(LIBRUBY_A) $(EXTOBJS) $(ENCOBJS)
+ @-$(RANLIB) $(LIBRUBY_A) 2> /dev/null || true
+
+verify-static-library:
$(ECHO) verifying static-library $@
@$(PURIFY) $(CC) $(EXE_LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(LIBRUBY_A) $(MAINLIBS) $(EXTLIBS) $(LIBS) $(OUTFLAG)conftest$(EXEEXT)
@$(RMALL) conftest$(EXEEXT) conftest.c conftest.dSYM
My configure call is as follows:
../ruby-patching/configure --prefix=/ '--bindir=${prefix}/bin' '--sbindir=${prefix}/bin' '--libdir=${prefix}/lib' '--includedir=${prefix}/include' '--oldincludedir=${prefix}/include' --disable-shared --enable-static --disable-install-doc --with-static-linked-ext --enable-load-relative --with-zlib-dir=/home/julien/.conan2/p/b/zlib1b2fc466a3731/p --with-openssl-dir=/home/julien/.conan2/p/b/opensccd63d9154ad3/p --with-libffi-dir=/home/julien/.conan2/p/b/libffe070527d1c02e/p --with-libyaml-dir=/home/julien/.conan2/p/b/libyae7bed9b8d84ed/p --with-readline-dir=/home/julien/.conan2/p/b/readl6fb13f62b9c29/p --with-gmp-dir=/home/julien/.conan2/p/b/gmp598d198a78496/p --with-opt-dir=/home/julien/.conan2/p/b/zlib1b2fc466a3731/p:/home/julien/.conan2/p/b/opensccd63d9154ad3/p:/home/julien/.conan2/p/b/libffe070527d1c02e/p:/home/julien/.conan2/p/b/libyae7bed9b8d84ed/p:/home/julien/.conan2/p/b/readl6fb13f62b9c29/p:/home/julien/.conan2/p/b/gmp598d198a78496/p --disable-jit-support --enable-mkmf-verbose --enable-debug-env