summaryrefslogtreecommitdiff
path: root/elf/segment.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/segment.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/segment.lua')
-rw-r--r--elf/segment.lua65
1 files changed, 65 insertions, 0 deletions
diff --git a/elf/segment.lua b/elf/segment.lua
new file mode 100644
index 0000000..da8e9c6
--- /dev/null
+++ b/elf/segment.lua
@@ -0,0 +1,65 @@
+local ec = require("elf.constants")
+local fmt = require("elf.fmt")
+
+local M = {}
+
+---@class Segment
+---@field type SegmentType
+---@field flags integer
+---@field offset integer
+---@field vaddr integer
+---@field paddr integer
+---@field filesz integer
+---@field memsz integer
+---@field align integer
+
+---@param phdr Segment
+---@param endian Endian
+---@return string
+---@nodiscard
+local function pack32(phdr, endian)
+ return string.pack(
+ fmt.endian(endian) .. string.rep(fmt.word(ec.Class.bit32), 8),
+ phdr.type,
+ phdr.offset,
+ phdr.vaddr,
+ phdr.paddr,
+ phdr.filesz,
+ phdr.memsz,
+ phdr.flags,
+ phdr.align)
+end
+
+---@param phdr Segment
+---@param endian Endian
+---@return string
+---@nodiscard
+local function pack64(phdr, endian)
+ return string.pack(
+ fmt.endian(endian) .. "I4I4" .. string.rep(fmt.word(ec.Class.bit64), 6),
+ phdr.type,
+ phdr.flags,
+ phdr.offset,
+ phdr.vaddr,
+ phdr.paddr,
+ phdr.filesz,
+ phdr.memsz,
+ phdr.align)
+end
+
+---@param phdrs Segment[]
+---@param endian Endian
+---@param class Class
+---@return string
+---@nodiscard
+function M.pack(phdrs, endian, class)
+ local p = {}
+ for i, phdr in ipairs(phdrs) do
+ p[i] = (class == ec.Class.bit32) and
+ pack32(phdr, endian) or
+ pack64(phdr, endian)
+ end
+ return table.concat(p)
+end
+
+return M