diff options
Diffstat (limited to 'mkelf.lua')
| -rw-r--r-- | mkelf.lua | 59 |
1 files changed, 37 insertions, 22 deletions
@@ -169,35 +169,50 @@ local SegmentFlags <const> = { r = 0x4, } +---@param phdr ProgramHeader +---@param endian Endian +---@return string +---@nodiscard +local function ElfPHeader_pack32(phdr, endian) + return string.pack(efmt(endian) .. string.rep(szfmt(Class.bit32), 8), + phdr.type, + phdr.offset, + phdr.vaddr, + phdr.paddr, + phdr.filesz, + phdr.memsz, + phdr.flags, + phdr.align) +end + +---@param phdr ProgramHeader +---@param endian Endian +---@return string +---@nodiscard +local function ElfPHeader_pack64(phdr, endian) + return string.pack( + efmt(endian) .. "I4I4" .. string.rep(szfmt(Class.bit64), 6), + phdr.type, + phdr.flags, + phdr.offset, + phdr.vaddr, + phdr.paddr, + phdr.filesz, + phdr.memsz, + phdr.align) +end + ---@param phdrs ProgramHeader[] ---@param endian Endian ---@param class Class +---@return string ---@nodiscard 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 + p[i] = (class == Class.bit32) and + ElfPHeader_pack32(phdr, endian) or + ElfPHeader_pack64(phdr, endian) end return table.concat(p) end |
