引言
为了加深对JVM的理解,在这里修改JVM源码,我已经尝试过除0XCAFEBABE作为MAGIC值外,0xCAFEBABA作为MAGIC,class文件能够成功运行。这里先将这一种实现的链接贴出来。
第一种尝试
而现在我的尝试是对Class文件的magic值的彻底修改,能不能修改成功自己也没什么底气。
瓶颈
test/runtime/classFileParserBug/BadAccModInrClss.jcod:30: 0xCAFEBABE;
test/runtime/classFileParserBug/emptyNameUtf8.jcod:29: 0xCAFEBABE;
test/runtime/classFileParserBug/emptynumbootstrapmethods1.jcod:31: 0xCAFEBABE;
test/runtime/classFileParserBug/badAnnotTag.jcod:29: 0xCAFEBABE;
test/runtime/classFileParserBug/LambdaMath.jcod:30: 0xCAFEBABE;
test/runtime/classFileParserBug/emptynumbootstrapmethods2.jcod:35: 0xCAFEBABE;
test/runtime/classFileParserBug/UseBadInterface1.jcod:33: 0xCAFEBABE;
test/runtime/classFileParserBug/p1/BadInterface2.jcod:31: 0xCAFEBABE;
test/runtime/classFileParserBug/p1/BadInterface1.jcod:31: 0xCAFEBABE;
test/runtime/classFileParserBug/emptySigUtf8.jcod:29: 0xCAFEBABE;
test/runtime/classFileParserBug/badEnclMthd.jcod:27: 0xCAFEBABE;
test/runtime/classFileParserBug/UseBadInterface2.jcod:33: 0xCAFEBABE;
test/runtime/classFileParserBug/BadAccModule.jcod:29: 0xCAFEBABE;
test/runtime/LocalVariableTable/DuplicateLVTT.cod:27: 0xCAFEBABE;
test/runtime/LocalVariableTable/DuplicateLVTT.cod:35: long 0xFFFFFFFFCAFEBABE;; // #5
test/runtime/LocalVariableTable/TestLVT.java:71: long l = 0xCAFEBABE;
test/runtime/LocalVariableTable/DuplicateLVT.cod:27: 0xCAFEBABE;
test/runtime/LocalVariableTable/DuplicateLVT.cod:35: long 0xFFFFFFFFCAFEBABE;; // #5
test/runtime/LocalVariableTable/NotFoundLVTT.cod:27: 0xCAFEBABE;
test/runtime/LocalVariableTable/NotFoundLVTT.cod:35: long 0xFFFFFFFFCAFEBABE;; // #5
test/runtime/EnclosingMethodAttr/EnclMethTest.jcod:31: 0xCAFEBABE;
test/runtime/modules/acc_module.jcod:36: 0xCAFEBABE;
test/runtime/modules/AccessCheck/p3/c3ReadEdge.jcod:42: 0xCAFEBABE;
test/runtime/modules/AccessCheck/p3/c3ReadEdgeDiffLoader.jcod:64: 0xCAFEBABE;
test/runtime/modules/AccessCheck/p3/c3.jcod:37: 0xCAFEBABE;
test/runtime/logging/p2/B.jcod:25: 0xCAFEBABE;
test/runtime/ClassFile/BadHelloWorld.jcod:29: 0xCAFEBABE;
test/runtime/duplAttributes/DupSignatureAttrs.jcod:27: 0xCAFEBABE;
test/runtime/duplAttributes/DupSignatureAttrs.jcod:153: 0xCAFEBABE;
test/runtime/duplAttributes/DupSignatureAttrs.jcod:279: 0xCAFEBABE;
test/runtime/duplAttributes/DupSignatureAttrs.jcod:447: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:38: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:176: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:299: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:422: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:553: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:684: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:822: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:946: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:1084: 0xCAFEBABE;
test/runtime/duplAttributes/DuplAttributes.jcod:1208: 0xCAFEBABE;
test/runtime/ConstantPool/WithConfiguration.jcod:36: 0xCAFEBABE;
test/gc/stress/gcbasher/Decompiler.java:33: if (magicNumber != 0xCAFEBABE) {
test/native/runtime/test_arguments.cpp:62: { "0XCAFEBABE", 0xcafebabe },
在hotspot目录下的test目录下就出现了很多这个值
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/classfile/Classfile.java:63:
assert magic == 0xCAFEBABE;
src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java:84:
dos.writeInt(0xCAFEBABE);
src/share/vm/prims/jvmtiClassFileReconstituter.cpp:726:
write_u4(0xCAFEBABA);
src/share/vm/classfile/classFileParser.cpp:84:
#define JAVA_CLASSFILE_MAGIC 0xCAFEBABA
src/cpu/x86/vm/vm_version_x86.hpp:599:
static int ymm_test_value() { return 0xCAFEBABA; }
而在src目录下,有这些,我已经将share下的都更改了。
重新编译报错:
Error occurred during initialization of VM
java/lang/ClassFormatError: Incompatible magic value 3405691582 in class file java/lang/Object
make[3]: *** [/root/OpenJDK9_2/build/linux-x86_64-normal-server-slowdebug/jdk/_packages_attribute.done] Error 1
ExplodedImageOptimize.gmk:40: recipe for target '/root/OpenJDK9_2/build/linux-x86_64-normal-server-slowdebug/jdk/_packages_attribute.done' failed
make/Main.gmk:356: recipe for target 'exploded-image-optimize' failed
make[2]: *** [exploded-image-optimize] Error 2
ERROR: Build failed for target 'jdk' in configuration 'linux-x86_64-normal-server-slowdebug' (exit code 2)
Stopping sjavac server
一开始我是编译make all,这里我选择了分步编译,这里make hotspot是能通过的,但是我选择make jdk是失败的,想了很久原因,应该跟OpenJDK的编译需要一个等级较低的boot JDK有关,于是我去找到这个JDK
在这里有发现:
lib/jvm/jdk-9b8c96f96a0f/test/tools/pack200/pack200-verifier/src/xmlkit/ClassReader.java:334: if (magic != 0xCAFEBABE) {
lib/jvm/jdk-9b8c96f96a0f/test/tools/pack200/pack200-verifier/src/xmlkit/ClassWriter.java:163: "magic", String.valueOf(0xCAFEBABE),
lib/jvm/jdk-9b8c96f96a0f/test/java/lang/invoke/indify/Indify.java:1422: if (magic != 0xCAFEBABE) throw new IOException("bad magic number");
lib/jvm/jdk-9b8c96f96a0f/make/tools/src/build/tools/addjsum/AddJsum.java:37: private static final long JSUM_SEED = 0xCAFEBABEBABECAFEL;
lib/jvm/jdk-9b8c96f96a0f/src/share/classes/java/nio/X-Buffer.java.template:224: * bb.putInt(0xCAFEBABE);
lib/jvm/jdk-9b8c96f96a0f/src/share/classes/java/nio/X-Buffer.java.template:231: * bb.putInt(0xCAFEBABE).putShort(3).putShort(45);</pre></blockquote>
lib/jvm/jdk-9b8c96f96a0f/src/share/classes/com/sun/java/util/jar/pack/Constants.java:39: public final static int JAVA_MAGIC = 0xCAFEBABE;
lib/jvm/jdk-9b8c96f96a0f/src/share/classes/sun/misc/ProxyGenerator.java:502: dout.writeInt(0xCAFEBABE);
lib/jvm/jdk-9b8c96f96a0f/src/share/classes/sun/invoke/anon/ConstantPoolParser.java:150: if (magic != 0xCAFEBABE)
lib/jvm/jdk-9b8c96f96a0f/src/share/classes/sun/reflect/ClassFileAssembler.java:50: emitInt(0xCAFEBABE);
lib/jvm/jdk-9b8c96f96a0f/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c:2256: CRW_ASSERT(ci, magic==0xCAFEBABE);
lib/jvm/jdk-9b8c96f96a0f/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c:2257: if ( magic != 0xCAFEBABE ) {
lib/jvm/jdk-9b8c96f96a0f/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c:2475: CRW_ASSERT(&ci, magic==0xCAFEBABE);
lib/jvm/jdk-9b8c96f96a0f/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c:2476: if ( magic != 0xCAFEBABE ) {
lib/jvm/jdk-9b8c96f96a0f/src/share/native/com/sun/java/util/jar/pack/constants.h:35:#define JAVA_MAGIC 0xCAFEBABE
这里在jdk目录下,有test目录,make目录,和src目录,OpenJDK9编译成功与否应该是跟src和make无关的,安那么尝试改动下test目录下的3个值。
仍然是这个错误:
java/lang/ClassFormatError: Incompatible magic value 3405691582 in class file java/lang/Object
这个值就是0XCAFEBABE;
root/OpenJDK9/hotspot/src/share/vm/classfile/classFileParser.cpp:5741: "Incompatible magic value %u in class filcde %s",
这个原型应该是在这里。