我的意思是可以在Win32和Linux i386中都运行一个二进制文件吗?
这是不可能的,因为两种类型的格式有冲突:
'M' 'Z'
'\x7f' 'E' 'L' 'F'
显然,您不能创建一个可以同时满足两种格式的文件。
回应有关多语言二进制文件同时作为16位COM文件和Linux ELF文件都有效的评论,这是有可能的(尽管COM文件实际上是DOS程序,而不是Windows,当然不是Win32)。
这是我一起敲的-用NASM编译。之所以起作用,是因为ELF文件('\x7f' 'E')的前两个字节恰好也是有效的8086机器代码(45字节的相对于if- 大于-大于的指令跳转)。最小的ELF标头来自Brian Raiter。
'\x7f' 'E'
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 $ - $$