382 lines
10 KiB
C++
382 lines
10 KiB
C++
|
|
define format? format.extension
|
|
|
|
calminstruction format? statement*
|
|
local ext
|
|
match statement =as? ext, statement
|
|
jno pass
|
|
publish format:, ext
|
|
pass:
|
|
arrange statement, =format statement
|
|
assemble statement
|
|
end calminstruction
|
|
|
|
postpone
|
|
if definite format
|
|
format.binary as format
|
|
end if
|
|
end postpone
|
|
|
|
macro local_include? instr
|
|
local pos,chr,path
|
|
pos = lengthof __FILE__
|
|
while pos
|
|
chr = (__FILE__ shr (8*(pos-1))) and 0FFh
|
|
if chr = '/' | chr = '\'
|
|
break
|
|
end if
|
|
pos = pos - 1
|
|
end while
|
|
path = string __FILE__ and not ( (-1) shl (8*pos) )
|
|
macro instr file
|
|
include path bappend file
|
|
end macro
|
|
end macro
|
|
|
|
local_include __include
|
|
|
|
macro format?.MZ?
|
|
if ~ definite format
|
|
format binary as 'exe'
|
|
end if
|
|
__include 'format/mz.inc'
|
|
end macro
|
|
|
|
macro format?.PE? settings
|
|
PE.Settings.Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_32BIT_MACHINE or IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED
|
|
PE.Settings.DllCharacteristics = 0
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI
|
|
local seq
|
|
define seq settings:
|
|
while 1
|
|
match :, seq
|
|
break
|
|
else match =DLL? more, seq
|
|
PE.Settings.Characteristics = PE.Settings.Characteristics or IMAGE_FILE_DLL
|
|
redefine seq more
|
|
else match =large? more, seq
|
|
PE.Settings.Characteristics = PE.Settings.Characteristics or IMAGE_FILE_LARGE_ADDRESS_AWARE
|
|
redefine seq more
|
|
else match =WDM? more, seq
|
|
PE.Settings.DllCharacteristics = PE.Settings.DllCharacteristics or IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
|
|
redefine seq more
|
|
else match =NX? more, seq
|
|
PE.Settings.DllCharacteristics = PE.Settings.DllCharacteristics or IMAGE_DLLCHARACTERISTICS_NX_COMPAT
|
|
redefine seq more
|
|
else match =at? base =on? stub :, seq
|
|
PE.Settings.ImageBase = base
|
|
PE.Settings.Stub = stub
|
|
break
|
|
else match =at? base :, seq
|
|
PE.Settings.ImageBase = base
|
|
break
|
|
else match =on? stub :, seq
|
|
PE.Settings.Stub = stub
|
|
break
|
|
else
|
|
match =GUI? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI
|
|
redefine seq more
|
|
else match =console? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI
|
|
redefine seq more
|
|
else match =native? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_NATIVE
|
|
PE.Settings.SectionAlignment = 32
|
|
PE.Settings.FileAlignment = 32
|
|
redefine seq more
|
|
else match =EFI? more, seq
|
|
PE.Settings.Magic = 0x20B
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION
|
|
redefine seq more
|
|
else match =EFIboot? more, seq
|
|
PE.Settings.Magic = 0x20B
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
|
|
redefine seq more
|
|
else match =EFIruntime? more, seq
|
|
PE.Settings.Magic = 0x20B
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
|
|
redefine seq more
|
|
else
|
|
err 'invalid argument'
|
|
break
|
|
end match
|
|
match V.v more, seq
|
|
PE.Settings.MajorSubsystemVersion = V
|
|
PE.Settings.MinorSubsystemVersion = v
|
|
redefine seq more
|
|
end match
|
|
end match
|
|
end while
|
|
if ~ definite format
|
|
if PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
|
|
format binary as 'efi'
|
|
else if PE.Settings.Characteristics and IMAGE_FILE_DLL
|
|
format binary as 'dll'
|
|
else
|
|
format binary as 'exe'
|
|
end if
|
|
end if
|
|
__include 'format/pe.inc'
|
|
use32
|
|
end macro
|
|
|
|
macro format?.PE64? settings
|
|
PE.Settings.Magic = 0x20B
|
|
PE.Settings.Machine = IMAGE_FILE_MACHINE_AMD64
|
|
PE.Settings.Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_LARGE_ADDRESS_AWARE or IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED
|
|
PE.Settings.DllCharacteristics = 0
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI
|
|
PE.Settings.MajorSubsystemVersion = 5
|
|
PE.Settings.MinorSubsystemVersion = 0
|
|
local seq
|
|
define seq settings:
|
|
while 1
|
|
match :, seq
|
|
break
|
|
else match =DLL? more, seq
|
|
PE.Settings.Characteristics = PE.Settings.Characteristics or IMAGE_FILE_DLL
|
|
redefine seq more
|
|
else match =WDM? more, seq
|
|
PE.Settings.DllCharacteristics = PE.Settings.DllCharacteristics or IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
|
|
redefine seq more
|
|
else match =NX? more, seq
|
|
PE.Settings.DllCharacteristics = PE.Settings.DllCharacteristics or IMAGE_DLLCHARACTERISTICS_NX_COMPAT
|
|
redefine seq more
|
|
else match =at? base =on? stub :, seq
|
|
PE.Settings.ImageBase = base
|
|
PE.Settings.Stub = stub
|
|
break
|
|
else match =at? base :, seq
|
|
PE.Settings.ImageBase = base
|
|
break
|
|
else match =on? stub :, seq
|
|
PE.Settings.Stub = stub
|
|
break
|
|
else
|
|
match =GUI? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI
|
|
redefine seq more
|
|
else match =console? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI
|
|
redefine seq more
|
|
else match =native? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_NATIVE
|
|
PE.Settings.SectionAlignment = 32
|
|
PE.Settings.FileAlignment = 32
|
|
redefine seq more
|
|
else match =EFI? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION
|
|
redefine seq more
|
|
else match =EFIboot? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
|
|
redefine seq more
|
|
else match =EFIruntime? more, seq
|
|
PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
|
|
redefine seq more
|
|
else
|
|
err 'invalid argument'
|
|
break
|
|
end match
|
|
match V.v more, seq
|
|
PE.Settings.MajorSubsystemVersion = V
|
|
PE.Settings.MinorSubsystemVersion = v
|
|
redefine seq more
|
|
end match
|
|
end match
|
|
end while
|
|
if ~ definite format
|
|
if PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER | PE.Settings.Subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
|
|
format binary as 'efi'
|
|
else if PE.Settings.Characteristics and IMAGE_FILE_DLL
|
|
format binary as 'dll'
|
|
else
|
|
format binary as 'exe'
|
|
end if
|
|
end if
|
|
__include 'format/pe.inc'
|
|
use64
|
|
end macro
|
|
|
|
macro format?.ELF? variant
|
|
match , variant
|
|
if ~ definite format
|
|
format binary as 'o'
|
|
end if
|
|
__include 'format/elf32.inc'
|
|
use32
|
|
else match =executable? settings, variant:
|
|
match brand =at? base:, settings
|
|
ELF.Settings.ABI = brand
|
|
ELF.Settings.BaseAddress = base
|
|
else match =at? base:, settings
|
|
ELF.Settings.BaseAddress = base
|
|
else match brand:, settings
|
|
ELF.Settings.ABI = brand
|
|
end match
|
|
__include 'format/elfexe.inc'
|
|
use32
|
|
else match =dynamic? settings, variant:
|
|
ELF.Settings.Type = ET_DYN
|
|
match brand =at? base:, settings
|
|
ELF.Settings.ABI = brand
|
|
ELF.Settings.BaseAddress = base
|
|
else match =at? base:, settings
|
|
ELF.Settings.BaseAddress = base
|
|
else match brand:, settings
|
|
ELF.Settings.ABI = brand
|
|
end match
|
|
__include 'format/elfexe.inc'
|
|
use32
|
|
else
|
|
err 'invalid argument'
|
|
end match
|
|
end macro
|
|
|
|
macro format?.ELF64? variant
|
|
match , variant
|
|
if ~ definite format
|
|
format binary as 'o'
|
|
end if
|
|
__include 'format/elf64.inc'
|
|
use64
|
|
else match =executable? settings, variant:
|
|
ELF.Settings.Class = ELFCLASS64
|
|
ELF.Settings.Machine = EM_X86_64
|
|
ELF.Settings.BaseAddress = 400000h
|
|
match brand =at? base:, settings
|
|
ELF.Settings.ABI = brand
|
|
ELF.Settings.BaseAddress = base
|
|
else match =at? base:, settings
|
|
ELF.Settings.BaseAddress = base
|
|
else match brand:, settings
|
|
ELF.Settings.ABI = brand
|
|
end match
|
|
__include 'format/elfexe.inc'
|
|
use64
|
|
else match =dynamic? settings, variant:
|
|
ELF.Settings.Class = ELFCLASS64
|
|
ELF.Settings.Type = ET_DYN
|
|
ELF.Settings.Machine = EM_X86_64
|
|
ELF.Settings.BaseAddress = 400000h
|
|
match brand =at? base:, settings
|
|
ELF.Settings.ABI = brand
|
|
ELF.Settings.BaseAddress = base
|
|
else match =at? base:, settings
|
|
ELF.Settings.BaseAddress = base
|
|
else match brand:, settings
|
|
ELF.Settings.ABI = brand
|
|
end match
|
|
__include 'format/elfexe.inc'
|
|
use64
|
|
else
|
|
err 'invalid argument'
|
|
end match
|
|
end macro
|
|
|
|
macro format?.ELFx32? variant
|
|
match , variant
|
|
if ~ definite format
|
|
format binary as 'o'
|
|
end if
|
|
ELF.Settings.Machine = EM_X86_64
|
|
__include 'format/elf32.inc'
|
|
use64
|
|
else match =executable? settings, variant:
|
|
ELF.Settings.Class = ELFCLASS32
|
|
ELF.Settings.Machine = EM_X86_64
|
|
ELF.Settings.BaseAddress = 400000h
|
|
match brand =at? base:, settings
|
|
ELF.Settings.ABI = brand
|
|
ELF.Settings.BaseAddress = base
|
|
else match =at? base:, settings
|
|
ELF.Settings.BaseAddress = base
|
|
else match brand:, settings
|
|
ELF.Settings.ABI = brand
|
|
end match
|
|
__include 'format/elfexe.inc'
|
|
use64
|
|
else
|
|
err 'invalid argument'
|
|
end match
|
|
end macro
|
|
|
|
macro format?.COFF?
|
|
if ~ definite format
|
|
format binary as 'obj'
|
|
end if
|
|
__include 'format/coff.inc'
|
|
use32
|
|
end macro
|
|
|
|
macro format?.MS? variant
|
|
match =COFF?, variant
|
|
if ~ definite format
|
|
format binary as 'obj'
|
|
end if
|
|
COFF.Settings.Characteristics = IMAGE_FILE_32BIT_MACHINE or IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_BYTES_REVERSED_LO
|
|
__include 'format/coffms.inc'
|
|
use32
|
|
else
|
|
err 'invalid argument'
|
|
end match
|
|
end macro
|
|
|
|
macro format?.MS64? variant
|
|
match =COFF?, variant
|
|
if ~ definite format
|
|
format binary as 'obj'
|
|
end if
|
|
COFF.Settings.Machine = IMAGE_FILE_MACHINE_AMD64
|
|
COFF.Settings.Characteristics = IMAGE_FILE_32BIT_MACHINE or IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_BYTES_REVERSED_LO
|
|
__include 'format/coffms.inc'
|
|
use64
|
|
else
|
|
err 'invalid argument'
|
|
end match
|
|
end macro
|
|
|
|
macro format?.MachO? variant
|
|
match , variant
|
|
if ~ definite format
|
|
format binary as 'o'
|
|
end if
|
|
MachO.Settings.FileType equ MH_OBJECT
|
|
__include 'format/macho.inc'
|
|
use32
|
|
else match =executable?, variant
|
|
MachO.Settings.BaseAddress = 0x1000
|
|
__include 'format/macho.inc'
|
|
use32
|
|
else match =executable? at? base, variant
|
|
MachO.Settings.BaseAddress = base
|
|
__include 'format/macho.inc'
|
|
use32
|
|
else
|
|
err 'invalid argument'
|
|
end match
|
|
end macro
|
|
|
|
macro format?.MachO64? variant
|
|
MachO.Settings.ProcessorType equ CPU_TYPE_X86_64
|
|
MachO.Settings.ProcessorSubtype equ CPU_SUBTYPE_X86_64_ALL
|
|
match , variant
|
|
if ~ definite format
|
|
format binary as 'o'
|
|
end if
|
|
MachO.Settings.FileType equ MH_OBJECT
|
|
__include 'format/macho.inc'
|
|
use64
|
|
else match =executable?, variant
|
|
MachO.Settings.BaseAddress = 0x100000000
|
|
__include 'format/macho.inc'
|
|
use64
|
|
else match =executable? =at? base, variant
|
|
MachO.Settings.BaseAddress = base
|
|
__include 'format/macho.inc'
|
|
use64
|
|
else
|
|
err 'invalid argument'
|
|
end match
|
|
end macro
|