compress.c revision 1.8 1 1.1 christos /* Compressed section support (intended for debug sections).
2 1.8 christos Copyright (C) 2008-2019 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of BFD, the Binary File Descriptor library.
5 1.1 christos
6 1.1 christos This program is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3 of the License, or
9 1.1 christos (at your option) any later version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful,
12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 christos GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program; if not, write to the Free Software
18 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 1.1 christos MA 02110-1301, USA. */
20 1.1 christos
21 1.1 christos #include "sysdep.h"
22 1.5 christos #include <zlib.h>
23 1.1 christos #include "bfd.h"
24 1.1 christos #include "libbfd.h"
25 1.3 christos #include "safe-ctype.h"
26 1.1 christos
27 1.5 christos #define MAX_COMPRESSION_HEADER_SIZE 24
28 1.5 christos
29 1.1 christos static bfd_boolean
30 1.1 christos decompress_contents (bfd_byte *compressed_buffer,
31 1.1 christos bfd_size_type compressed_size,
32 1.1 christos bfd_byte *uncompressed_buffer,
33 1.1 christos bfd_size_type uncompressed_size)
34 1.1 christos {
35 1.1 christos z_stream strm;
36 1.1 christos int rc;
37 1.1 christos
38 1.1 christos /* It is possible the section consists of several compressed
39 1.1 christos buffers concatenated together, so we uncompress in a loop. */
40 1.5 christos /* PR 18313: The state field in the z_stream structure is supposed
41 1.5 christos to be invisible to the user (ie us), but some compilers will
42 1.5 christos still complain about it being used without initialisation. So
43 1.5 christos we first zero the entire z_stream structure and then set the fields
44 1.5 christos that we need. */
45 1.5 christos memset (& strm, 0, sizeof strm);
46 1.5 christos strm.avail_in = compressed_size;
47 1.5 christos strm.next_in = (Bytef*) compressed_buffer;
48 1.1 christos strm.avail_out = uncompressed_size;
49 1.1 christos
50 1.1 christos BFD_ASSERT (Z_OK == 0);
51 1.1 christos rc = inflateInit (&strm);
52 1.1 christos while (strm.avail_in > 0 && strm.avail_out > 0)
53 1.1 christos {
54 1.1 christos if (rc != Z_OK)
55 1.1 christos break;
56 1.1 christos strm.next_out = ((Bytef*) uncompressed_buffer
57 1.8 christos + (uncompressed_size - strm.avail_out));
58 1.1 christos rc = inflate (&strm, Z_FINISH);
59 1.1 christos if (rc != Z_STREAM_END)
60 1.1 christos break;
61 1.1 christos rc = inflateReset (&strm);
62 1.1 christos }
63 1.1 christos rc |= inflateEnd (&strm);
64 1.1 christos return rc == Z_OK && strm.avail_out == 0;
65 1.1 christos }
66 1.1 christos
67 1.5 christos /* Compress data of the size specified in @var{uncompressed_size}
68 1.5 christos and pointed to by @var{uncompressed_buffer} using zlib and store
69 1.5 christos as the contents field. This function assumes the contents
70 1.5 christos field was allocated using bfd_malloc() or equivalent.
71 1.5 christos
72 1.5 christos Return the uncompressed size if the full section contents is
73 1.5 christos compressed successfully. Otherwise return 0. */
74 1.5 christos
75 1.5 christos static bfd_size_type
76 1.5 christos bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
77 1.5 christos bfd_byte *uncompressed_buffer,
78 1.5 christos bfd_size_type uncompressed_size)
79 1.1 christos {
80 1.1 christos uLong compressed_size;
81 1.5 christos bfd_byte *buffer;
82 1.5 christos bfd_size_type buffer_size;
83 1.5 christos bfd_boolean decompress;
84 1.5 christos int zlib_size = 0;
85 1.5 christos int orig_compression_header_size;
86 1.5 christos bfd_size_type orig_uncompressed_size;
87 1.8 christos unsigned int orig_uncompressed_alignment_pow;
88 1.5 christos int header_size = bfd_get_compression_header_size (abfd, NULL);
89 1.5 christos bfd_boolean compressed
90 1.5 christos = bfd_is_section_compressed_with_header (abfd, sec,
91 1.5 christos &orig_compression_header_size,
92 1.8 christos &orig_uncompressed_size,
93 1.8 christos &orig_uncompressed_alignment_pow);
94 1.5 christos
95 1.5 christos /* Either ELF compression header or the 12-byte, "ZLIB" + 8-byte size,
96 1.5 christos overhead in .zdebug* section. */
97 1.5 christos if (!header_size)
98 1.5 christos header_size = 12;
99 1.5 christos
100 1.5 christos if (compressed)
101 1.5 christos {
102 1.5 christos /* We shouldn't decompress unsupported compressed section. */
103 1.5 christos if (orig_compression_header_size < 0)
104 1.5 christos abort ();
105 1.5 christos
106 1.5 christos /* Different compression schemes. Just move the compressed section
107 1.5 christos contents to the right position. */
108 1.5 christos if (orig_compression_header_size == 0)
109 1.5 christos {
110 1.5 christos /* Convert it from .zdebug* section. Get the uncompressed
111 1.8 christos size first. We need to subtract the 12-byte overhead in
112 1.5 christos .zdebug* section. Set orig_compression_header_size to
113 1.5 christos the 12-bye overhead. */
114 1.5 christos orig_compression_header_size = 12;
115 1.5 christos zlib_size = uncompressed_size - 12;
116 1.5 christos }
117 1.5 christos else
118 1.5 christos {
119 1.5 christos /* Convert it to .zdebug* section. */
120 1.5 christos zlib_size = uncompressed_size - orig_compression_header_size;
121 1.5 christos }
122 1.1 christos
123 1.5 christos /* Add the header size. */
124 1.5 christos compressed_size = zlib_size + header_size;
125 1.5 christos }
126 1.5 christos else
127 1.5 christos compressed_size = compressBound (uncompressed_size) + header_size;
128 1.1 christos
129 1.5 christos /* Uncompress if it leads to smaller size. */
130 1.5 christos if (compressed && compressed_size > orig_uncompressed_size)
131 1.5 christos {
132 1.5 christos decompress = TRUE;
133 1.5 christos buffer_size = orig_uncompressed_size;
134 1.5 christos }
135 1.5 christos else
136 1.5 christos {
137 1.5 christos decompress = FALSE;
138 1.5 christos buffer_size = compressed_size;
139 1.5 christos }
140 1.5 christos buffer = (bfd_byte *) bfd_alloc (abfd, buffer_size);
141 1.5 christos if (buffer == NULL)
142 1.5 christos return 0;
143 1.1 christos
144 1.5 christos if (compressed)
145 1.1 christos {
146 1.5 christos sec->size = orig_uncompressed_size;
147 1.5 christos if (decompress)
148 1.5 christos {
149 1.5 christos if (!decompress_contents (uncompressed_buffer
150 1.5 christos + orig_compression_header_size,
151 1.5 christos zlib_size, buffer, buffer_size))
152 1.5 christos {
153 1.5 christos bfd_set_error (bfd_error_bad_value);
154 1.5 christos bfd_release (abfd, buffer);
155 1.5 christos return 0;
156 1.5 christos }
157 1.5 christos free (uncompressed_buffer);
158 1.8 christos bfd_set_section_alignment (abfd, sec,
159 1.8 christos orig_uncompressed_alignment_pow);
160 1.8 christos
161 1.5 christos sec->contents = buffer;
162 1.5 christos sec->compress_status = COMPRESS_SECTION_DONE;
163 1.5 christos return orig_uncompressed_size;
164 1.5 christos }
165 1.5 christos else
166 1.5 christos {
167 1.5 christos bfd_update_compression_header (abfd, buffer, sec);
168 1.5 christos memmove (buffer + header_size,
169 1.5 christos uncompressed_buffer + orig_compression_header_size,
170 1.5 christos zlib_size);
171 1.5 christos }
172 1.1 christos }
173 1.5 christos else
174 1.5 christos {
175 1.5 christos if (compress ((Bytef*) buffer + header_size,
176 1.5 christos &compressed_size,
177 1.5 christos (const Bytef*) uncompressed_buffer,
178 1.5 christos uncompressed_size) != Z_OK)
179 1.5 christos {
180 1.5 christos bfd_release (abfd, buffer);
181 1.5 christos bfd_set_error (bfd_error_bad_value);
182 1.5 christos return 0;
183 1.5 christos }
184 1.1 christos
185 1.5 christos compressed_size += header_size;
186 1.5 christos /* PR binutils/18087: If compression didn't make the section smaller,
187 1.5 christos just keep it uncompressed. */
188 1.5 christos if (compressed_size < uncompressed_size)
189 1.5 christos bfd_update_compression_header (abfd, buffer, sec);
190 1.5 christos else
191 1.5 christos {
192 1.5 christos /* NOTE: There is a small memory leak here since
193 1.5 christos uncompressed_buffer is malloced and won't be freed. */
194 1.5 christos bfd_release (abfd, buffer);
195 1.5 christos sec->contents = uncompressed_buffer;
196 1.5 christos sec->compress_status = COMPRESS_SECTION_NONE;
197 1.5 christos return uncompressed_size;
198 1.5 christos }
199 1.5 christos }
200 1.1 christos
201 1.5 christos free (uncompressed_buffer);
202 1.5 christos sec->contents = buffer;
203 1.1 christos sec->size = compressed_size;
204 1.1 christos sec->compress_status = COMPRESS_SECTION_DONE;
205 1.1 christos
206 1.5 christos return uncompressed_size;
207 1.1 christos }
208 1.1 christos
209 1.1 christos /*
210 1.1 christos FUNCTION
211 1.1 christos bfd_get_full_section_contents
212 1.1 christos
213 1.1 christos SYNOPSIS
214 1.1 christos bfd_boolean bfd_get_full_section_contents
215 1.1 christos (bfd *abfd, asection *section, bfd_byte **ptr);
216 1.1 christos
217 1.1 christos DESCRIPTION
218 1.1 christos Read all data from @var{section} in BFD @var{abfd}, decompress
219 1.1 christos if needed, and store in @var{*ptr}. If @var{*ptr} is NULL,
220 1.1 christos return @var{*ptr} with memory malloc'd by this function.
221 1.1 christos
222 1.1 christos Return @code{TRUE} if the full section contents is retrieved
223 1.3 christos successfully. If the section has no contents then this function
224 1.3 christos returns @code{TRUE} but @var{*ptr} is set to NULL.
225 1.1 christos */
226 1.1 christos
227 1.1 christos bfd_boolean
228 1.1 christos bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
229 1.1 christos {
230 1.1 christos bfd_size_type sz;
231 1.1 christos bfd_byte *p = *ptr;
232 1.1 christos bfd_boolean ret;
233 1.1 christos bfd_size_type save_size;
234 1.1 christos bfd_size_type save_rawsize;
235 1.1 christos bfd_byte *compressed_buffer;
236 1.5 christos unsigned int compression_header_size;
237 1.1 christos
238 1.1 christos if (abfd->direction != write_direction && sec->rawsize != 0)
239 1.1 christos sz = sec->rawsize;
240 1.1 christos else
241 1.1 christos sz = sec->size;
242 1.1 christos if (sz == 0)
243 1.3 christos {
244 1.3 christos *ptr = NULL;
245 1.3 christos return TRUE;
246 1.3 christos }
247 1.1 christos
248 1.1 christos switch (sec->compress_status)
249 1.1 christos {
250 1.1 christos case COMPRESS_SECTION_NONE:
251 1.1 christos if (p == NULL)
252 1.1 christos {
253 1.1 christos p = (bfd_byte *) bfd_malloc (sz);
254 1.1 christos if (p == NULL)
255 1.7 christos {
256 1.7 christos /* PR 20801: Provide a more helpful error message. */
257 1.7 christos if (bfd_get_error () == bfd_error_no_memory)
258 1.7 christos _bfd_error_handler
259 1.7 christos /* xgettext:c-format */
260 1.8 christos (_("error: %pB(%pA) is too large (%#" PRIx64 " bytes)"),
261 1.8 christos abfd, sec, (uint64_t) sz);
262 1.8 christos return FALSE;
263 1.7 christos }
264 1.1 christos }
265 1.3 christos
266 1.1 christos if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
267 1.1 christos {
268 1.1 christos if (*ptr != p)
269 1.1 christos free (p);
270 1.1 christos return FALSE;
271 1.1 christos }
272 1.1 christos *ptr = p;
273 1.1 christos return TRUE;
274 1.1 christos
275 1.1 christos case DECOMPRESS_SECTION_SIZED:
276 1.1 christos /* Read in the full compressed section contents. */
277 1.1 christos compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size);
278 1.1 christos if (compressed_buffer == NULL)
279 1.1 christos return FALSE;
280 1.1 christos save_rawsize = sec->rawsize;
281 1.1 christos save_size = sec->size;
282 1.1 christos /* Clear rawsize, set size to compressed size and set compress_status
283 1.1 christos to COMPRESS_SECTION_NONE. If the compressed size is bigger than
284 1.1 christos the uncompressed size, bfd_get_section_contents will fail. */
285 1.1 christos sec->rawsize = 0;
286 1.1 christos sec->size = sec->compressed_size;
287 1.1 christos sec->compress_status = COMPRESS_SECTION_NONE;
288 1.1 christos ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
289 1.1 christos 0, sec->compressed_size);
290 1.1 christos /* Restore rawsize and size. */
291 1.1 christos sec->rawsize = save_rawsize;
292 1.1 christos sec->size = save_size;
293 1.1 christos sec->compress_status = DECOMPRESS_SECTION_SIZED;
294 1.1 christos if (!ret)
295 1.1 christos goto fail_compressed;
296 1.1 christos
297 1.1 christos if (p == NULL)
298 1.1 christos p = (bfd_byte *) bfd_malloc (sz);
299 1.1 christos if (p == NULL)
300 1.1 christos goto fail_compressed;
301 1.1 christos
302 1.5 christos compression_header_size = bfd_get_compression_header_size (abfd, sec);
303 1.5 christos if (compression_header_size == 0)
304 1.5 christos /* Set header size to the zlib header size if it is a
305 1.5 christos SHF_COMPRESSED section. */
306 1.5 christos compression_header_size = 12;
307 1.5 christos if (!decompress_contents (compressed_buffer + compression_header_size,
308 1.7 christos sec->compressed_size - compression_header_size, p, sz))
309 1.1 christos {
310 1.1 christos bfd_set_error (bfd_error_bad_value);
311 1.1 christos if (p != *ptr)
312 1.1 christos free (p);
313 1.1 christos fail_compressed:
314 1.1 christos free (compressed_buffer);
315 1.1 christos return FALSE;
316 1.1 christos }
317 1.1 christos
318 1.1 christos free (compressed_buffer);
319 1.1 christos *ptr = p;
320 1.1 christos return TRUE;
321 1.1 christos
322 1.1 christos case COMPRESS_SECTION_DONE:
323 1.3 christos if (sec->contents == NULL)
324 1.3 christos return FALSE;
325 1.1 christos if (p == NULL)
326 1.1 christos {
327 1.1 christos p = (bfd_byte *) bfd_malloc (sz);
328 1.1 christos if (p == NULL)
329 1.1 christos return FALSE;
330 1.1 christos *ptr = p;
331 1.1 christos }
332 1.3 christos /* PR 17512; file: 5bc29788. */
333 1.3 christos if (p != sec->contents)
334 1.3 christos memcpy (p, sec->contents, sz);
335 1.1 christos return TRUE;
336 1.1 christos
337 1.1 christos default:
338 1.1 christos abort ();
339 1.1 christos }
340 1.1 christos }
341 1.1 christos
342 1.1 christos /*
343 1.1 christos FUNCTION
344 1.1 christos bfd_cache_section_contents
345 1.1 christos
346 1.1 christos SYNOPSIS
347 1.1 christos void bfd_cache_section_contents
348 1.1 christos (asection *sec, void *contents);
349 1.1 christos
350 1.1 christos DESCRIPTION
351 1.1 christos Stash @var(contents) so any following reads of @var(sec) do
352 1.1 christos not need to decompress again.
353 1.1 christos */
354 1.1 christos
355 1.1 christos void
356 1.1 christos bfd_cache_section_contents (asection *sec, void *contents)
357 1.1 christos {
358 1.1 christos if (sec->compress_status == DECOMPRESS_SECTION_SIZED)
359 1.1 christos sec->compress_status = COMPRESS_SECTION_DONE;
360 1.1 christos sec->contents = contents;
361 1.1 christos sec->flags |= SEC_IN_MEMORY;
362 1.1 christos }
363 1.1 christos
364 1.1 christos /*
365 1.1 christos FUNCTION
366 1.5 christos bfd_is_section_compressed_with_header
367 1.1 christos
368 1.1 christos SYNOPSIS
369 1.5 christos bfd_boolean bfd_is_section_compressed_with_header
370 1.5 christos (bfd *abfd, asection *section,
371 1.5 christos int *compression_header_size_p,
372 1.8 christos bfd_size_type *uncompressed_size_p,
373 1.8 christos unsigned int *uncompressed_alignment_power_p);
374 1.1 christos
375 1.1 christos DESCRIPTION
376 1.5 christos Return @code{TRUE} if @var{section} is compressed. Compression
377 1.8 christos header size is returned in @var{compression_header_size_p},
378 1.8 christos uncompressed size is returned in @var{uncompressed_size_p}
379 1.8 christos and the uncompressed data alignement power is returned in
380 1.8 christos @var{uncompressed_align_pow_p}. If compression is
381 1.8 christos unsupported, compression header size is returned with -1
382 1.8 christos and uncompressed size is returned with 0.
383 1.1 christos */
384 1.1 christos
385 1.1 christos bfd_boolean
386 1.5 christos bfd_is_section_compressed_with_header (bfd *abfd, sec_ptr sec,
387 1.5 christos int *compression_header_size_p,
388 1.8 christos bfd_size_type *uncompressed_size_p,
389 1.8 christos unsigned int *uncompressed_align_pow_p)
390 1.1 christos {
391 1.5 christos bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
392 1.5 christos int compression_header_size;
393 1.5 christos int header_size;
394 1.1 christos unsigned int saved = sec->compress_status;
395 1.1 christos bfd_boolean compressed;
396 1.1 christos
397 1.8 christos *uncompressed_align_pow_p = 0;
398 1.8 christos
399 1.5 christos compression_header_size = bfd_get_compression_header_size (abfd, sec);
400 1.5 christos if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
401 1.5 christos abort ();
402 1.5 christos header_size = compression_header_size ? compression_header_size : 12;
403 1.5 christos
404 1.1 christos /* Don't decompress the section. */
405 1.1 christos sec->compress_status = COMPRESS_SECTION_NONE;
406 1.1 christos
407 1.5 christos /* Read the header. */
408 1.5 christos if (bfd_get_section_contents (abfd, sec, header, 0, header_size))
409 1.5 christos {
410 1.5 christos if (compression_header_size == 0)
411 1.8 christos /* In this case, it should be "ZLIB" followed by the uncompressed
412 1.5 christos section size, 8 bytes in big-endian order. */
413 1.5 christos compressed = CONST_STRNEQ ((char*) header , "ZLIB");
414 1.5 christos else
415 1.5 christos compressed = TRUE;
416 1.5 christos }
417 1.5 christos else
418 1.3 christos compressed = FALSE;
419 1.3 christos
420 1.5 christos *uncompressed_size_p = sec->size;
421 1.5 christos if (compressed)
422 1.5 christos {
423 1.5 christos if (compression_header_size != 0)
424 1.5 christos {
425 1.5 christos if (!bfd_check_compression_header (abfd, header, sec,
426 1.8 christos uncompressed_size_p,
427 1.8 christos uncompressed_align_pow_p))
428 1.5 christos compression_header_size = -1;
429 1.5 christos }
430 1.5 christos /* Check for the pathalogical case of a debug string section that
431 1.5 christos contains the string ZLIB.... as the first entry. We assume that
432 1.5 christos no uncompressed .debug_str section would ever be big enough to
433 1.5 christos have the first byte of its (big-endian) size be non-zero. */
434 1.5 christos else if (strcmp (sec->name, ".debug_str") == 0
435 1.5 christos && ISPRINT (header[4]))
436 1.5 christos compressed = FALSE;
437 1.5 christos else
438 1.5 christos *uncompressed_size_p = bfd_getb64 (header + 4);
439 1.5 christos }
440 1.5 christos
441 1.1 christos /* Restore compress_status. */
442 1.1 christos sec->compress_status = saved;
443 1.5 christos *compression_header_size_p = compression_header_size;
444 1.1 christos return compressed;
445 1.1 christos }
446 1.1 christos
447 1.1 christos /*
448 1.1 christos FUNCTION
449 1.5 christos bfd_is_section_compressed
450 1.5 christos
451 1.5 christos SYNOPSIS
452 1.5 christos bfd_boolean bfd_is_section_compressed
453 1.5 christos (bfd *abfd, asection *section);
454 1.5 christos
455 1.5 christos DESCRIPTION
456 1.5 christos Return @code{TRUE} if @var{section} is compressed.
457 1.5 christos */
458 1.5 christos
459 1.5 christos bfd_boolean
460 1.5 christos bfd_is_section_compressed (bfd *abfd, sec_ptr sec)
461 1.5 christos {
462 1.5 christos int compression_header_size;
463 1.5 christos bfd_size_type uncompressed_size;
464 1.8 christos unsigned int uncompressed_align_power;
465 1.5 christos return (bfd_is_section_compressed_with_header (abfd, sec,
466 1.5 christos &compression_header_size,
467 1.8 christos &uncompressed_size,
468 1.8 christos &uncompressed_align_power)
469 1.5 christos && compression_header_size >= 0
470 1.5 christos && uncompressed_size > 0);
471 1.5 christos }
472 1.5 christos
473 1.5 christos /*
474 1.5 christos FUNCTION
475 1.1 christos bfd_init_section_decompress_status
476 1.1 christos
477 1.1 christos SYNOPSIS
478 1.1 christos bfd_boolean bfd_init_section_decompress_status
479 1.1 christos (bfd *abfd, asection *section);
480 1.1 christos
481 1.1 christos DESCRIPTION
482 1.1 christos Record compressed section size, update section size with
483 1.1 christos decompressed size and set compress_status to
484 1.1 christos DECOMPRESS_SECTION_SIZED.
485 1.1 christos
486 1.1 christos Return @code{FALSE} if the section is not a valid compressed
487 1.5 christos section. Otherwise, return @code{TRUE}.
488 1.1 christos */
489 1.1 christos
490 1.1 christos bfd_boolean
491 1.5 christos bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
492 1.1 christos {
493 1.5 christos bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
494 1.5 christos int compression_header_size;
495 1.5 christos int header_size;
496 1.1 christos bfd_size_type uncompressed_size;
497 1.8 christos unsigned int uncompressed_alignment_power = 0;
498 1.1 christos
499 1.5 christos compression_header_size = bfd_get_compression_header_size (abfd, sec);
500 1.5 christos if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
501 1.5 christos abort ();
502 1.5 christos header_size = compression_header_size ? compression_header_size : 12;
503 1.5 christos
504 1.5 christos /* Read the header. */
505 1.1 christos if (sec->rawsize != 0
506 1.1 christos || sec->contents != NULL
507 1.1 christos || sec->compress_status != COMPRESS_SECTION_NONE
508 1.5 christos || !bfd_get_section_contents (abfd, sec, header, 0, header_size))
509 1.1 christos {
510 1.1 christos bfd_set_error (bfd_error_invalid_operation);
511 1.1 christos return FALSE;
512 1.1 christos }
513 1.1 christos
514 1.5 christos if (compression_header_size == 0)
515 1.5 christos {
516 1.5 christos /* In this case, it should be "ZLIB" followed by the uncompressed
517 1.5 christos section size, 8 bytes in big-endian order. */
518 1.5 christos if (! CONST_STRNEQ ((char*) header, "ZLIB"))
519 1.5 christos {
520 1.5 christos bfd_set_error (bfd_error_wrong_format);
521 1.5 christos return FALSE;
522 1.5 christos }
523 1.5 christos uncompressed_size = bfd_getb64 (header + 4);
524 1.5 christos }
525 1.5 christos else if (!bfd_check_compression_header (abfd, header, sec,
526 1.8 christos &uncompressed_size,
527 1.8 christos &uncompressed_alignment_power))
528 1.1 christos {
529 1.1 christos bfd_set_error (bfd_error_wrong_format);
530 1.1 christos return FALSE;
531 1.1 christos }
532 1.1 christos
533 1.1 christos sec->compressed_size = sec->size;
534 1.1 christos sec->size = uncompressed_size;
535 1.8 christos bfd_set_section_alignment (abfd, sec, uncompressed_alignment_power);
536 1.1 christos sec->compress_status = DECOMPRESS_SECTION_SIZED;
537 1.1 christos
538 1.1 christos return TRUE;
539 1.1 christos }
540 1.1 christos
541 1.1 christos /*
542 1.1 christos FUNCTION
543 1.1 christos bfd_init_section_compress_status
544 1.1 christos
545 1.1 christos SYNOPSIS
546 1.1 christos bfd_boolean bfd_init_section_compress_status
547 1.1 christos (bfd *abfd, asection *section);
548 1.1 christos
549 1.1 christos DESCRIPTION
550 1.1 christos If open for read, compress section, update section size with
551 1.1 christos compressed size and set compress_status to COMPRESS_SECTION_DONE.
552 1.1 christos
553 1.1 christos Return @code{FALSE} if the section is not a valid compressed
554 1.5 christos section. Otherwise, return @code{TRUE}.
555 1.1 christos */
556 1.1 christos
557 1.1 christos bfd_boolean
558 1.5 christos bfd_init_section_compress_status (bfd *abfd, sec_ptr sec)
559 1.1 christos {
560 1.1 christos bfd_size_type uncompressed_size;
561 1.1 christos bfd_byte *uncompressed_buffer;
562 1.1 christos
563 1.1 christos /* Error if not opened for read. */
564 1.1 christos if (abfd->direction != read_direction
565 1.1 christos || sec->size == 0
566 1.1 christos || sec->rawsize != 0
567 1.1 christos || sec->contents != NULL
568 1.1 christos || sec->compress_status != COMPRESS_SECTION_NONE)
569 1.1 christos {
570 1.1 christos bfd_set_error (bfd_error_invalid_operation);
571 1.1 christos return FALSE;
572 1.1 christos }
573 1.1 christos
574 1.1 christos /* Read in the full section contents and compress it. */
575 1.1 christos uncompressed_size = sec->size;
576 1.1 christos uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
577 1.8 christos /* PR 21431 */
578 1.8 christos if (uncompressed_buffer == NULL)
579 1.8 christos return FALSE;
580 1.8 christos
581 1.1 christos if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer,
582 1.1 christos 0, uncompressed_size))
583 1.8 christos return FALSE;
584 1.1 christos
585 1.8 christos uncompressed_size = bfd_compress_section_contents (abfd, sec,
586 1.8 christos uncompressed_buffer,
587 1.8 christos uncompressed_size);
588 1.8 christos return uncompressed_size != 0;
589 1.5 christos }
590 1.5 christos
591 1.5 christos /*
592 1.5 christos FUNCTION
593 1.5 christos bfd_compress_section
594 1.5 christos
595 1.5 christos SYNOPSIS
596 1.5 christos bfd_boolean bfd_compress_section
597 1.5 christos (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer);
598 1.5 christos
599 1.5 christos DESCRIPTION
600 1.5 christos If open for write, compress section, update section size with
601 1.5 christos compressed size and set compress_status to COMPRESS_SECTION_DONE.
602 1.5 christos
603 1.5 christos Return @code{FALSE} if compression fail. Otherwise, return
604 1.5 christos @code{TRUE}.
605 1.5 christos */
606 1.5 christos
607 1.5 christos bfd_boolean
608 1.5 christos bfd_compress_section (bfd *abfd, sec_ptr sec, bfd_byte *uncompressed_buffer)
609 1.5 christos {
610 1.5 christos bfd_size_type uncompressed_size = sec->size;
611 1.5 christos
612 1.5 christos /* Error if not opened for write. */
613 1.5 christos if (abfd->direction != write_direction
614 1.5 christos || uncompressed_size == 0
615 1.5 christos || uncompressed_buffer == NULL
616 1.5 christos || sec->contents != NULL
617 1.5 christos || sec->compressed_size != 0
618 1.5 christos || sec->compress_status != COMPRESS_SECTION_NONE)
619 1.5 christos {
620 1.5 christos bfd_set_error (bfd_error_invalid_operation);
621 1.5 christos return FALSE;
622 1.5 christos }
623 1.5 christos
624 1.5 christos /* Compress it. */
625 1.5 christos return bfd_compress_section_contents (abfd, sec, uncompressed_buffer,
626 1.5 christos uncompressed_size) != 0;
627 1.1 christos }
628