summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunil Nimmagadda <sunil@nimmagadda.net>2026-10-09 22:10:26 +0530
committerSunil Nimmagadda <sunil@nimmagadda.net>2026-10-09 22:10:26 +0530
commit3f3efc9e40ee07e6cf777f1e135e2219a24d0701 (patch)
treec0a8c7f2aa7d70c1bd524d0c59230bac0bee813b
parentaf50e8f88657f60838ac999db28d9d786d965abe (diff)
Sprinkle some annotations.
Let's define an ElfHeader type.
-rw-r--r--mkelf.lua116
1 files changed, 104 insertions, 12 deletions
diff --git a/mkelf.lua b/mkelf.lua
index 94cde85..1c2687a 100644
--- a/mkelf.lua
+++ b/mkelf.lua
@@ -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()