summaryrefslogtreecommitdiff
path: root/mkelf.lua
diff options
context:
space:
mode:
Diffstat (limited to 'mkelf.lua')
-rw-r--r--mkelf.lua72
1 files changed, 72 insertions, 0 deletions
diff --git a/mkelf.lua b/mkelf.lua
index 3df60f0..6dc985b 100644
--- a/mkelf.lua
+++ b/mkelf.lua
@@ -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