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 4

structElfFile

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.

Fields
const(ubyte)[] _data
bool _owned
io.ElfEndian _endian
bool _ehdrCached
Methods
ElfFile opAssign(ref ElfFile other) refAssignment operator.
types.ElfClass elfClass() pure nothrow @nogc @safe constGet the ELF class (32-bit or 64-bit).
io.ElfEndian endian() pure nothrow @nogc @safe constGet the ELF endianness.
const(ubyte)[] getRawData() pure nothrow @nogc @safe constGet the raw ELF file data.
const(ubyte)[] getDataSlice(size_t offset, size_t size) constGet a slice of the ELF file data.
const(gelf.FileHeader) getEhdr()Get the GELF file header.
elf32.FileHeader getEhdr32()Get the ELF32 file header.
elf64.FileHeader getEhdr64()Get the ELF64 file header.
auto getSectionHeaders()Get a range for iterating over section headers.
auto getProgramHeaders()Get a range for iterating over program headers.
void _detectMetadata()Detect ELF metadata (class and endianness) from data.
void _loadEhdr()Load and cache the ELF header.
Constructors
this()Default constructor - creates an empty ElfFile.
this(const(ubyte)[] data)Constructor from byte array (non-owned reference).
this(ubyte[] data)Constructor from owned byte array (takes ownership).
this(string path)Constructor from file path.
this(File file)Constructor from std.stdio.File.
this(ref ElfFile other)Copy constructor.
Destructors
~thisDestructor - releases owned data.

Section range for ElfFile.

Provides input range interface for iterating over sections.

Fields
ElfFile _file
Methods
bool empty() @property constCheck if the range is empty.
@property auto front()Get the current section header.
void popFront()Advance to the next section.
typeof(this) save() @propertySave the current position.
Constructors
this(ElfFile file, io.StructRange!(gelf.SectionHeader) headerRange)Constructor.

Program range for ElfFile.

Provides input range interface for iterating over program headers.

Fields
ElfFile _file
Methods
bool empty() @property constCheck if the range is empty.
@property auto front()Get the current program header.
void popFront()Advance to the next program header.
typeof(this) save() @propertySave the current position.
Constructors
this(ElfFile file, io.StructRange!(gelf.ProgramHeader) 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.

Fields
io.ElfEndian _endian
ulong _entry
uint _flags
SectionEntry[] _sections
SegmentEntry[] _segments
SymbolEntry[] _symbols
uint _phnum
Methods
ElfBuilder create(types.ElfClass class_, io.ElfEndian endian)Create 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 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)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.
void write(File file)Build the ELF file and write it to an open 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.
Constructors
this()Private constructor to ensure factory method usage.
Nested Templates
SectionEntry
SegmentEntry
SymbolEntry

Functions 12

fnbool isElfFile(const(ubyte)[] data) pure nothrow @nogc @safeCheck if the given data represents a valid ELF file.
fntypes.ElfClass getElfClass(const(ubyte)[] data)Get the ELF class (32-bit or 64-bit) from ELF data.
fntypes.ElfData getElfEndian(const(ubyte)[] data)Get the ELF endianness from ELF data.
fnbool validateElfHeader(const ref gelf.FileHeader hdr)Validate an ELF file header.
private fnuint toSegmentType32(uint type)Convert segment type to 32-bit format.
private fnuint toSegmentFlags32(uint flags)Convert segment flags to 32-bit format.
private fnvoid writeFileHeader32(ubyte[] data, ref const elf32.FileHeader ehdr, io.ElfEndian endian)Write ELF32 file header with endianness handling.
private fnvoid writeFileHeader64(ubyte[] data, ref const elf64.FileHeader ehdr, io.ElfEndian endian)Write ELF64 file header with endianness handling.
private fnvoid writeSectionHeader32(ubyte[] data, size_t pos, ref const elf32.SectionHeader shdr, io.ElfEndian endian)Write ELF32 section header with endianness handling.
private fnvoid writeSectionHeader64(ubyte[] data, size_t pos, ref const elf64.SectionHeader shdr, io.ElfEndian endian)Write ELF64 section header with endianness handling.
private fnvoid writeProgramHeader32(ubyte[] data, size_t pos, ref const elf32.ProgramHeader phdr, io.ElfEndian endian)Write ELF32 program header with endianness handling.
private fnvoid writeProgramHeader64(ubyte[] data, size_t pos, ref const elf64.ProgramHeader phdr, io.ElfEndian endian)Write ELF64 program header with endianness handling.