From cf0ebd22df2574a2cd361783cff494fdd3922cac Mon Sep 17 00:00:00 2001 From: Sunil Nimmagadda Date: Fri, 16 Oct 2026 10:25:23 +0530 Subject: Pack program header. --- mkelf.lua | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/mkelf.lua b/mkelf.lua index 3df60f0..6dc985b 100644 --- a/mkelf.lua +++ b/mkelf.lua @@ -161,7 +161,79 @@ local header = { pack = ElfHeader_pack } +---@enum SegmentFlags +local SegmentFlags = { + x = 0x1, + w = 0x2, + r = 0x3, +} + +---@class ProgramHeader +---@field type integer +---@field flags integer +---@field offset integer +---@field vaddr integer +---@field paddr integer +---@field filesz integer +---@field memsz integer +---@field align integer + +---@enum SegmentType +local SegmentType = { + null = 0x00000000, + load = 0x00000001, + dynamic = 0x00000002, + interp = 0x00000003, + note = 0x00000004, + shlib = 0x00000005, + phdr = 0x00000006, + tls = 0x00000007, + loos = 0x60000000, + hios = 0x6FFFFFFF, + loproc = 0x70000000, + hiproc = 0x7FFFFFFF, +} + +---@param hdr ProgramHeader +---@param endian Endian +---@param class Class +---@nodiscard +local function ElfPHeader_pack(hdr, endian, class) + if class == Class.bit32 then + return string.pack(efmt(endian) .. string.rep(szfmt(class), 8), + hdr.type, + hdr.offset, + hdr.vaddr, + hdr.paddr, + hdr.filesz, + hdr.memsz, + hdr.flags, + hdr.align) + elseif class == Class.bit64 then + return string.pack(efmt(endian) .. "I4I4" .. string.rep(szfmt(class), 6), + hdr.type, + hdr.flags, + hdr.offset, + hdr.vaddr, + hdr.paddr, + hdr.filesz, + hdr.memsz, + hdr.align) + end +end + local function main() + ---@type ProgramHeader + local pheader = { + type = SegmentType.dynamic, + flags = SegmentFlags.x, + offset = 0xf, + vaddr = 0xff, + paddr = 0xfff, + filesz = 0xffff, + memsz = 0xfffff, + align = 1, + } local output = "a.out" for i in ipairs(arg) do if arg[i] ~= "-o" then goto continue end -- cgit v1.3