summaryrefslogtreecommitdiff
path: root/mkelf.lua
diff options
context:
space:
mode:
authorSunil Nimmagadda <sunil@nimmagadda.net>2026-10-16 10:59:31 +0530
committerSunil Nimmagadda <sunil@nimmagadda.net>2026-10-16 10:59:31 +0530
commit5e5d14f8995c6d4bca9540cf2bd869dff3e11252 (patch)
tree1feaf55136bdf3d9adc007c63eba8a9571fc8b39 /mkelf.lua
parent6e0784c79584726fe200eb2ab136c89bea012e62 (diff)
Iterate and pack each program header entry.
Diffstat (limited to 'mkelf.lua')
-rw-r--r--mkelf.lua57
1 files changed, 32 insertions, 25 deletions
diff --git a/mkelf.lua b/mkelf.lua
index e09c772..61e1c54 100644
--- a/mkelf.lua
+++ b/mkelf.lua
@@ -169,39 +169,44 @@ local SegmentFlags <const> = {
r = 0x3,
}
----@param hdr ProgramHeader
+---@param phdrs 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)
+local function ElfPHeader_pack(phdrs, endian, class)
+ local p = {}
+ for i, phdr in ipairs(phdrs) do
+ if class == Class.bit32 then
+ p[i] = string.pack(efmt(endian) .. string.rep(szfmt(class), 8),
+ phdr.type,
+ phdr.offset,
+ phdr.vaddr,
+ phdr.paddr,
+ phdr.filesz,
+ phdr.memsz,
+ phdr.flags,
+ phdr.align)
+ elseif class == Class.bit64 then
+ p[i] = string.pack(
+ efmt(endian) .. "I4I4" .. string.rep(szfmt(class), 6),
+ phdr.type,
+ phdr.flags,
+ phdr.offset,
+ phdr.vaddr,
+ phdr.paddr,
+ phdr.filesz,
+ phdr.memsz,
+ phdr.align)
+ end
end
+ return table.concat(p)
end
local function main()
---@type ElfHeader
local header <const> = {
magic = { 0x7f, 0x45, 0x4c, 0x46 },
- class = Class.bit32,
+ class = Class.bit64,
data = Endian.big,
ident_version = ELFVERSION,
osabi = Osabi.netbsd,
@@ -214,8 +219,8 @@ local function main()
shoff = 0xff,
flags = 0,
ehsize = 52,
- phentsize = 0x20,
- phnum = 0,
+ phentsize = 0, -- filled in by pack later
+ phnum = 0, -- filled in by pack later
shentsize = 0x28,
shnum = 0,
shstrndx = 0,
@@ -253,6 +258,8 @@ local function main()
::continue::
end
local f = assert(io.open(output, "w"))
+ header.phnum = #phdrs
+ header.phentsize = (header.class == Class.bit64) and 0x38 or 0x20
f:write(ElfHeader_pack(header))
f:write(ElfPHeader_pack(phdrs, header.data, header.class))
f:close()