ddn.elf.file
ELF file reading infrastructure.
This module provides core functionality for reading and parsing ELF files, supporting both file-backed and memory-backed access with lazy loading and caching for efficient operation.
Types 6
ELF file reader with lazy loading and caching.
This struct provides access to ELF file data, supporting both file-backed and memory-backed sources. It implements lazy loading of sections and segments with caching for efficient access.
private const(ubyte)[] _dataprivate types.ElfClass _classprivate io.ElfEndian _endianprivate gelf.FileHeader _ehdrprivate bool _ehdrCachedconst(gelf.FileHeader) getEhdr()Get the GELF file header.elf32.FileHeader getEhdr32()Get the ELF32 file header.elf64.FileHeader getEhdr64()Get the ELF64 file header.size_t getSectionCount()Get the number of section headers, resolving extended numbering.size_t getProgramHeaderCount()Get the number of program headers, resolving extended numbering.auto getSectionHeaders()Get a range for iterating over section headers.auto getProgramHeaders()Get a range for iterating over program headers.Input range over section headers, decoding the class-specific wire layout with endian conversion.
Iterates a fixed number of entries at the class-specific stride, decoding each entry on demand.
private const(ubyte)[] _dataprivate size_t _offsetprivate size_t _countprivate size_t _strideprivate types.ElfClass _classprivate io.ElfEndian _endiangelf.SectionHeader front()Decode and return the current section header.void popFront()Advance to the next section header.SectionHeaderRange save()Save the current position.this(const(ubyte)[] data, size_t offset, size_t count, size_t stride,
types.ElfClass cls, io.ElfEndian endian)Construct a section header range.Input range over program headers, decoding the class-specific wire layout (including the differing ELF32 field order) with endian conversion.
private const(ubyte)[] _dataprivate size_t _offsetprivate size_t _countprivate size_t _strideprivate types.ElfClass _classprivate io.ElfEndian _endiangelf.ProgramHeader front()Decode and return the current program header.void popFront()Advance to the next program header.ProgramHeaderRange save()Save the current position.this(const(ubyte)[] data, size_t offset, size_t count, size_t stride,
types.ElfClass cls, io.ElfEndian endian)Construct a program header range.Section range for ElfFile.
Provides input range interface for iterating over sections.
@property auto front()Get the current section header.void popFront()Advance to the next section.this(ElfFile file, SectionHeaderRange headerRange)Constructor.Program range for ElfFile.
Provides input range interface for iterating over program headers.
@property auto front()Get the current program header.void popFront()Advance to the next program header.this(ElfFile file, ProgramHeaderRange headerRange)Constructor.Builder for creating ELF files from scratch.
This class provides a fluent API for constructing ELF files with full control over sections, segments, symbols, and other ELF structures.
private types.ElfClass _classprivate io.ElfEndian _endianprivate types.ElfType _typeprivate types.ElfMachine _machineprivate ulong _entryprivate uint _flagsprivate strtab.StringTableBuilder _shstrtabprivate strtab.StringTableBuilder _strtabprivate strtab.StringTableBuilder _dynstrprivate SectionEntry[] _sectionsprivate SegmentEntry[] _segmentsprivate SymbolEntry[] _symbolsprivate uint _strtabGenIdxprivate uint _symtabGenIdxprivate ulong _baseAddressprivate types.ElfOsAbi _osabiprivate ubyte _abiVersionprivate uint _phnumuint toUint32(ulong value, string field) staticConvert a 64-bit value to its 32-bit ELF representation.ushort toSymbolShndx(uint index) staticConvert a symbol section index to its 16-bit ELF representation.void updateOrAddSymtab(ubyte[] symData, uint strtabIdx,
uint firstGlobal, ulong addralign, ulong entsize)Create or update the generated .symtab section in place.ElfBuilder create(types.ElfClass class_, io.ElfEndian endian) staticCreate a new ELF builder with the specified class and endianness.ElfBuilder setFileType(types.ElfType type)Set the ELF file type (relocatable, executable, shared object, etc.).ElfBuilder setMachine(types.ElfMachine machine)Set the target machine architecture.ElfBuilder setEntryPoint(ulong entry)Set the entry point address.ElfBuilder setBaseAddress(ulong base)Set the virtual address base for the file layout.ElfBuilder setOsAbi(types.ElfOsAbi osabi)Set the OS/ABI identification.ElfBuilder setAbiVersion(ubyte ver)Set the ABI version.types.ElfOsAbi osAbi() constubyte abiVersion() constvoid setGeneratedTableIndices(uint symtabIdx, uint strtabIdx)ElfBuilder setSectionAddress(uint index, ulong addr)Set the virtual address of a section.ElfBuilder setSegmentAddress(uint index, ulong vaddr, ulong paddr = 0)Set the virtual (and optional physical) address of a segment.ElfBuilder setFlags(uint flags)Set processor-specific flags.uint addSection(string name, uint type, ulong flags, const(ubyte)[] data = null,
uint link = 0, uint info = 0, ulong addralign = 1, ulong entsize = 0,
ulong memSize = 0)Add a section to the ELF file.uint addSegment(uint type, uint flags, uint[] sections, ulong alignment = 0x1000)Add a segment (program header) to the ELF file.ElfBuilder addSymbol(string name, uint sectionIndex, uint binding, uint type,
ulong value = 0, ulong size = 0)Add a symbol to the symbol table.ubyte[] build()Build the ELF file and return the raw byte array.void write(string path)Build the ELF file and write it to a file.uint getSectionCount()Get the number of sections.uint getSegmentCount()Get the number of segments.void updateSectionData(uint index, const(ubyte)[] data)Update the data of an existing section.void removeSegmentAt(uint index)Remove a segment at the specified index.this()Validate the internal state of this builder.SectionEntryInternal representation of a section being constructed by ElfBuilder.SegmentEntryInternal representation of a segment being constructed by ElfBuilder.SymbolEntryInternal representation of a symbol being added to ElfBuilder.Functions 13
bool isElfFile(const(ubyte)[] data) pure nothrow @nogc @safeCheck if the given data represents a valid ELF file.types.ElfClass getElfClass(const(ubyte)[] data)Get the ELF class (32-bit or 64-bit) from ELF data.size_t sectionHeaderSize(types.ElfClass cls)On-disk size of a section header for the given ELF class.size_t programHeaderSize(types.ElfClass cls)On-disk size of a program header for the given ELF class.size_t countSections(const(ubyte)[] data)Count the section headers serialized in a built file.void writeFileHeader32(ubyte[] data, ref const elf32.FileHeader ehdr, io.ElfEndian endian)Write ELF32 file header with endianness handling.void writeFileHeader64(ubyte[] data, ref const elf64.FileHeader ehdr, io.ElfEndian endian)Write ELF64 file header with endianness handling.void writeSectionHeader32(ubyte[] data, size_t pos, ref const elf32.SectionHeader shdr, io.ElfEndian endian)Write ELF32 section header with endianness handling.void writeSectionHeader64(ubyte[] data, size_t pos, ref const elf64.SectionHeader shdr, io.ElfEndian endian)Write ELF64 section header with endianness handling.void writeProgramHeader32(ubyte[] data, size_t pos, ref const elf32.ProgramHeader phdr, io.ElfEndian endian)Write ELF32 program header with endianness handling.void writeProgramHeader64(ubyte[] data, size_t pos, ref const elf64.ProgramHeader phdr, io.ElfEndian endian)Write ELF64 program header with endianness handling.