1

我有来自 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 包,看看它在那里做了什么以及为什么它失败了,但我希望我现在不必为此走那么远。

4

0 回答 0