From: "jmarrec (Julien Marrec) via ruby-core" Date: 2024-01-30T14:02:51+00:00 Subject: [ruby-core:116508] [Ruby master Misc#19758] Statically link ext/json Issue #19758 has been updated by jmarrec (Julien Marrec). 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. 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`: ``` shell /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 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: ``` shell ../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-j it-support --enable-mkmf-verbose --enable-debug-env ``` ---------------------------------------- Misc #19758: Statically link ext/json https://bugs.ruby-lang.org/issues/19758#change-106527 * Author: MyCo (Maik Menz) * Status: Open * Priority: Normal * Assignee: nobu (Nobuyoshi Nakada) ---------------------------------------- Hi, I'm building Ruby both as dynamic and static library with MSVC for a project. Everything appears to work fine, but now I'm trying to use the json ext, and it only works with the dynamically linked version. In the statically linked version it says it's missing json/pure but on closer inspection the reason it says that is because it can't find json/ext/parser (and probably also json/ext/generator) in the first place. I can see that both parser & generator created static libs in the build directory but they aren't linked into the ruby lib. With my limited knowledge of the building processes, my first attempt was to add both of those libs into `LOCAL_LIBS` and now they apear in the linking process. But this still doesn't change anything. It's still not finding those 2 libs in the statically linked Ruby build. What am I missing? What do I have to do, to get those linked into the static lib? Regards Maik -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/