这是不可能的,因为两种类型的格式有冲突:
- PE文件的开头两个字符必须是
'M' 'Z'
; - ELF文件的开头四个字符必须为
'x7f' 'E' 'L' 'F'
。
显然,您不能创建一个可以同时满足两种格式的文件。
回应有关多语言二进制文件同时作为16位COM文件和Linux
ELF文件都有效的评论,这是有可能的(尽管COM文件实际上是DOS程序,而不是Windows,当然不是Win32)。
这是我一起敲的-用NASM编译。之所以起作用,是因为ELF文件(
'x7f' 'E')的前两个字节恰好也是有效的8086机器代码(45字节的相对于if-
大于-大于的指令跳转)。最小的ELF标头来自Brian
Raiter。
BITS 32ORG 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 $ - ehdrtimes 0x47-($-$$) db 0; DOS COM File preBITS 16 mov dx, msg1 - $$ + 0x100 mov ah, 0x09 int 0x21 mov ah, 0x00 int 0x21 msg1: db `Hello World (DOS).rn$`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 pre _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 $ - $$
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)