gpt4 book ai didi

Java "implibs"又名没有实际代码的 jar,仅包含空主体的方法定义?

转载 作者:行者123 更新时间:2023-12-01 14:43:48 24 4
gpt4 key购买 nike

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

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

implib 的概念可以很容易地应用于普通的 Unixish 共享库 - 你只需转储符号,用它们在 C 中进行简单的重击,编译,然后瞧,你可以链接到该库而不是原始库。

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

最佳答案

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

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

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

披露:我是《Krakatau》的作者。

关于Java "implibs"又名没有实际代码的 jar,仅包含空主体的方法定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15671801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com