79 asection *section = open_closure;
81 lzma_stream_flags options;
82 gdb_byte footer[LZMA_STREAM_HEADER_SIZE];
86 uint64_t memlimit = UINT64_MAX;
90 size = bfd_get_section_size (section);
91 offset = section->filepos + size - LZMA_STREAM_HEADER_SIZE;
92 if (size < LZMA_STREAM_HEADER_SIZE
93 || bfd_seek (section->owner, offset,
SEEK_SET) != 0
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;
104 indexdata =
xmalloc (options.backward_size);
107 if (bfd_seek (section->owner, offset,
SEEK_SET) != 0
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))
158 compressed =
xmalloc (iter.block.total_size);
159 block_offset = section->filepos + iter.block.compressed_file_offset;
160 if (bfd_seek (section->owner, block_offset,
SEEK_SET) != 0
161 || bfd_bread (compressed, iter.block.total_size, section->owner)
162 != iter.block.total_size)
168 uncompressed =
xmalloc (iter.block.uncompressed_size);
170 memset (&block, 0,
sizeof (block));
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 =
min (nbytes, lstream->
data_end - offset);
205 memcpy (buf, lstream->
data + offset - lstream->
data_start, chunk_size);
206 buf = (
gdb_byte *) buf + chunk_size;
207 offset += chunk_size;
208 nbytes -= chunk_size;
244 memset (sb, 0,
sizeof (
struct stat));
245 sb->st_size = lzma_index_uncompressed_size (lstream->
index);
264 if (objfile->
obfd == NULL)
267 section = bfd_get_section_by_name (objfile->
obfd,
".gnu_debugdata");
277 if (!bfd_check_format (abfd, bfd_object))
279 warning (
_(
"Cannot parse .gnu_debugdata section; not a BFD object"));
284 warning (
_(
"Cannot parse .gnu_debugdata section; LZMA support was "
285 "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,...)
static void * alloc_lzma(void *opaque, size_t nmemb, size_t size)
static int lzma_stat(struct bfd *abfd, void *stream, struct stat *sb)
bfd * find_separate_debug_file_in_section(struct objfile *objfile)
static void * lzma_open(struct bfd *nbfd, void *open_closure)
void gdb_bfd_unref(struct bfd *abfd)
void * xzalloc(size_t size)
static int lzma_close(struct bfd *nbfd, void *stream)
bfd * 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))
const char * objfile_name(const struct objfile *objfile)
static void free_lzma(void *opaque, void *ptr)