gpt4 book ai didi

executable - 字节码(如 Java 字节码)和文件和机器代码可执行文件(如 ELF)有什么区别?

转载 作者:行者123 更新时间:2023-12-03 15:12:47 24 4
gpt4 key购买 nike

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

两者之间有什么显着区别?

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

或者它们都有 header ,但 ELF 和 PE header 包含架构但类文件不包含

Java 类文件
Java Class file

Sprite 文件
ELF File

PE文件
PE File

最佳答案

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

相比之下, native 代码(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”(程序链接表),它使编译器可以简单地将 stub 放入您调用的函数(printf、open 等)中,链接器可以在加载可执行文件时连接。
  • 导入表(在 Windows 中......在 ELF 中这是一个 DYNAMIC 部分,在 OS X 中这是一个 LC_LOAD_LIBRARY 命令)用于声明附加库。如果在加载可执行文件时找不到这些,则加载失败,您将无法运行它。
  • 导出表(用于库/dylibs/等)是库(或在 Windows 中,甚至是 .exe)可以导出以便与其他人链接的符号。
  • 常量通常在您所看到的“.rodata”中。

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

    TG

    关于executable - 字节码(如 Java 字节码)和文件和机器代码可执行文件(如 ELF)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12191462/

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