local version = 1 ---@enum Osabi local Osabi = { sysv = 0x00, hpux = 0x01, netbsd = 0x02, linux = 0x03, hurd = 0x04, solaris = 0x06, aix = 0x07, irix = 0x08, freebsd = 0x09, tru64 = 0x0a, modesto = 0x0b, openbsd = 0x0c, openvms = 0x0d, nsk = 0x0e, aros = 0x0f, fenixos = 0x10, cloudabi = 0x11, opevos = 0x12, } ---@enum Class local Class = { bit32 = 0x1, bit64 = 0x2, } ---@enum Endian local Endian = { little = 0x1, big = 0x2, } ---@enum Type local Type = { none = 0x00, rel = 0x01, exec = 0x02, dyn = 0x03, core = 0x04, loos = 0xfe00, hios = 0xfeff, loproc = 0xfe00, hiproc = 0xfeff, } ---@enum Machine local Machine = { none = 0x00, att = 0x01, sparc = 0x02, x86 = 0x03, m68k = 0x04, m88k = 0x05, -- todo } ---@alias ElfMagic [integer, integer, integer, integer] ---@class ElfHeader ---@field magic ElfMagic ---@field class Class ---@field data Endian ---@field version integer ---@field osabi Osabi ---@field abiversion integer ---@field type Type ---@field machine Machine ---@type ElfHeader local header = { magic = { 0x7f, 0x45, 0x4c, 0x46 }, class = Class.bit32, data = Endian.big, version = version, osabi = Osabi.netbsd, abiversion = 0, type = Type.exec, machine = Machine.x86, pack = function(self) local ident = string.pack("BBBBBBBBBxxxxxxx", self.magic[1], self.magic[2], self.magic[3], self.magic[4], self.class, self.data, self.version, self.osabi, self.abiversion) local e = (self.data == Endian.big) and ">" or "<" local sz = (self.class == Class.bit64) and "I8" or "I4" local hdr = string.pack(e .. "I2I2I4" .. sz .. sz .. sz .. "I4I2I2I2I2I2I2", self.type, self.machine, self.version, 0, 0x34, 0xff, 0, 52, 0x20, 0, 0x28, 0, 0) return ident .. hdr end } local function main() local output = "a.out" for i in ipairs(arg) do if arg[i] ~= "-o" then goto continue end if not arg[i + 1] then error("mkelf: missing filename after -o") end output = arg[i + 1] ::continue:: end local f = assert(io.open(output, "w")) f:write(header:pack()) f:close() end main()