src/hotspot/share/classfile/classLoader.cpp
changeset 58842 6c255334120d
parent 58722 cba8afa5cfed
child 58879 717ebfbac29d
--- a/src/hotspot/share/classfile/classLoader.cpp	Tue Oct 29 11:33:25 2019 +0100
+++ b/src/hotspot/share/classfile/classLoader.cpp	Tue Oct 29 08:26:55 2019 -0700
@@ -1529,9 +1529,41 @@
 
   // lookup zip library entry points
   load_zip_library();
-  // lookup jimage library entry points
+  // jimage library entry points are loaded below, in lookup_vm_options
+  setup_bootstrap_search_path();
+}
+
+char* lookup_vm_resource(JImageFile *jimage, const char *jimage_version, const char *path) {
+  jlong size;
+  JImageLocationRef location = (*JImageFindResource)(jimage, "java.base", jimage_version, path, &size);
+  if (location == 0)
+    return NULL;
+  char *val = NEW_C_HEAP_ARRAY(char, size+1, mtClass);
+  (*JImageGetResource)(jimage, location, val, size);
+  val[size] = '\0';
+  return val;
+}
+
+// Lookup VM options embedded in the modules jimage file
+char* ClassLoader::lookup_vm_options() {
+  jint error;
+  char modules_path[JVM_MAXPATHLEN];
+  const char* fileSep = os::file_separator();
+
+  // Initialize jimage library entry points
   load_jimage_library();
-  setup_bootstrap_search_path();
+
+  jio_snprintf(modules_path, JVM_MAXPATHLEN, "%s%slib%smodules", Arguments::get_java_home(), fileSep, fileSep);
+  JImageFile* jimage =(*JImageOpen)(modules_path, &error);
+  if (jimage == NULL) {
+    return NULL;
+  }
+
+  const char *jimage_version = get_jimage_version_string();
+  char *options = lookup_vm_resource(jimage, jimage_version, "jdk/internal/vm/options");
+
+  (*JImageClose)(jimage);
+  return options;
 }
 
 #if INCLUDE_CDS