【问题标题】:endian_tag of dex filesdex文件的endian_tag
【发布时间】:2016-05-19 11:47:43
【问题描述】:

dexes 文件中的 endian_tag 是如何工作的? Documentation 声明

常量 ENDIAN_CONSTANT 用于指示 找到它的文件。虽然标准的 .dex 格式是 little-endian,实现可以选择执行字节交换。 如果实现遇到 endian_tag 为的标头 REVERSE_ENDIAN_CONSTANT 而不是 ENDIAN_CONSTANT,它会知道 该文件已从预期形式进行字节交换。

建议如果有REVERSE_ENDIAN_CONSTANT 文件应该使用大端。这对吗?此外——文件的哪一部分应该使用这个大端序——整个文件包括header_items?

【问题讨论】:

    标签: android dalvik dex


    【解决方案1】:

    big-endian 标志将应用于文件中任何位置的任何多字节值。您可以通过查看DexSwapVerify source 来查看它所应用的确切内容集,它负责将所有多字节值从文件的字节顺序转换为主机的字节顺序。这样做是为了使 VM 或工具的其他部分不必在每次访问值时都进行交换。

    大多数 Android 设备都是 little-endian ARM 或 x86,因此交换操作是无操作的。一些 Android OS 开发者早期使用 PPC Mac,并且有一些大端设备(例如 MIPS),所以交换代码确实很重要。

    特别感兴趣的一行是:

    if (pHeader->endianTag != kDexEndianConstant) {
        ALOGE("Unexpected endian_tag: %#x", pHeader->endianTag);
        return false;
    }
    

    请注意,它不检查反向字节序常量——代码不希望找到大字节序 DEX 文件。 “原始” DEX 文件应该是 little-endian -- 该格式为它们提供了一种 big-endian 的方式,但我希望大多数工具会扼杀它们。

    优化的 DEX (.odex) 文件以主机字节顺序存储,因此从 .odex 读取时会跳过字节交换步骤。优化的 DEX 文件只能在生成它们的系统上读取。

    【讨论】:

    • 所以,如果我读取 dex 文件 逐字节 我总是得到“78:56:34:12”,因为原生 dex文件是小端的?对吗?
    • 这是我对“原始”DEX 文件的期望。
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多