91 bfd_size_type
size, offset;
92 lzma_stream_flags options;
93 gdb_byte footer[LZMA_STREAM_HEADER_SIZE];
95 uint64_t memlimit = UINT64_MAX;
100 offset =
section->filepos +
size - LZMA_STREAM_HEADER_SIZE;
101 if (
size < LZMA_STREAM_HEADER_SIZE
103 || bfd_read (footer, LZMA_STREAM_HEADER_SIZE,
section->owner)
104 != LZMA_STREAM_HEADER_SIZE
105 || lzma_stream_footer_decode (&options, footer) != LZMA_OK
106 || offset < options.backward_size)
108 bfd_set_error (bfd_error_wrong_format);
112 offset -= options.backward_size;
113 gdb::byte_vector indexdata (options.backward_size);
117 || bfd_read (indexdata.data (), options.backward_size,
section->owner)
118 != options.backward_size
120 indexdata.data (), &pos,
121 options.backward_size)
123 || lzma_index_size (
index) != options.backward_size)
125 bfd_set_error (bfd_error_wrong_format);
143 bfd_size_type chunk_size;
144 lzma_index_iter iter;
145 file_ptr block_offset;
146 lzma_filter filters[LZMA_FILTERS_MAX + 1];
148 size_t compressed_pos, uncompressed_pos;
156 lzma_index_iter_init (&iter,
index);
157 if (lzma_index_iter_locate (&iter, offset))
160 gdb::byte_vector compressed (iter.block.total_size);
161 block_offset =
section->filepos + iter.block.compressed_file_offset;
163 || bfd_read (compressed.data (), iter.block.total_size,
164 section->owner) != iter.block.total_size)
167 gdb::byte_vector uncompressed (iter.block.uncompressed_size);
170 block.filters = filters;
171 block.header_size = lzma_block_header_size_decode (compressed[0]);
177 compressed_pos =
block.header_size;
178 uncompressed_pos = 0;
180 compressed.data (), &compressed_pos,
181 iter.block.total_size,
182 uncompressed.data (),
184 iter.block.uncompressed_size)
188 data = std::move (uncompressed);
189 data_start = iter.block.uncompressed_file_offset;
190 data_end = (iter.block.uncompressed_file_offset
191 + iter.block.uncompressed_size);
194 chunk_size = std::min (nbytes, (file_ptr)
data_end - offset);
196 buf = (gdb_byte *) buf + chunk_size;
197 offset += chunk_size;
198 nbytes -= chunk_size;