diff options
Diffstat (limited to 'mkelf.lua')
| -rw-r--r-- | mkelf.lua | 57 |
1 files changed, 32 insertions, 25 deletions
@@ -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() |
