From f5f7251972748d76f9f6e0cacdcae97a303a02dc Mon Sep 17 00:00:00 2001 From: Sunil Nimmagadda Date: Sat, 24 Oct 2026 16:28:16 +0530 Subject: Segments: normalize and validate. While here mark mandatory and optional fields. --- elf/segment.lua | 36 +++++++++++++++++++++++++++++------- mkelf.lua | 6 +++++- sample.elf.lua | 7 ------- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/elf/segment.lua b/elf/segment.lua index 662f42e..19cb6d0 100644 --- a/elf/segment.lua +++ b/elf/segment.lua @@ -3,17 +3,39 @@ local fmt = require("elf.fmt") ---@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 +---@field flags? integer +---@field offset? integer +---@field vaddr? integer +---@field paddr? integer +---@field filesz? integer +---@field memsz? integer +---@field align? integer +---@field first_section? string +---@field last_section? string ---@class Segments local M = {} + +function M.normalize(phdrs) + for _, phdr in ipairs(phdrs) do + phdr.flags = phdr.flags or 0 + phdr.offset = phdr.offset or 0 + phdr.vaddr = phdr.vaddr or 0 + phdr.paddr = phdr.paddr or 0 + phdr.filesz = phdr.filesz or 0 + phdr.memsz = phdr.memsz or 0 + phdr.align = phdr.align or 1 + end +end + +function M.validate(phdrs) + for _, phdr in ipairs(phdrs) do + if not phdr.type then error("type is required in segment", 3) end + -- TODO additional validations + end +end + ---@param phdr Segment ---@param endian Endian ---@return string diff --git a/mkelf.lua b/mkelf.lua index d6e412c..f078764 100644 --- a/mkelf.lua +++ b/mkelf.lua @@ -34,7 +34,11 @@ local function loadconfig(fn) t:normalize() t:validate() end, - segments = function(t) segments = setmetatable(t, segments_mt) end, + segments = function(t) + segments = setmetatable(t, segments_mt) + t:normalize() + t:validate() + end, sections = function(t) sections = setmetatable(t, sections_mt) end, }, __newindex = function(_, name) diff --git a/sample.elf.lua b/sample.elf.lua index d37a7c5..5b3c12a 100644 --- a/sample.elf.lua +++ b/sample.elf.lua @@ -8,13 +8,6 @@ header { segments { { type = SegmentType.dynamic, - flags = SegmentFlags.x, - offset = 0xf, - vaddr = 0xff, - paddr = 0xfff, - filesz = 0xffff, - memsz = 0xfffff, - align = 1, }, { type = SegmentType.dynamic, -- cgit v1.3