| ... | @@ -768,6 +768,21 @@ pub const Header = struct { | ... | @@ -768,6 +768,21 @@ pub const Header = struct { |
| 768 | }; | 768 | }; |
| 769 | } | 769 | } |
| 770 | | 770 | |
| | 771 | pub fn iterateDynamicSectionBuffer( |
| | 772 | h: *const Header, |
| | 773 | buf: []const u8, |
| | 774 | offset: u64, |
| | 775 | size: u64, |
| | 776 | ) DynamicSectionBufferIterator { |
| | 777 | return .{ |
| | 778 | .is_64 = h.is_64, |
| | 779 | .endian = h.endian, |
| | 780 | .offset = offset, |
| | 781 | .end_offset = offset + size, |
| | 782 | .buf = buf, |
| | 783 | }; |
| | 784 | } |
| | 785 | |
| 771 | pub const ReadError = Io.Reader.Error || error{ | 786 | pub const ReadError = Io.Reader.Error || error{ |
| 772 | InvalidElfMagic, | 787 | InvalidElfMagic, |
| 773 | InvalidElfVersion, | 788 | InvalidElfVersion, |
| ... | @@ -963,6 +978,23 @@ pub const DynamicSectionIterator = struct { | ... | @@ -963,6 +978,23 @@ pub const DynamicSectionIterator = struct { |
| 963 | } | 978 | } |
| 964 | }; | 979 | }; |
| 965 | | 980 | |
| | 981 | pub const DynamicSectionBufferIterator = struct { |
| | 982 | is_64: bool, |
| | 983 | endian: Endian, |
| | 984 | offset: u64, |
| | 985 | end_offset: u64, |
| | 986 | |
| | 987 | buf: []const u8, |
| | 988 | |
| | 989 | pub fn next(it: *DynamicSectionBufferIterator) !?Elf64_Dyn { |
| | 990 | if (it.offset >= it.end_offset) return null; |
| | 991 | const size: u64 = if (it.is_64) @sizeOf(Elf64_Dyn) else @sizeOf(Elf32_Dyn); |
| | 992 | defer it.offset += size; |
| | 993 | var reader: std.Io.Reader = .fixed(it.buf[it.offset..]); |
| | 994 | return try takeDynamicSection(&reader, it.is_64, it.endian); |
| | 995 | } |
| | 996 | }; |
| | 997 | |
| 966 | pub fn takeDynamicSection(reader: *Io.Reader, is_64: bool, endian: Endian) !Elf64_Dyn { | 998 | pub fn takeDynamicSection(reader: *Io.Reader, is_64: bool, endian: Endian) !Elf64_Dyn { |
| 967 | if (is_64) { | 999 | if (is_64) { |
| 968 | const dyn = try reader.takeStruct(Elf64_Dyn, endian); | 1000 | const dyn = try reader.takeStruct(Elf64_Dyn, endian); |