OpenJDK直接修改Magic值的一些尝试

引言

为了加深对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",

这个原型应该是在这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值