diff options
| author | Sunil Nimmagadda <sunil@nimmagadda.net> | 2026-10-09 22:10:26 +0530 |
|---|---|---|
| committer | Sunil Nimmagadda <sunil@nimmagadda.net> | 2026-10-09 22:10:26 +0530 |
| commit | 3f3efc9e40ee07e6cf777f1e135e2219a24d0701 (patch) | |
| tree | c0a8c7f2aa7d70c1bd524d0c59230bac0bee813b /mkelf.lua | |
| parent | af50e8f88657f60838ac999db28d9d786d965abe (diff) | |
Sprinkle some annotations.
Let's define an ElfHeader type.
Diffstat (limited to 'mkelf.lua')
| -rw-r--r-- | mkelf.lua | 116 |
1 files changed, 104 insertions, 12 deletions
@@ -1,4 +1,7 @@ -local osabi = { +local version <const> = 1 + +---@enum Osabi +local Osabi <const> = { sysv = 0x00, hpux = 0x01, netbsd = 0x02, @@ -8,29 +11,118 @@ local osabi = { aix = 0x07, irix = 0x08, freebsd = 0x09, - tru64 = 0x0A, - modesto = 0x0B, - openbsd = 0x0C, - openvms = 0x0D, - nsk = 0x0E, - aros = 0x0F, + tru64 = 0x0a, + modesto = 0x0b, + openbsd = 0x0c, + openvms = 0x0d, + nsk = 0x0e, + aros = 0x0f, fenixos = 0x10, cloudabi = 0x11, opevos = 0x12, } -local class = { +---@enum Class +local Class <const> = { bit32 = 0x1, bit64 = 0x2, } -local endian = { +---@enum Endian +local Endian <const> = { little = 0x1, big = 0x2, } -local version <const> = 1 +---@enum Type +local Type <const> = { + none = 0x00, + rel = 0x01, + exec = 0x02, + dyn = 0x03, + core = 0x04, + loos = 0xfe00, + hios = 0xfeff, + loproc = 0xfe00, + hiproc = 0xfeff, +} + +---@enum Machine +local Machine <const> = { + 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 <const> = { + magic = { 0x7f, 0x45, 0x4c, 0x46 }, + class = Class.bit32, + data = Endian.big, + version = version, + osabi = Osabi.netbsd, + abiversion = 0, + type = Type.exec, + machine = Machine.x86, -local header = { - class = class["bit32"] + 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() |
