--- old/src/share/vm/memory/filemap.cpp 2016-09-16 09:33:52.749236657 -0700 +++ new/src/share/vm/memory/filemap.cpp 2016-09-16 09:33:52.633228502 -0700 @@ -179,6 +179,7 @@ _classpath_entry_table_size = mapinfo->_classpath_entry_table_size; _classpath_entry_table = mapinfo->_classpath_entry_table; _classpath_entry_size = mapinfo->_classpath_entry_size; + _num_patch_mod_prefixes = ClassLoader::num_patch_mod_prefixes(); // The following fields are for sanity checks for whether this archive // will function correctly with this JVM and the bootclasspath it's @@ -911,11 +912,6 @@ return false; } - if (Arguments::get_patch_mod_prefix() != NULL) { - FileMapInfo::fail_continue("The shared archive file cannot be used with --patch-module."); - return false; - } - if (!Arguments::has_jimage()) { FileMapInfo::fail_continue("The shared archive file cannot be used with an exploded module build."); return false; @@ -952,6 +948,23 @@ return false; } + // Check if there is a mismatch in --patch-module entry counts between dump time and run time. + // More checks will be performed on individual --patch-module entry in the + // SharedPathsMiscInfo::check() function. + GrowableArray* patch_mod_args = Arguments::get_patch_mod_prefix(); + if (patch_mod_args != NULL) { + if (_num_patch_mod_prefixes == 0) { + FileMapInfo::fail_stop("--patch-module found in run time but none was specified in dump time"); + } + if (patch_mod_args->length() != _num_patch_mod_prefixes) { + FileMapInfo::fail_stop("mismatched --patch-module entry counts between dump time and run time"); + } + } else { + if (_num_patch_mod_prefixes > 0) { + FileMapInfo::fail_stop("--patch-module specified in dump time but none was specified in run time"); + } + } + return true; }