80 asection *section = (asection *) open_closure;
82 lzma_stream_flags options;
83 gdb_byte footer[LZMA_STREAM_HEADER_SIZE];
86 uint64_t memlimit = UINT64_MAX;
92 if (
size < LZMA_STREAM_HEADER_SIZE
94 || bfd_bread (footer, LZMA_STREAM_HEADER_SIZE,
section->owner)
95 != LZMA_STREAM_HEADER_SIZE
96 || lzma_stream_footer_decode (&options, footer) != LZMA_OK
97 ||
offset < options.backward_size)
99 bfd_set_error (bfd_error_wrong_format);
103 offset -= options.backward_size;
108 || bfd_bread (indexdata, options.backward_size,
section->owner)
109 != options.backward_size
111 indexdata, &pos, options.backward_size)
113 || lzma_index_size (
index) != options.backward_size)
116 bfd_set_error (bfd_error_wrong_format);
133 lzma_pread (
struct bfd *nbfd,
void *stream,
void *buf, file_ptr nbytes,
137 bfd_size_type chunk_size;
138 lzma_index_iter iter;
139 gdb_byte *compressed, *uncompressed;
140 file_ptr block_offset;
141 lzma_filter filters[LZMA_FILTERS_MAX + 1];
143 size_t compressed_pos, uncompressed_pos;
149 if (lstream->
data == NULL
154 lzma_index_iter_init (&iter, lstream->
index);
155 if (lzma_index_iter_locate (&iter,
offset))
159 block_offset =
section->filepos + iter.block.compressed_file_offset;
161 || bfd_bread (compressed, iter.block.total_size,
section->owner)
162 != iter.block.total_size)
171 block.filters = filters;
172 block.header_size = lzma_block_header_size_decode (compressed[0]);
177 xfree (uncompressed);
181 compressed_pos =
block.header_size;
182 uncompressed_pos = 0;
184 compressed, &compressed_pos,
185 iter.block.total_size,
186 uncompressed, &uncompressed_pos,
187 iter.block.uncompressed_size)
191 xfree (uncompressed);
198 lstream->
data = uncompressed;
199 lstream->
data_start = iter.block.uncompressed_file_offset;
200 lstream->
data_end = (iter.block.uncompressed_file_offset
201 + iter.block.uncompressed_size);
204 chunk_size = std::min (nbytes, (file_ptr) lstream->
data_end -
offset);
206 buf = (
gdb_byte *) buf + chunk_size;
208 nbytes -= chunk_size;
244 memset (sb, 0,
sizeof (
struct stat));
245 sb->st_size = lzma_index_uncompressed_size (lstream->
index);
277 if (!bfd_check_format (abfd.
get (), bfd_object))
279 warning (
_(
"Cannot parse .gnu_debugdata section; not a BFD object"));
283 warning (
_(
"Cannot parse .gnu_debugdata section; LZMA support was " 284 "disabled at compile time"));
static file_ptr lzma_pread(struct bfd *nbfd, void *stream, void *buf, file_ptr nbytes, file_ptr offset)
static lzma_allocator gdb_lzma_allocator
void warning(const char *fmt,...)
void * memset(T *s, int c, size_t n)=delete
static void * alloc_lzma(void *opaque, size_t nmemb, size_t size)
gdb_bfd_ref_ptr find_separate_debug_file_in_section(struct objfile *objfile)
static int lzma_stat(struct bfd *abfd, void *stream, struct stat *sb)
static void * lzma_open(struct bfd *nbfd, void *open_closure)
static int lzma_close(struct bfd *nbfd, void *stream)
const char * objfile_name(const struct objfile *objfile)
gdb_bfd_ref_ptr gdb_bfd_openr_iovec(const char *filename, const char *target, void *(*open_func)(struct bfd *nbfd, void *open_closure), void *open_closure, file_ptr(*pread_func)(struct bfd *nbfd, void *stream, void *buf, file_ptr nbytes, file_ptr offset), int(*close_func)(struct bfd *nbfd, void *stream), int(*stat_func)(struct bfd *abfd, void *stream, struct stat *sb))
static void free_lzma(void *opaque, void *ptr)