Linux 有没有人能够创造出一个混合了PE COFF和ELF?
我的意思是一个二进制文件可以同时在Win32和Linux i386中运行吗?当然可以。使用Java。这两种格式完全不同,不太可能混合使用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' 显然,不能创建一个同时满足两种格式的文件
但是,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 $ - $$