diff options
| author | Sunil Nimmagadda <sunil@nimmagadda.net> | 2026-10-16 10:25:23 +0530 |
|---|---|---|
| committer | Sunil Nimmagadda <sunil@nimmagadda.net> | 2026-10-16 10:34:13 +0530 |
| commit | cf0ebd22df2574a2cd361783cff494fdd3922cac (patch) | |
| tree | d25b0eb63579d797d3bb7ceb3f508a574a613431 /mkelf.lua | |
| parent | eaf0d2609a4b38035a524cd35856b3ce71f79658 (diff) | |
Pack program header.
Diffstat (limited to 'mkelf.lua')
| -rw-r--r-- | mkelf.lua | 72 |
1 files changed, 72 insertions, 0 deletions
@@ -161,7 +161,79 @@ local header <const> = { pack = ElfHeader_pack } +---@enum SegmentFlags +local SegmentFlags <const> = { + 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 <const> = { + 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 <const> = { + 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 |
