From 093d454d90f54a201a4f6477453b33a8ca157b63 Mon Sep 17 00:00:00 2001 From: Codrut Stancu Date: Sun, 2 Mar 2025 01:51:13 +0100 Subject: [PATCH 1/3] Keep libraries sort order. --- .../hosted/jdk/JNIRegistrationSupport.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java index 5d623b75ebb3..b7ba36080d23 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java @@ -31,17 +31,15 @@ import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Stream; import org.graalvm.nativeimage.ImageSingletons; @@ -127,7 +125,7 @@ public void afterAnalysis(AfterAnalysisAccess access) { isSunMSCAPIProviderReachable = optSunMSCAPIClass.isPresent() && access.isReachable(optSunMSCAPIClass.get()); } if (ImageLayerBuildingSupport.buildingExtensionLayer()) { - for (String library : jniRegistrationSupportSingleton.baseLayerRegisteredLibraries) { + for (String library : jniRegistrationSupportSingleton.prevLayerRegisteredLibraries) { addLibrary(library); } } @@ -159,7 +157,8 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec } void registerLibrary(String libname) { - if (libname != null && jniRegistrationSupportSingleton.registeredLibraries.putIfAbsent(libname, Boolean.TRUE) == null) { + if (libname != null && !jniRegistrationSupportSingleton.currentLayerRegisteredLibraries.contains(libname)) { + jniRegistrationSupportSingleton.currentLayerRegisteredLibraries.add(libname); addLibrary(libname); } } @@ -175,7 +174,7 @@ private void addLibrary(String libname) { } public boolean isRegisteredLibrary(String libname) { - return jniRegistrationSupportSingleton.registeredLibraries.containsKey(libname); + return jniRegistrationSupportSingleton.currentLayerRegisteredLibraries.contains(libname); } /** Adds exports that `jvm` shim should re-export. */ @@ -262,8 +261,8 @@ private void copyJDKLibraries(Path jdkLibDir) { DebugContext debug = accessImpl.getDebugContext(); try (Scope s = debug.scope("copy"); Indent i = debug.logAndIndent("from: %s", jdkLibDir)) { - for (String libname : new TreeSet<>(jniRegistrationSupportSingleton.registeredLibraries.keySet())) { - if (jniRegistrationSupportSingleton.baseLayerRegisteredLibraries.contains(libname)) { + for (String libname : new TreeSet<>(jniRegistrationSupportSingleton.currentLayerRegisteredLibraries)) { + if (jniRegistrationSupportSingleton.prevLayerRegisteredLibraries.contains(libname)) { /* Skip libraries copied in the base layer. */ debug.log(DebugContext.INFO_LEVEL, "%s: SKIPPED", libname); continue; @@ -372,8 +371,8 @@ private Path getImageImportLib() { } private static final class JNIRegistrationSupportSingleton implements LayeredImageSingleton { - private final ConcurrentMap registeredLibraries = new ConcurrentHashMap<>(); - private final Set baseLayerRegisteredLibraries = new HashSet<>(); + private final List currentLayerRegisteredLibraries = new CopyOnWriteArrayList<>(); + private final List prevLayerRegisteredLibraries = new ArrayList<>(); public static JNIRegistrationSupportSingleton singleton() { return ImageSingletons.lookup(JNIRegistrationSupportSingleton.class); @@ -387,7 +386,7 @@ public EnumSet getImageBuilderFlags() { @Override public PersistFlags preparePersist(ImageSingletonWriter writer) { var snapshotWriter = ((SVMImageLayerWriter.ImageSingletonWriterImpl) writer).getSnapshotBuilder(); - SVMImageLayerWriter.initStringList(snapshotWriter::initRegisteredJNILibraries, registeredLibraries.keySet().stream()); + SVMImageLayerWriter.initStringList(snapshotWriter::initRegisteredJNILibraries, currentLayerRegisteredLibraries.stream()); return PersistFlags.CREATE; } @@ -395,7 +394,7 @@ public PersistFlags preparePersist(ImageSingletonWriter writer) { public static Object createFromLoader(ImageSingletonLoader loader) { JNIRegistrationSupportSingleton singleton = new JNIRegistrationSupportSingleton(); var snapshotReader = ((SVMImageLayerSingletonLoader.ImageSingletonLoaderImpl) loader).getSnapshotReader(); - SVMImageLayerLoader.streamStrings(snapshotReader.getRegisteredJNILibraries()).forEach(singleton.baseLayerRegisteredLibraries::add); + SVMImageLayerLoader.streamStrings(snapshotReader.getRegisteredJNILibraries()).forEach(singleton.prevLayerRegisteredLibraries::add); return singleton; } } From 54146efdc0503f4c98f6fa5a39723a014d72622a Mon Sep 17 00:00:00 2001 From: Codrut Stancu Date: Sun, 2 Mar 2025 23:58:52 +0100 Subject: [PATCH 2/3] Add the nio->net dependency. --- .../src/com/oracle/svm/hosted/c/NativeLibraries.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/NativeLibraries.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/NativeLibraries.java index 07a12c3fa930..1d518fa0b18a 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/NativeLibraries.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/c/NativeLibraries.java @@ -446,6 +446,10 @@ public void addStaticJniLibrary(String library, String... dependencies) { List allDeps = new ArrayList<>(Arrays.asList(dependencies)); /* "jvm" is a basic dependence for static JNI libs */ allDeps.add("jvm"); + if (library.equals("nio")) { + /* "nio" implicitly depends on "net" */ + allDeps.add("net"); + } dependencyGraph.add(library, allDeps); } From 44ec74622cbb005994b43598c1602734dd5e3994 Mon Sep 17 00:00:00 2001 From: Codrut Stancu Date: Wed, 5 Mar 2025 12:09:48 +0100 Subject: [PATCH 3/3] Fix base layer shared object linking. --- .../svm/hosted/image/CCLinkerInvocation.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/CCLinkerInvocation.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/CCLinkerInvocation.java index 691b9baf20ba..82331bbef008 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/CCLinkerInvocation.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/CCLinkerInvocation.java @@ -340,13 +340,18 @@ protected void setOutputKind(List cmd) { @Override protected List getLibrariesCommand() { List cmd = new ArrayList<>(); + String pushState = "-Wl,--push-state"; + String popState = "-Wl,--pop-state"; if (customStaticLibs) { - cmd.add("-Wl,--push-state"); + cmd.add(pushState); } + String previousLayerLib = null; for (String lib : libs) { String linkingMode = null; - if (ImageLayerBuildingSupport.buildingImageLayer() && HostedDynamicLayerInfo.singleton().isImageLayerLib(lib)) { - linkingMode = "dynamic"; + if (ImageLayerBuildingSupport.buildingExtensionLayer() && HostedDynamicLayerInfo.singleton().isImageLayerLib(lib)) { + VMError.guarantee(!lib.isEmpty()); + VMError.guarantee(previousLayerLib == null, "We currently only support one previous layer."); // GR-58631 + previousLayerLib = lib; } else if (dynamicLibC) { linkingMode = LIB_C_NAMES.contains(lib) ? "dynamic" : "static"; } else if (staticLibCpp) { @@ -358,7 +363,14 @@ protected List getLibrariesCommand() { cmd.add("-l" + lib); } if (customStaticLibs) { - cmd.add("-Wl,--pop-state"); + cmd.add(popState); + } + + if (previousLayerLib != null) { + cmd.add(pushState); + cmd.add("-Wl,-Bdynamic"); + cmd.add("-l" + previousLayerLib); + cmd.add(popState); } // Make sure libgcc gets statically linked