What Java compilers use the jsr instruction, and what for?

末鹿安然 提交于 2019-11-26 16:50:45

问题


The Java bytecode language has the JSR instruction.

None of the code I've compiled with the Java 7 compiler uses this instruction.

However, sometimes Java binaries I've downloaded do use it, although rarely.

I'd be interested to know what compilers do use the instruction, and what Java code constructs would cause them to use it.

Edit this is not a duplicate as it refers to the JSR bytecode instruction and not a Java Specification Request


回答1:


The JSR instruction is actually not even allowed in Java 7 classfiles. It is only allowed in version 49.0 or earlier classfiles, corresponding to Java 5 or earlier. In practice, it fell out of use long before that.

The JSR/RET mechanism was originally used to implement finally blocks. However, they decided that the code size savings weren't worth the extra complexity and it got gradually phased out.

I don't know the exact versions since I can't find any compilers that old, but based on discussions I found online, it seems that the transition happened in the Java 1.2-1.3 era, with different compilers switching at different times. I have never seen a legitimate classfile from one of these old compilers, but you never know when it could happen.

In practice, the only use of JSR I've seen in the wild is for obfuscation. For example, Zelix Klassmaster used to use it for its string decryption code. I've also used it in several of my own Java crackmes.




回答2:


According to the JVM specification:

In Oracle's implementation of a compiler for the Java programming language prior to Java SE 6, the jsr instruction was used with the ret instruction in the implementation of the finally clause



来源:https://stackoverflow.com/questions/21150154/what-java-compilers-use-the-jsr-instruction-and-what-for

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!