0

Windows 有“导入库”又名“imlibs”的概念 - 当您想将代码与动态库链接时,您不会将其链接到 .dll 本身,而是与包含调用 .dll 的 thunk 的特殊静态库链接. 好吧,这绝对是 Windows 的特质,但有时,这个想法并没有那么糟糕。

例如,假设您有一个由 100 个动态库组成的复杂系统,每个动态库平均为 2MB,然后是该系统的 10 个版本。因此,您为在所有版本中提供对此类系统的完整支持而发布的 SDK 将只有 2GB 的库来链接。使用仅包含符号和小的 thunk 的 implib,它会少得多。

implibs 的概念可以很容易地应用于普通的 Unixish 共享库 - 您只需转储符号,在 C 中从它们中创建简单的 thunk,编译,瞧,您可以链接到该库而不是原始库。

现在,我想将同样的想法扩展到 Java。所以,理想情况下,我会寻找一个可以接受 jar 的工具,然后在其中重写字节码类以删除方法体,只留下空(尽可能)体的方法定义。如果不存在这样的工具,我会寻找指向 Java 字节码转换框架的指针,这将使编写这样的工具变得容易。如果做不到这一点,我至少会寻找一种可以从 jar 中转储所有方法签名的工具,以遵循与本机共享库类似的方法(当然,这会更复杂,因为我不能只添加空 Java正文,而是需要返回有效类型的值)。

4

1 回答 1

1

根据你想要做什么,你可以很容易地破解Krakatau来做到这一点。只需将第 93 行更改method.py为 setself.code = None而不是调用self._loadCode(). 然后拆卸并重新组装罐子。Krakatau 目前不支持 jar 输出,因此您必须将生成的类压缩回 jar 中,但这很容易。

这将导致类在没有任何Code属性的情况下被重新组装,也没有任何仅由字节码使用的常量池条目,但保留所有其他内容以进行重新排序。这将留下诸如字段和可选属性之类的东西,但如果您的目标是拥有可以编译的存根类,您可能需要这些东西。

请注意,如果编译器尝试实际加载您正在编译的类,这可能不起作用。由于它们缺少Code属性,因此这些类实际上是无效的(假设它们首先包含任何带有字节码的方法),因此 JVM 将拒绝加载它们。

披露:我是 Krakatau 的作者。

于 2013-03-30T21:36:55.783 回答