5

字节码二进制可执行文件(如 Java 类文件、Parrot 字节码文件或 CLR 文件)与机器码可执行文件(如 ELF、Mach-O 和 PE)之间有什么区别。

两者之间的显着区别是什么?

比如ELF结构中的.text区域等于class文件的哪一部分?

或者它们都有标头,但 ELF 和 PE 标头包含体系结构,但类文件没有

Java 类文件 Java 类文件

精灵文件 精灵档案

体育档案 体育档案

4

2 回答 2

12

正如 imulsion 所指出的,字节码是一个中间步骤,就在编译成机器码之前。因为最后一步是加载时间(通常是运行时,就像即时(JIT)编译一样,字节码是独立于架构的:运行时(.net 的 CLR 或 Java 的 JVM)负责将字节码操作码映射到它们的底层机器码表示。

相比之下,本机代码(Windows:PE、PE32+、OS X/iOS:Mach-O、Linux/Android/etc:ELF)是编译后的代码,适用于特定架构(Android/iOS:ARM,其他大多数:Intel 32位(i386)或 64 位)。这些都非常相似,但仍然需要部分(或者,用 Mach-O 的说法“加载命令”)来设置可执行文件的内存结构,因为它成为一个进程(旧 DOS 支持“.com”格式,这是一个原始内存映像)。在以上所有内容中,您可以粗略地说以下内容:

  • 带有“.”的部分 由编译器创建,并且是“默认”或预期具有默认行为
    • 可执行文件有主代码部分,通常称为“text”或“.text”。这是本机代码,可以在特定架构上运行
    • 字符串存储在单独的部分中。这些用于硬编码输出(您打印的内容)以及符号名称。
    • 符号 - 链接器用来将可执行文件与其库(Windows:DLL、Linux/Android:共享对象、OS X/iOS:.dylibs 或框架)放在一起的符号存储在单独的部分中。通常还有一个“PLT”(过程链接表),它使编译器能够简单地将存根放入您调用的函数(printf、open 等),链接器可以在可执行文件加载时连接。
    • 导入表(在 Windows 用语中。在 ELF 中这是一个 DYNAMIC 部分,在 OS X 中这是一个 LC_LOAD_LIBRARY 命令)用于声明其他库。如果在加载可执行文件时未找到这些,则加载失败,您无法运行它。
    • 导出表(用于库/dylibs/etc)是库(或在 Windows 中,甚至是 .exe)可以导出以便其他人链接的符号。
    • 常量通常位于您所看到的“.rodata”中。

希望这可以帮助。真的,你的问题很模糊..

TG

于 2012-08-30T22:45:10.537 回答
6

字节码是一个“中途”步骤。所以Java编译器(javac)会把源代码转成字节码。机器代码是下一步,计算机获取字节代码,将其转换为机器代码(计算机可以读取),然后通过读取机器代码来执行您的程序。计算机不能直接读取源代码,同样编译器也不能立即翻译成机器代码。您需要一个中途步骤才能使程序正常工作。

于 2012-08-30T07:01:44.017 回答