From abd788e50b4a5905244dcba5f53b8383a60e1595 Mon Sep 17 00:00:00 2001 From: Dmytro Yurinov Date: Wed, 8 Apr 2026 18:28:44 +0200 Subject: [PATCH] Fix darwin-aarch64 (Apple Silicon Mac) native loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apple Silicon Macs running native arm64 Java crash at JVM init when loading NativeExecutor with NoClassDefFoundError on StaticComponentContainer, caused by dlopen rejecting a Linux ELF named .so: Files$NotLoadedException: Unable to load file org/burningwave/jvm/libNativeExecutor-aarch64.so UnsatisfiedLinkError: ... slice is not valid mach-o file Two-part fix: 1. Libraries.java: when osArch=aarch64 AND os is macOS, use the .dylib extension. The previous aarch64 branch hardcoded "so" for ALL aarch64 platforms — correct on Linux but wrong on macOS, where it was reached *before* the macOS branch that would have set extension="dylib". 2. native/pom.xml: introduce a linker.arch.suffix property (default x${sun.arch.data.model}, overridden to "aarch64" in a new mac-aarch64 profile activated on os.family=mac AND os.arch=aarch64). This makes a native build on a native arm64 macOS runner produce libNativeExecutor-aarch64.dylib instead of libNativeExecutor-x64.dylib. 3. Pre-built native/bin/libNativeExecutor-aarch64.dylib compiled with Apple clang++ 21.0 against OpenJDK 17.0.18 ARM headers, targeting arm64-apple-darwin. CI can regenerate this once a macos-latest aarch64 workflow entry is added (left as a follow-up PR to keep this one focused on the actual fix). The C++ source is purely portable JNI (zero #ifdef __APPLE__) so it compiles cleanly with no source changes; verified by exact symbol-set match against the existing libNativeExecutor-aarch64.so (40 JNI exports). Tested end-to-end on Apple M5 Pro / OpenJDK 17.0.18 ARM Homebrew with the smoke test: Class.forName("org.burningwave.jvm.NativeExecutor"); Class.forName("org.burningwave.core.assembler.StaticComponentContainer"); Both classes load and statically initialize successfully. Also reproducible inside a real Forge 1.20.1 modpack (Biohazard: Project Genesis) that bundles jvm-driver via TheImpossibleLibrary. Refs: TheComputerizer/The-Impossible-Library#35 --- .../org/burningwave/jvm/util/Libraries.java | 8 ++++-- native/bin/libNativeExecutor-aarch64.dylib | Bin 0 -> 44864 bytes native/pom.xml | 26 ++++++++++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100755 native/bin/libNativeExecutor-aarch64.dylib diff --git a/java/src/main/java/org/burningwave/jvm/util/Libraries.java b/java/src/main/java/org/burningwave/jvm/util/Libraries.java index 780bea97..9a379e20 100644 --- a/java/src/main/java/org/burningwave/jvm/util/Libraries.java +++ b/java/src/main/java/org/burningwave/jvm/util/Libraries.java @@ -57,11 +57,15 @@ private Libraries() { } String osArch = jVMInfo.osArch != null ? jVMInfo.osArch : "generic"; String operatingSystemName = jVMInfo.operatingSystemName != null ? jVMInfo.operatingSystemName.toLowerCase(Locale.ENGLISH) : "generic"; + boolean isMac = (operatingSystemName.indexOf("mac") >= 0) || (operatingSystemName.indexOf("darwin") >= 0); prefix = "lib"; if (osArch.equals("aarch64")) { conventionedSuffix = osArch; - extension = "so"; - } else if ((operatingSystemName.indexOf("mac") >= 0) || (operatingSystemName.indexOf("darwin") >= 0)) { + // On macOS the loader still needs the platform-correct extension; previously + // this branch hardcoded "so" which made aarch64 macOS fail with + // "slice is not valid mach-o file" when dlopen tried to parse a Linux ELF. + extension = isMac ? "dylib" : "so"; + } else if (isMac) { extension = "dylib"; } else if (operatingSystemName.indexOf("win") >= 0) { prefix = null; diff --git a/native/bin/libNativeExecutor-aarch64.dylib b/native/bin/libNativeExecutor-aarch64.dylib new file mode 100755 index 0000000000000000000000000000000000000000..1169ccfb702145fba8c0ed515a015b4f7e28dd34 GIT binary patch literal 44864 zcmeHQ3vg6bn*O`*4RjzclJF28Am9q3kc7y?)gezHiXj3jx@xCMnj}opjY%hj0oQgM zMqC^>tmq)R8q3EfDRCVaYfwi9MP19q6)lIwN9_bfYn;(Bu33jLw(R%c`*-*4PKOR@ z4YgJ0R{i(f|D6AIzH`ofoWA$;TgSinE``WO*hYZHfI4)d&3-;2Is>!?rB3I{(p4*s ztjJwKBum04A)5)NjLqrvxm$h0Ac?luBZ8~On=;JX!{ThnZ)Kg%CSUXFrchS2y(MRv zMbkurd8<8#*hAfo&FQSEs&cwptK92+PM>Raw7q(1{avZM!>6|&hHUauGW0akVJoZ!e(6w((uUYuO=DhbBc6>4Wg*@a< z2AOr92;&otV*^{q|L7N>%!nT;Z#-UdKy1tCuQT&eD;v#jZfayWn5t&ZoRupGu>5?h zJT1j(AyR(Dh9;l8VOCKHG|2xAi2YUomsLn-2+uh2b~eZ;-$m48Z7`#B;9c*sy`6!L zw$4B?ZTniIE(Ei^Tg&PSY%J{TUG{RvKFxV3T813{<^P#P+ouz?IW8;cLo97GHW&0c zHc@BtCR?YGU&_4QJpKhAYn_#L>SNvC26ZnI-R3CWi!Hjhi0%ke_vxT+vglqFrJHKe zy;^ifnYxbzbDX2R`bZ?H*&9&%m5Zz2u_x7Of0@1xKO1IFW zd#C7*Gj)AI-7?YL7NvWoMfYCOooMR1gSulx_qr(Evn{%A(LKl1y(XwTR&;NS(mmIr zTPM0xsPAO`#&hDtFXQ$tD(EX9+C2yUZ$*Ep9AWaanMWU}9A)w|nMb=;rkVWt%%iO; zGfjRf^T5AyoXJmO9+*~6H2E``2TqmenEZI=QTNIzCZEN8RDB$XO}nMAuaYJmGLB1& zLdW_eg?)a>*XxQx$J#F}@>g5re`S&1V3FTuk-yF&|Exv+7K{A77Wo@3^3Pf1Z?nkX zZ;^L}<+T?r`I{~I|7^*3Tk>DBQh^mgwuoZB|qI|H}Vws*+0=SucFSeQm>Aa)@v;Ev%5Y<-HsY{D~A1|&Tpl1&T20YUKb+k zRdh<%TROX=+`P7%*T2uE7B=wp&$zzh`ZsvL#owRb0j__cdgA$FSlZ9p{ zhv&OtX+OiyFt(rJ?=-ZZ;rIJ%zvDG8bRKis@GNS_Gbx^TH|m`MT$8`SGw)yIS)S(w zjQNAdi~9IJz)t>m_?i6}^0(l**MWSVFF2x&3zhW+%Qh5BSytCa+5|iUpV7s-{~Ijt z4C{U*WrodA{&+)=b)L1+ZZ6Yv3oJIrc4?R&32ZDu{Kcq85$aRedA#P;4nLl&F@66| ztTLW6`N8X67_8e5SNEwytUKo7donP0N%l#HjN_e_c+ zp1S9s!uU6h3qj21fcUos9P9WUf{W}n8`1(e0S6Pb5)}N6k9q5MAeo4NpX1*!QfNHY zn!i-gg&NsE)JgXzk-Z%g|LaDOt#Ty%Imk8{Iz7o`>mEh)^k}lRhapb$_9Cy)5Kssx1QY@a0fm4k| zUaK)ubG3mCKR$gnc)VU?q}h^=m2{k><}v{pe*O-b?eh2DoZ<^+BjxX%ndf(lIOXq! zIXy>Ge6wcolO;V@(kYTom2{e<=Sj-nC9|FLjghapb$_9Cy)5Kssx1QY@a0fm4hapb$_9Cy)5Kssx1QY@a0fm4O z0Zj*)YXRT@oB92}`G4PLj=49!yDz|M00rS(*0W&&0sAbXKso3sP=<{Hji7fybL|w^ z3HlDSTBE>gpbK;gw1K_>-H=3qmq8bdpul~g??AO9Dew;HM-B?$Ut8xpOb*^(aHhDd+ z`a0hRXG;!pulB63^He*RyPKLD+~BV-pLcnAS*fSRnVY-V?JM*67S*}yt4k~9JJ)(w zuXR`XDi%1`uHn40k|_BV@#O0w74qPqXoJr^Xb-GVT8CTd>B8T5sbiXrLbPe5{EI3o7xPG)1c9Bd!u}^XmG+ zH#(~=FyjMTaq!4-ME^=_AE(9vBCPw{nXBOT4-2KBjo zbyeXZInTMas@~PqG~kGw#|;!;DQZ~G54p08gt)%KT9(mp3R;#C5nn4*uaid@HB{$^ z)J`5^)OZc6ojk^iUWncI{c; z5W2gtIq6Pb^hcuuS=jYtW7l>8b_XxQ9f#%2bB(LM*_}gK!Rx8;6Cj?;;`!Jem%_<4E6cSkD$L_`nrO{nYSB1~fVyF&=rn2+1*xDpM8p}r$usg;9?ZNF&jDQ}q zMMczUg93-N=X_RWo5$GZp2>W~HuqpvBS#TEW#eJ$s`9zb3%&&MJDa5kNZ$LlaIcrF z-`jAabk{`c9<_yru!wzTvvdo|`?D=P79{Iy8`(pbQ^|YSW}I5-n2n=7J7%y&CFJQB z+SXX1we<__-WZ|nw5_0j&@}3v37pzz$3*--Jqqy$@ON_Ed8{xUyY6YcJDb^a`Dh#; zO~mf-h1l)LiD~nX(Kf$?&BJq8VFs(7$GdZwox(@s`3P%K0heAqCNK{q^>4-Yq<&C6 zo)n`MyON??@n4hrx8m-key#W%{sAw#6+h9%CPjpS#S{}=1_R$ks6ZW5v@YObY*O#_d zx!3vXydL^;B-zW$oXb2*y{>9XcD1;i-o_f|>gGmIou_8KtHteH+tT1H$Gt;~yR_9^ z)$H>&I;nT0M%zcBoqE!+JHR_UTaZ1sv?BNfK%YADEZmU@^G4;}NW-A%qm z?*>ce5l1op4PDc}%^*$RjwR0QID>|7TVg&*ypW8O<;i90XkW6Xf1U}W58_;?KMBj4 z%TNm9iI*wl--8DLn<9gaQ+Q5z; z9tCvhzR{Zg;TVK)0L#bO!@X~Su>Ub7JOBm|*`A{5y=?L5U@WeoBXLbO(Wfb9%=f2o z%zuK1yNo7d50+6hKt%gfEn{N6dA7jq;uSgK1{uZ>DnOkECh( zZ`jMbSe%c0aO6ciW?u@VK{LKwE&ViI)3-42?J_(Dahp!>r^EUn1ncPcFn^3=@8BN0 zC#uKBx^a0f!_r@43GB_V^wwAc`!h7Xjot0z-NE=iU9@Y=$({P>nK38#T2H?oV>FHl z3%#BZf{1=IM$`Ym7$1)A+_A#nn`s>_u_X3qYC0Bb)byS~*jqz)XT>qtME7Jx#GV9NcO)Sad2JB%joHwa<{|6q2+5Qru6 zNVcZqKVH#*gRxjme~xR?a!37jwzaBHWQVJI3~pa%x7{+%%%+SSMX}=jWNgStT;W>! z<5;ri(0`20r7v-mOUJYF=)gD}&66vmr=_mZ>uGR%d~|nm=n{BnoKAjT9#p%W9(Q1R z3^z<}i|Fmu!nhS{1e&O591w=`QF6&pA3y9J};g^~Vi4rf6YLuG` zlhR({+c3O&`>XI790;~c5FpDRG#5Ih7UA0@zTLuCm}O0B{l zlX!nC{2qx%!$d91ACq_%3EwL5Y!!Y!x-@TZ2IVE5F<9W0_4i0TD~0ctc>sOi!$5M&#lg))=={Dh4 zN&CGf`~<+;kOCT|7XqHvj*>{O^A!PPlVqt{5ZssZu3(;{PMO~ z_y>h=75+()?-c%LQvQMPyM<3hJF~r4M1G<09}0i7@Joe%RQO)u4+&o_d@^uhdnsc7 zQsK{%ay8lk%SnzfbrVg+D0ry~6)N_?hUpY;TqDtA!`g-zoe$DSt=!2~s`^{fzaeOL>v- zIa0n+_yQ?^QTQcN{*CaJ!sno0r(;Z!pL++sN!W0Wm)dG#iuy$_3?t=791+7lSaVLi0fLK?^{afc_SADd;lLk3b7S1)xGu5vUkc z0xAV90xbqD0hNI+2VDVL3c36n^=c}fdsk|w1?h_pqxnef%=d;4s;XfGSE(_vzUE0 zk@FEpV4la!0+okhem;Wn|oP$3`pi<%C@ImXR}8 zy=4?W$AsTa3Z3Hdb7j1@r^4_3gl^MfYDEpzuo_=trPIc6rrt7&0ZQaRw!AH5xzC8% z2$8Ssgx^lGT#*N(htsTiC6DLt|La>u*558-y!~r^1u6C`!;6cHoo?gh1EDmJ*jv3 zrfoW2exLmf{h8iOcc9UDHl_1imMp7d4c#O*t}dpa_U_pRJ} a!O@-O3 -fPIC -fPIC -shared NativeExecutor + + x${sun.arch.data.model} @@ -63,7 +67,25 @@ lib${org.codehaus.mojo.option.gcc-linker.artifact-name} dylib - ${java.home}/include/darwin/ + ${java.home}/include/darwin/ + + + + + mac-aarch64 + + + mac + aarch64 + + + + aarch64 @@ -251,7 +273,7 @@ - ${org.codehaus.mojo.option.gcc-linker.final-name}-x${sun.arch.data.model} + ${org.codehaus.mojo.option.gcc-linker.final-name}-${linker.arch.suffix} ${packaging.type}