summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunil Nimmagadda <sunil@nimmagadda.net>2026-10-24 16:28:16 +0530
committerSunil Nimmagadda <sunil@nimmagadda.net>2026-10-24 16:28:16 +0530
commitf5f7251972748d76f9f6e0cacdcae97a303a02dc (patch)
tree71b3e73a9fc40403b0af0b61e458f00d4e7ccf0b
parentbe5b2da8fc3a09238e90deec7e35c40afbe00bd2 (diff)
Segments: normalize and validate.
While here mark mandatory and optional fields.
-rw-r--r--elf/segment.lua36
-rw-r--r--mkelf.lua6
-rw-r--r--sample.elf.lua7
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,