diff --git a/lib/std/elf.zig b/lib/std/elf.zig index 163bbf283c..935507a192 100644 --- a/lib/std/elf.zig +++ b/lib/std/elf.zig @@ -768,6 +768,21 @@ pub const Header = struct { }; } + pub fn iterateDynamicSectionBuffer( + h: *const Header, + buf: []const u8, + offset: u64, + size: u64, + ) DynamicSectionBufferIterator { + return .{ + .is_64 = h.is_64, + .endian = h.endian, + .offset = offset, + .end_offset = offset + size, + .buf = buf, + }; + } + pub const ReadError = Io.Reader.Error || error{ InvalidElfMagic, InvalidElfVersion, @@ -963,6 +978,23 @@ pub const DynamicSectionIterator = struct { } }; +pub const DynamicSectionBufferIterator = struct { + is_64: bool, + endian: Endian, + offset: u64, + end_offset: u64, + + buf: []const u8, + + pub fn next(it: *DynamicSectionBufferIterator) !?Elf64_Dyn { + if (it.offset >= it.end_offset) return null; + const size: u64 = if (it.is_64) @sizeOf(Elf64_Dyn) else @sizeOf(Elf32_Dyn); + defer it.offset += size; + var reader: std.Io.Reader = .fixed(it.buf[it.offset..]); + return try takeDynamicSection(&reader, it.is_64, it.endian); + } +}; + pub fn takeDynamicSection(reader: *Io.Reader, is_64: bool, endian: Endian) !Elf64_Dyn { if (is_64) { const dyn = try reader.takeStruct(Elf64_Dyn, endian);