From fd07227afb68dfc5080427aac5714ba82f9e8b93 Mon Sep 17 00:00:00 2001 From: Sunil Nimmagadda Date: Sat, 24 Oct 2026 14:14:33 +0530 Subject: Refactor header configuration handling. - Mark optional fields and normalize them on load. - Validate (work in progress) required fields and their values. - Make sure that errors point to useful location in the config file. --- elf/header.lua | 60 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 13 deletions(-) (limited to 'elf') diff --git a/elf/header.lua b/elf/header.lua index 6baf327..b289f13 100644 --- a/elf/header.lua +++ b/elf/header.lua @@ -1,29 +1,63 @@ local fmt = require("elf.fmt") +local ec = require("elf.constants") ---@alias Magic [integer, integer, integer, integer] ---@class Header ----@field magic Magic +---@field magic? Magic ---@field class Class ---@field data Endian ----@field ident_version integer ----@field osabi Osabi ----@field abiversion integer +---@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 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 +---@field shentsize? integer +---@field shnum? integer +---@field shstrndx? integer local M = {} +function M.normalize(hdr) + hdr.magic = hdr.magic or { 0x7f, 0x45, 0x4c, 0x46 } + hdr.ident_version = hdr.ident_version or ec.VERSION + hdr.osabi = hdr.osabi or ec.Osabi.sysv + hdr.abiversion = hdr.abiversion or 0 + hdr.version = hdr.version or ec.VERSION + hdr.entry = hdr.entry or 0 + hdr.phoff = hdr.phoff or 0 + hdr.shoff = hdr.shoff or 0 + hdr.flags = hdr.flags or 0 + hdr.ehsize = hdr.ehsize or 0 + hdr.phentsize = hdr.phentsize or 0 + hdr.phnum = hdr.phnum or 0 + hdr.shentsize = hdr.shentsize or 0 + hdr.shnum = hdr.shnum or 0 + hdr.shstrndx = hdr.shstrndx or 0 +end + +function M.validate(hdr) + if not hdr.class then error("class is required in header", 3) end + if not hdr.data then error("data is required in header", 3) end + if not hdr.type then error("type is required in header", 3) end + if not hdr.machine then error("machine is required in header", 3) end + + if hdr.class ~= ec.Class.bit32 and hdr.class ~= ec.Class.bit64 then + error("class must be Class.bit32 or Class.bit64 in header", 3) + end + if hdr.data ~= ec.Endian.little and hdr.data ~= ec.Endian.big then + error("data must be Endian.little or Endian.big in header", 3) + end + -- TODO additional validations +end + ---@param hdr Header ---@return string ---@nodiscard -- cgit v1.3