From 79f6b161f892f621a909ce1df99b3c680f3682a2 Mon Sep 17 00:00:00 2001 From: Sunil Nimmagadda Date: Fri, 23 Oct 2026 22:43:44 +0530 Subject: Refactor: Move to an elf module. While here, define a elf.d.lua to help author type check configuration file. --- elf/segment.lua | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 elf/segment.lua (limited to 'elf/segment.lua') 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 -- cgit v1.3