有没有人能够创造PE COFF和ELF的混合体?

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

Solutions Collecting From Web of "有没有人能够创造PE COFF和ELF的混合体?"

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

  • PE文件的前两个字符必须是'M' 'Z' ;
  • ELF文件的前四个字符必须是'\x7f' 'E' 'L' 'F'

显然,你不能创建一个满足两种格式的文件。


为了回应有关作为16位COM文件和Linux ELF文件的多边形二进制文件的意见,这是可能的(虽然真正的COM文件是DOS程序,而不是Windows – 当然不是Win32)。

这里有一个我碰撞在一起 – 与NASM编译。 它的工作原理是ELF文件的前两个字节( '\x7f' 'E' )碰巧也是有效的8086机器码(一个45字节的相对跳转 – 如果大于指令)。 来自Brian Raiter的最小ELF标题。

 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 $ - $$ 

两种格式足够不同,混合是不太可能的。

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

当然。 使用Java。