Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 有没有人能够创造出一个混合了PE COFF和ELF?_Linux_Winapi_Binary_Elf_Coff - Fatal编程技术网

Linux 有没有人能够创造出一个混合了PE COFF和ELF?

Linux 有没有人能够创造出一个混合了PE COFF和ELF?,linux,winapi,binary,elf,coff,Linux,Winapi,Binary,Elf,Coff,我的意思是一个二进制文件可以同时在Win32和Linux i386中运行吗?当然可以。使用Java。这两种格式完全不同,不太可能混合使用 但是,Linux支持通过“解释器”加载不同的可执行文件格式。例如,通过这种方式,可以直接在Linux下执行包含CIL(编译的C#或其他.NET语言)的编译.exe文件。这是不可能的,因为这两种类型的格式相互冲突: PE文件的前两个字符必须是'M''Z' ELF文件的前四个字符必须是'\x7f''E''L''F' 显然,不能创建一个同时满足两种格式的文件

我的意思是一个二进制文件可以同时在Win32和Linux i386中运行吗?

当然可以。使用Java。

这两种格式完全不同,不太可能混合使用


但是,Linux支持通过“解释器”加载不同的可执行文件格式。例如,通过这种方式,可以直接在Linux下执行包含CIL(编译的C#或其他.NET语言)的编译
.exe
文件。

这是不可能的,因为这两种类型的格式相互冲突:

  • PE文件的前两个字符必须是
    'M''Z'
  • ELF文件的前四个字符必须是
    '\x7f''E''L''F'
显然,不能创建一个同时满足两种格式的文件


对于一个16位COM文件和Linux ELF文件都有效的polyglot二进制文件的评论,这是可能的(尽管实际上COM文件是DOS程序,而不是Windows,当然也不是Win32)

这里是我拼凑的一个——用NASM编译它。它之所以有效,是因为ELF文件的前两个字节(
'\x7f''E'
)恰好也是有效的8086机器代码(如果大于指令,则为45字节的相对跳转)。最小ELF标题从中抄袭


很抱歉这个简短的回答,但是它被巧妙地设计成正好15个字符。真正的答案是ELF vs COFF格式几乎是你最不担心的。您也有完全不同的系统调用、共享库/DLL等。很酷,但是16位.com for Windows如何,并使其以某种方式与ELF兼容?那么com程序是否可以启动Windows.exe?那太棒了。也许COM程序可以将一个完整的Win32二进制文件写入用户的临时目录,然后启动它?(甚至是在记忆中)。顺便说一句,对于那些想知道:不,16位程序不会在Win7+中运行。这到底是怎么发生的?您知道我们可以在Windows下执行.txt。@是的,实际上有点类似,只是要“执行”文本文件,您需要在命令行上指定“解释器”,例如:“open foo.txt”以使用资源管理器(可能会生成textedit)。我所说的是识别可执行文件的类型,并使用一个名为binfmt_misc的系统直接加载适当的格式:“binfmt_misc提供了将其他二进制格式注册到内核[…]的能力。”()这只是一个方便的特性,而不是魔术。
BITS 32
ORG 0x08048000

  ehdr:                                                 ; Elf32_Ehdr
                db      0x7F, "ELF", 1, 1, 1, 0         ;   e_ident
        times 8 db      0
                dw      2                               ;   e_type
                dw      3                               ;   e_machine
                dd      1                               ;   e_version
                dd      _start                          ;   e_entry
                dd      phdr - $$                       ;   e_phoff
                dd      0                               ;   e_shoff
                dd      0                               ;   e_flags
                dw      ehdrsize                        ;   e_ehsize
                dw      phdrsize                        ;   e_phentsize
                dw      1                               ;   e_phnum
                dw      0                               ;   e_shentsize
                dw      0                               ;   e_shnum
                dw      0                               ;   e_shstrndx
  ehdrsize      equ     $ - ehdr

times 0x47-($-$$) db    0

; DOS COM File code
BITS 16
    mov dx, msg1 - $$ + 0x100
    mov ah, 0x09
    int 0x21
    mov ah, 0x00
    int 0x21
  msg1:         db      `Hello World (DOS).\r\n$`

BITS 32
  phdr:                                                 ; Elf32_Phdr
                dd      1                               ;   p_type
                dd      0                               ;   p_offset
                dd      $$                              ;   p_vaddr
                dd      $$                              ;   p_paddr
                dd      filesize                        ;   p_filesz
                dd      filesize                        ;   p_memsz
                dd      5                               ;   p_flags
                dd      0x1000                          ;   p_align
  phdrsize      equ     $ - phdr

; Linux ELF code
  _start:
    mov eax, 4      ; SYS_write
    mov ebx, 1      ; stdout
    mov ecx, msg2
    mov edx, msg2_len
    int 0x80
    mov eax, 1      ; SYS_exit
    mov ebx, 0
    int 0x80
  msg2:         db      `Hello World (Linux).\n`
  msg2_len      equ     $ - msg2

  filesize      equ     $ - $$