我有来自 Jasmin SourceForge 的 Jasmin 2.4 版本和来自 Soot 项目的 Jasmin 2.4 版本(在 sable.mcgill.ca,标记为“jasminclasses”),而 Soot 版本(我需要)似乎不是好好工作。
我制作了一个简单的编译器,它最初编译为 Jasmin JVM 程序集,然后使用 Jasmin 组装成 JVM 类文件。我曾经使用 Jasmin 的 SourceForge 网站上的普通版 Jasmin,它运行良好;一切编译并正确运行。现在我已经开始使用 Soot 框架进行优化,只要我不尝试将优化后的代码转换回类文件,所有这些都很好。
由于我现在在使用Soot,所以我必须使用Soot 的Jasmin 版本,它支持Soot 使用的JasminOutputStream。Soot 的 Jasmin 版本似乎仍然应该能够以“老式”方式处理 Jasmin 文件,读取“.j”文件而不是采用输入流,但是当我尝试时(对于初始组装优化前),Soot版本失败。
如果我做
java -cp jasmin.jar jasmin.Main MyClass.j
我按预期得到输出“生成:MyClass.class”。
如果我这样做(其中 jasminclasses 是 Jasmin 的烟灰版本)
java -cp jasminclasses-2.4.0.jar jasmin.Main MyClass.j
我得到输出
MyClass.j:5: Warning - Syntax error.
.field public n
^
MyClass.j:5: Error - Couldn't repair and continue parse.
.field public n
^
MyClass.j: Found 2 errors`
第 5 行只是 .field public n I 它没有任何不妥之处,如上所示,它与 Jasmin 的普通版本编译得很好。
为了完整起见,这里有更多关于这一点的代码:
.source MyClass.j
.class public MyClass
.super AnotherClass
.field public n I
.method public <init>()V
aload_0
invokenonvirtual AnotherClass/<init>()V
return
.end method
那里的一切都很好,并且与普通的 Jasmin 组装得很好。
有谁知道 Jasmin 的 Soot 版本是否需要不同的语法?与大多数关于 Soot 和 Jasmin 的内容一样,网络上根本没有太多内容,更不用说我正在搜索的内容了,所以我的谷歌搜索结果并不多。
提前感谢您提供的任何帮助,我真的很沮丧。我的下一步是调试 Soot 的 Jasmin 包,看看它在那里做了什么以及为什么它失败了,但我希望我现在不必为此走那么远。