字节码如Java字节码和文件以及ELF等机器代码可执行文件有什么区别?

zei*_*tue 4 executable bytecode elf machine-code .class-file

字节码二进制可执行文件(如Java类文件,Parrot字节码文件或CLR文件)和机器代码可执行文件(如ELF,Mach-O和PE)之间有何区别.

这两者之间有什么明显的区别?

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

或者它们都有标题,但ELF和PE标题包含Architecture,但Class文件不包含

Java类文件 Java类文件

精灵档案 ELF档案

PE文件 PE文件

小智 12

在编译成机器代码之前,字节代码是注意到的中间步骤.因为最后一步是加载时间(通常是运行时,就像即时(JIT)编译的情况一样,字节代码是独立于架构的:运行时(.net的CLR或Java的JVM)负责将字节代码操作码映射到其底层机器代码表示.

相比之下,本机代码(Windows:PE,PE32 +,OS X/iOS:Mach-O,Linux/Android /等:ELF)是编译代码,适用于特定架构(Android/iOS:ARM,大多数:Intel 32 -bit(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命令)用于声明其他库.如果在加载可执行文件时找不到那些,则加载失败,您无法运行它.
    • 导出表(对于libraries/dylibs/etc)是库(或Windows,甚至是.exe)可以导出以便与其他人链接的符号.
    • 常量通常在您看到的".rodata"中.

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

TG


imu*_*ion 6

字节代码是"中途"步骤.因此Java编译器(javac)将源代码转换为字节代码.机器代码是下一步,计算机将字节代码转换为机器代码(可由计算机读取),然后通过读取机器代码执行程序.计算机无法直接读取源代码,同样编译器也无法立即转换为机器代码.您需要一个中途步骤才能使程序正常运行.