summaryrefslogtreecommitdiff
path: root/elf/header.lua
diff options
context:
space:
mode:
authorSunil Nimmagadda <sunil@nimmagadda.net>2026-10-23 22:43:44 +0530
committerSunil Nimmagadda <sunil@nimmagadda.net>2026-10-23 22:44:48 +0530
commit79f6b161f892f621a909ce1df99b3c680f3682a2 (patch)
tree7647bed7ccaa977f3cd28dcc8283ceef63265e57 /elf/header.lua
parentd46e3e7761a133d58b6c77058473d9edc8a54744 (diff)
Refactor: Move to an elf module.
While here, define a elf.d.lua to help author type check configuration file.
Diffstat (limited to 'elf/header.lua')
-rw-r--r--elf/header.lua58
1 files changed, 58 insertions, 0 deletions
diff --git a/elf/header.lua b/elf/header.lua
new file mode 100644
index 0000000..2a9ec68
--- /dev/null
+++ b/elf/header.lua
@@ -0,0 +1,58 @@
+local fmt = require("elf.fmt")
+
+local M = {}
+
+---@alias Magic [integer, integer, integer, integer]
+
+---@class Header
+---@field magic Magic
+---@field class Class
+---@field data Endian
+---@field ident_version integer
+---@field osabi Osabi
+---@field abiversion integer
+---@field type Type
+---@field machine Machine
+---@field version integer
+---@field entry integer
+---@field phoff integer
+---@field shoff integer
+---@field flags integer
+---@field ehsize integer
+---@field phentsize? integer
+---@field phnum? integer
+---@field shentsize integer
+---@field shnum integer
+---@field shstrndx integer
+
+---@param hdr Header
+---@return string
+---@nodiscard
+function M.pack(hdr)
+ return string.pack("BBBBBBBBBxxxxxxx" ..
+ fmt.endian(hdr.data) ..
+ "I2I2I4" ..
+ string.rep(fmt.word(hdr.class), 3) ..
+ "I4I2I2I2I2I2I2",
+ hdr.magic[1], hdr.magic[2], hdr.magic[3], hdr.magic[4],
+ hdr.class,
+ hdr.data,
+ hdr.ident_version,
+ hdr.osabi,
+ hdr.abiversion,
+ hdr.type,
+ hdr.machine,
+ hdr.version,
+ hdr.entry,
+ hdr.phoff,
+ hdr.shoff,
+ hdr.flags,
+ hdr.ehsize,
+ hdr.phentsize,
+ hdr.phnum,
+ hdr.shentsize,
+ hdr.shnum,
+ hdr.shstrndx)
+end
+
+return M