xref: /dflybsd-src/contrib/gdb-7/bfd/compress.c (revision a45ae5f869d9cfcb3e41dbab486e10bfa9e336bf)
1cf7f2e2dSJohn Marino /* Compressed section support (intended for debug sections).
2*a45ae5f8SJohn Marino    Copyright 2008, 2010, 2011
35796c8dcSSimon Schubert    Free Software Foundation, Inc.
45796c8dcSSimon Schubert 
55796c8dcSSimon Schubert    This file is part of BFD, the Binary File Descriptor library.
65796c8dcSSimon Schubert 
75796c8dcSSimon Schubert    This program is free software; you can redistribute it and/or modify
85796c8dcSSimon Schubert    it under the terms of the GNU General Public License as published by
95796c8dcSSimon Schubert    the Free Software Foundation; either version 3 of the License, or
105796c8dcSSimon Schubert    (at your option) any later version.
115796c8dcSSimon Schubert 
125796c8dcSSimon Schubert    This program is distributed in the hope that it will be useful,
135796c8dcSSimon Schubert    but WITHOUT ANY WARRANTY; without even the implied warranty of
145796c8dcSSimon Schubert    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
155796c8dcSSimon Schubert    GNU General Public License for more details.
165796c8dcSSimon Schubert 
175796c8dcSSimon Schubert    You should have received a copy of the GNU General Public License
185796c8dcSSimon Schubert    along with this program; if not, write to the Free Software
195796c8dcSSimon Schubert    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
205796c8dcSSimon Schubert    MA 02110-1301, USA.  */
215796c8dcSSimon Schubert 
225796c8dcSSimon Schubert #include "config.h"
235796c8dcSSimon Schubert #include "sysdep.h"
245796c8dcSSimon Schubert #include "bfd.h"
255796c8dcSSimon Schubert #include "libbfd.h"
265796c8dcSSimon Schubert #ifdef HAVE_ZLIB_H
275796c8dcSSimon Schubert #include <zlib.h>
285796c8dcSSimon Schubert #endif
295796c8dcSSimon Schubert 
30c50c785cSJohn Marino #ifdef HAVE_ZLIB_H
31c50c785cSJohn Marino static bfd_boolean
32c50c785cSJohn Marino decompress_contents (bfd_byte *compressed_buffer,
33c50c785cSJohn Marino 		     bfd_size_type compressed_size,
34c50c785cSJohn Marino 		     bfd_byte *uncompressed_buffer,
35c50c785cSJohn Marino 		     bfd_size_type uncompressed_size)
36c50c785cSJohn Marino {
37c50c785cSJohn Marino   z_stream strm;
38c50c785cSJohn Marino   int rc;
39c50c785cSJohn Marino 
40c50c785cSJohn Marino   /* It is possible the section consists of several compressed
41c50c785cSJohn Marino      buffers concatenated together, so we uncompress in a loop.  */
42c50c785cSJohn Marino   strm.zalloc = NULL;
43c50c785cSJohn Marino   strm.zfree = NULL;
44c50c785cSJohn Marino   strm.opaque = NULL;
45c50c785cSJohn Marino   strm.avail_in = compressed_size - 12;
46c50c785cSJohn Marino   strm.next_in = (Bytef*) compressed_buffer + 12;
47c50c785cSJohn Marino   strm.avail_out = uncompressed_size;
48c50c785cSJohn Marino 
49c50c785cSJohn Marino   rc = inflateInit (&strm);
50c50c785cSJohn Marino   while (strm.avail_in > 0)
51c50c785cSJohn Marino     {
52c50c785cSJohn Marino       if (rc != Z_OK)
53c50c785cSJohn Marino 	return FALSE;
54c50c785cSJohn Marino       strm.next_out = ((Bytef*) uncompressed_buffer
55c50c785cSJohn Marino                        + (uncompressed_size - strm.avail_out));
56c50c785cSJohn Marino       rc = inflate (&strm, Z_FINISH);
57c50c785cSJohn Marino       if (rc != Z_STREAM_END)
58c50c785cSJohn Marino 	return FALSE;
59c50c785cSJohn Marino       rc = inflateReset (&strm);
60c50c785cSJohn Marino     }
61c50c785cSJohn Marino   rc = inflateEnd (&strm);
62c50c785cSJohn Marino   return rc == Z_OK && strm.avail_out == 0;
63c50c785cSJohn Marino }
64c50c785cSJohn Marino #endif
65c50c785cSJohn Marino 
665796c8dcSSimon Schubert /*
675796c8dcSSimon Schubert FUNCTION
68c50c785cSJohn Marino 	bfd_compress_section_contents
695796c8dcSSimon Schubert 
705796c8dcSSimon Schubert SYNOPSIS
71c50c785cSJohn Marino 	bfd_boolean bfd_compress_section_contents
72c50c785cSJohn Marino 	  (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer,
73c50c785cSJohn Marino 	   bfd_size_type uncompressed_size);
745796c8dcSSimon Schubert 
755796c8dcSSimon Schubert DESCRIPTION
765796c8dcSSimon Schubert 
77c50c785cSJohn Marino 	Compress data of the size specified in @var{uncompressed_size}
78c50c785cSJohn Marino 	and pointed to by @var{uncompressed_buffer} using zlib and store
79c50c785cSJohn Marino 	as the contents field.  This function assumes the contents
80c50c785cSJohn Marino 	field was allocated using bfd_malloc() or equivalent.  If zlib
81c50c785cSJohn Marino 	is not installed on this machine, the input is unmodified.
825796c8dcSSimon Schubert 
83c50c785cSJohn Marino 	Return @code{TRUE} if the full section contents is compressed
84c50c785cSJohn Marino 	successfully.
855796c8dcSSimon Schubert */
865796c8dcSSimon Schubert 
875796c8dcSSimon Schubert bfd_boolean
88c50c785cSJohn Marino bfd_compress_section_contents (bfd *abfd ATTRIBUTE_UNUSED,
89c50c785cSJohn Marino 			       sec_ptr sec ATTRIBUTE_UNUSED,
90c50c785cSJohn Marino 			       bfd_byte *uncompressed_buffer ATTRIBUTE_UNUSED,
91c50c785cSJohn Marino 			       bfd_size_type uncompressed_size ATTRIBUTE_UNUSED)
925796c8dcSSimon Schubert {
935796c8dcSSimon Schubert #ifndef HAVE_ZLIB_H
94c50c785cSJohn Marino   bfd_set_error (bfd_error_invalid_operation);
955796c8dcSSimon Schubert   return FALSE;
965796c8dcSSimon Schubert #else
97c50c785cSJohn Marino   uLong compressed_size;
98c50c785cSJohn Marino   bfd_byte *compressed_buffer;
99c50c785cSJohn Marino 
100c50c785cSJohn Marino   compressed_size = compressBound (uncompressed_size) + 12;
101c50c785cSJohn Marino   compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size);
102c50c785cSJohn Marino 
103c50c785cSJohn Marino   if (compressed_buffer == NULL)
104c50c785cSJohn Marino     return FALSE;
105c50c785cSJohn Marino 
106c50c785cSJohn Marino   if (compress ((Bytef*) compressed_buffer + 12,
107c50c785cSJohn Marino 		&compressed_size,
108c50c785cSJohn Marino 		(const Bytef*) uncompressed_buffer,
109c50c785cSJohn Marino 		uncompressed_size) != Z_OK)
110c50c785cSJohn Marino     {
111c50c785cSJohn Marino       free (compressed_buffer);
112c50c785cSJohn Marino       bfd_set_error (bfd_error_bad_value);
113c50c785cSJohn Marino       return FALSE;
114c50c785cSJohn Marino     }
115c50c785cSJohn Marino 
116c50c785cSJohn Marino   /* Write the zlib header.  In this case, it should be "ZLIB" followed
117c50c785cSJohn Marino      by the uncompressed section size, 8 bytes in big-endian order.  */
118c50c785cSJohn Marino   memcpy (compressed_buffer, "ZLIB", 4);
119c50c785cSJohn Marino   compressed_buffer[11] = uncompressed_size; uncompressed_size >>= 8;
120c50c785cSJohn Marino   compressed_buffer[10] = uncompressed_size; uncompressed_size >>= 8;
121c50c785cSJohn Marino   compressed_buffer[9] = uncompressed_size; uncompressed_size >>= 8;
122c50c785cSJohn Marino   compressed_buffer[8] = uncompressed_size; uncompressed_size >>= 8;
123c50c785cSJohn Marino   compressed_buffer[7] = uncompressed_size; uncompressed_size >>= 8;
124c50c785cSJohn Marino   compressed_buffer[6] = uncompressed_size; uncompressed_size >>= 8;
125c50c785cSJohn Marino   compressed_buffer[5] = uncompressed_size; uncompressed_size >>= 8;
126c50c785cSJohn Marino   compressed_buffer[4] = uncompressed_size;
127c50c785cSJohn Marino   compressed_size += 12;
128c50c785cSJohn Marino 
129c50c785cSJohn Marino   /* Free the uncompressed contents if we compress in place.  */
130c50c785cSJohn Marino   if (uncompressed_buffer == sec->contents)
131c50c785cSJohn Marino     free (uncompressed_buffer);
132c50c785cSJohn Marino 
133c50c785cSJohn Marino   sec->contents = compressed_buffer;
134c50c785cSJohn Marino   sec->size = compressed_size;
135c50c785cSJohn Marino   sec->compress_status = COMPRESS_SECTION_DONE;
136c50c785cSJohn Marino 
137c50c785cSJohn Marino   return TRUE;
138c50c785cSJohn Marino #endif  /* HAVE_ZLIB_H */
139c50c785cSJohn Marino }
140c50c785cSJohn Marino 
141c50c785cSJohn Marino /*
142c50c785cSJohn Marino FUNCTION
143c50c785cSJohn Marino 	bfd_get_full_section_contents
144c50c785cSJohn Marino 
145c50c785cSJohn Marino SYNOPSIS
146c50c785cSJohn Marino 	bfd_boolean bfd_get_full_section_contents
147c50c785cSJohn Marino 	  (bfd *abfd, asection *section, bfd_byte **ptr);
148c50c785cSJohn Marino 
149c50c785cSJohn Marino DESCRIPTION
150c50c785cSJohn Marino 	Read all data from @var{section} in BFD @var{abfd}, decompress
151c50c785cSJohn Marino 	if needed, and store in @var{*ptr}.  If @var{*ptr} is NULL,
152c50c785cSJohn Marino 	return @var{*ptr} with memory malloc'd by this function.
153c50c785cSJohn Marino 
154c50c785cSJohn Marino 	Return @code{TRUE} if the full section contents is retrieved
155c50c785cSJohn Marino 	successfully.
156c50c785cSJohn Marino */
157c50c785cSJohn Marino 
158c50c785cSJohn Marino bfd_boolean
159c50c785cSJohn Marino bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
160c50c785cSJohn Marino {
161*a45ae5f8SJohn Marino   bfd_size_type sz;
162c50c785cSJohn Marino   bfd_byte *p = *ptr;
163c50c785cSJohn Marino #ifdef HAVE_ZLIB_H
164c50c785cSJohn Marino   bfd_boolean ret;
165c50c785cSJohn Marino   bfd_size_type compressed_size;
1665796c8dcSSimon Schubert   bfd_size_type uncompressed_size;
167c50c785cSJohn Marino   bfd_size_type rawsize;
168c50c785cSJohn Marino   bfd_byte *compressed_buffer;
1695796c8dcSSimon Schubert   bfd_byte *uncompressed_buffer;
170c50c785cSJohn Marino #endif
171c50c785cSJohn Marino 
172*a45ae5f8SJohn Marino   if (abfd->direction != write_direction && sec->rawsize != 0)
173*a45ae5f8SJohn Marino     sz = sec->rawsize;
174*a45ae5f8SJohn Marino   else
175*a45ae5f8SJohn Marino     sz = sec->size;
176c50c785cSJohn Marino   if (sz == 0)
177c50c785cSJohn Marino     return TRUE;
178c50c785cSJohn Marino 
179c50c785cSJohn Marino   switch (sec->compress_status)
180c50c785cSJohn Marino     {
181c50c785cSJohn Marino     case COMPRESS_SECTION_NONE:
182c50c785cSJohn Marino       if (p == NULL)
183c50c785cSJohn Marino 	{
184c50c785cSJohn Marino 	  p = (bfd_byte *) bfd_malloc (sz);
185c50c785cSJohn Marino 	  if (p == NULL)
186c50c785cSJohn Marino 	    return FALSE;
187c50c785cSJohn Marino 	}
188c50c785cSJohn Marino       if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
189c50c785cSJohn Marino 	{
190c50c785cSJohn Marino 	  if (*ptr != p)
191c50c785cSJohn Marino 	    free (p);
192c50c785cSJohn Marino 	  return FALSE;
193c50c785cSJohn Marino 	}
194c50c785cSJohn Marino       *ptr = p;
195c50c785cSJohn Marino       return TRUE;
196c50c785cSJohn Marino 
197c50c785cSJohn Marino     case DECOMPRESS_SECTION_SIZED:
198c50c785cSJohn Marino #ifndef HAVE_ZLIB_H
199c50c785cSJohn Marino       bfd_set_error (bfd_error_invalid_operation);
200c50c785cSJohn Marino       return FALSE;
201c50c785cSJohn Marino #else
202c50c785cSJohn Marino       /* Read in the full compressed section contents.  */
203c50c785cSJohn Marino       uncompressed_size = sec->size;
204c50c785cSJohn Marino       compressed_size = sec->compressed_size;
205c50c785cSJohn Marino       compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size);
206c50c785cSJohn Marino       if (compressed_buffer == NULL)
207c50c785cSJohn Marino 	return FALSE;
208c50c785cSJohn Marino       rawsize = sec->rawsize;
209c50c785cSJohn Marino       /* Clear rawsize, set size to compressed size and set compress_status
210c50c785cSJohn Marino 	 to COMPRESS_SECTION_NONE.  If the compressed size is bigger than
211c50c785cSJohn Marino 	 the uncompressed size, bfd_get_section_contents will fail.  */
212c50c785cSJohn Marino       sec->rawsize = 0;
213c50c785cSJohn Marino       sec->size = compressed_size;
214c50c785cSJohn Marino       sec->compress_status = COMPRESS_SECTION_NONE;
215c50c785cSJohn Marino       ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
216c50c785cSJohn Marino 				      0, compressed_size);
217c50c785cSJohn Marino       /* Restore rawsize and size.  */
218c50c785cSJohn Marino       sec->rawsize = rawsize;
219c50c785cSJohn Marino       sec->size = uncompressed_size;
220c50c785cSJohn Marino       sec->compress_status = DECOMPRESS_SECTION_SIZED;
221c50c785cSJohn Marino       if (!ret)
222c50c785cSJohn Marino 	goto fail_compressed;
223c50c785cSJohn Marino 
224c50c785cSJohn Marino       uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
225c50c785cSJohn Marino       if (uncompressed_buffer == NULL)
226c50c785cSJohn Marino 	goto fail_compressed;
227c50c785cSJohn Marino 
228c50c785cSJohn Marino       if (!decompress_contents (compressed_buffer, compressed_size,
229c50c785cSJohn Marino 				uncompressed_buffer, uncompressed_size))
230c50c785cSJohn Marino 	{
231c50c785cSJohn Marino 	  bfd_set_error (bfd_error_bad_value);
232c50c785cSJohn Marino 	  free (uncompressed_buffer);
233c50c785cSJohn Marino 	fail_compressed:
234c50c785cSJohn Marino 	  free (compressed_buffer);
235c50c785cSJohn Marino 	  return FALSE;
236c50c785cSJohn Marino 	}
237c50c785cSJohn Marino 
238c50c785cSJohn Marino       free (compressed_buffer);
239c50c785cSJohn Marino       sec->contents = uncompressed_buffer;
240c50c785cSJohn Marino       sec->compress_status = COMPRESS_SECTION_DONE;
241c50c785cSJohn Marino       /* Fall thru */
242c50c785cSJohn Marino #endif
243c50c785cSJohn Marino 
244c50c785cSJohn Marino     case COMPRESS_SECTION_DONE:
245c50c785cSJohn Marino       if (p == NULL)
246c50c785cSJohn Marino 	{
247c50c785cSJohn Marino 	  p = (bfd_byte *) bfd_malloc (sz);
248c50c785cSJohn Marino 	  if (p == NULL)
249c50c785cSJohn Marino 	    return FALSE;
250c50c785cSJohn Marino 	  *ptr = p;
251c50c785cSJohn Marino 	}
252c50c785cSJohn Marino       memcpy (p, sec->contents, sz);
253c50c785cSJohn Marino       return TRUE;
254c50c785cSJohn Marino 
255c50c785cSJohn Marino     default:
256c50c785cSJohn Marino       abort ();
257c50c785cSJohn Marino     }
258c50c785cSJohn Marino }
259c50c785cSJohn Marino 
260c50c785cSJohn Marino /*
261c50c785cSJohn Marino FUNCTION
262c50c785cSJohn Marino 	bfd_is_section_compressed
263c50c785cSJohn Marino 
264c50c785cSJohn Marino SYNOPSIS
265c50c785cSJohn Marino 	bfd_boolean bfd_is_section_compressed
266c50c785cSJohn Marino 	  (bfd *abfd, asection *section);
267c50c785cSJohn Marino 
268c50c785cSJohn Marino DESCRIPTION
269c50c785cSJohn Marino 	Return @code{TRUE} if @var{section} is compressed.
270c50c785cSJohn Marino */
271c50c785cSJohn Marino 
272c50c785cSJohn Marino bfd_boolean
273c50c785cSJohn Marino bfd_is_section_compressed (bfd *abfd, sec_ptr sec)
274c50c785cSJohn Marino {
275c50c785cSJohn Marino   bfd_byte compressed_buffer [12];
2765796c8dcSSimon Schubert 
2775796c8dcSSimon Schubert   /* Read the zlib header.  In this case, it should be "ZLIB" followed
2785796c8dcSSimon Schubert      by the uncompressed section size, 8 bytes in big-endian order.  */
279c50c785cSJohn Marino   return (bfd_get_section_contents (abfd, sec, compressed_buffer, 0, 12)
280c50c785cSJohn Marino 	  && CONST_STRNEQ ((char*) compressed_buffer, "ZLIB"));
281c50c785cSJohn Marino }
282c50c785cSJohn Marino 
283c50c785cSJohn Marino /*
284c50c785cSJohn Marino FUNCTION
285c50c785cSJohn Marino 	bfd_init_section_decompress_status
286c50c785cSJohn Marino 
287c50c785cSJohn Marino SYNOPSIS
288c50c785cSJohn Marino 	bfd_boolean bfd_init_section_decompress_status
289c50c785cSJohn Marino 	  (bfd *abfd, asection *section);
290c50c785cSJohn Marino 
291c50c785cSJohn Marino DESCRIPTION
292c50c785cSJohn Marino 	Record compressed section size, update section size with
293c50c785cSJohn Marino 	decompressed size and set compress_status to
294c50c785cSJohn Marino 	DECOMPRESS_SECTION_SIZED.
295c50c785cSJohn Marino 
296c50c785cSJohn Marino 	Return @code{FALSE} if the section is not a valid compressed
297c50c785cSJohn Marino 	section or zlib is not installed on this machine.  Otherwise,
298c50c785cSJohn Marino 	return @code{TRUE}.
299c50c785cSJohn Marino */
300c50c785cSJohn Marino 
301c50c785cSJohn Marino bfd_boolean
302c50c785cSJohn Marino bfd_init_section_decompress_status (bfd *abfd ATTRIBUTE_UNUSED,
303c50c785cSJohn Marino 				    sec_ptr sec ATTRIBUTE_UNUSED)
304c50c785cSJohn Marino {
305c50c785cSJohn Marino #ifndef HAVE_ZLIB_H
306c50c785cSJohn Marino   bfd_set_error (bfd_error_invalid_operation);
3075796c8dcSSimon Schubert   return FALSE;
308c50c785cSJohn Marino #else
309c50c785cSJohn Marino   bfd_byte compressed_buffer [12];
310c50c785cSJohn Marino   bfd_size_type uncompressed_size;
311c50c785cSJohn Marino 
312c50c785cSJohn Marino   if (sec->rawsize != 0
313c50c785cSJohn Marino       || sec->contents != NULL
314c50c785cSJohn Marino       || sec->compress_status != COMPRESS_SECTION_NONE
315c50c785cSJohn Marino       || !bfd_get_section_contents (abfd, sec, compressed_buffer, 0, 12))
316c50c785cSJohn Marino     {
317c50c785cSJohn Marino       bfd_set_error (bfd_error_invalid_operation);
318c50c785cSJohn Marino       return FALSE;
319c50c785cSJohn Marino     }
320c50c785cSJohn Marino 
321c50c785cSJohn Marino   /* Read the zlib header.  In this case, it should be "ZLIB" followed
322c50c785cSJohn Marino      by the uncompressed section size, 8 bytes in big-endian order.  */
323c50c785cSJohn Marino   if (! CONST_STRNEQ ((char*) compressed_buffer, "ZLIB"))
324c50c785cSJohn Marino     {
325c50c785cSJohn Marino       bfd_set_error (bfd_error_wrong_format);
326c50c785cSJohn Marino       return FALSE;
327c50c785cSJohn Marino     }
328c50c785cSJohn Marino 
3295796c8dcSSimon Schubert   uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
3305796c8dcSSimon Schubert   uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
3315796c8dcSSimon Schubert   uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
3325796c8dcSSimon Schubert   uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
3335796c8dcSSimon Schubert   uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
3345796c8dcSSimon Schubert   uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
3355796c8dcSSimon Schubert   uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
3365796c8dcSSimon Schubert   uncompressed_size += compressed_buffer[11];
3375796c8dcSSimon Schubert 
338c50c785cSJohn Marino   sec->compressed_size = sec->size;
339c50c785cSJohn Marino   sec->size = uncompressed_size;
340c50c785cSJohn Marino   sec->compress_status = DECOMPRESS_SECTION_SIZED;
3415796c8dcSSimon Schubert 
3425796c8dcSSimon Schubert   return TRUE;
343c50c785cSJohn Marino #endif
344c50c785cSJohn Marino }
3455796c8dcSSimon Schubert 
346c50c785cSJohn Marino /*
347c50c785cSJohn Marino FUNCTION
348c50c785cSJohn Marino 	bfd_init_section_compress_status
349c50c785cSJohn Marino 
350c50c785cSJohn Marino SYNOPSIS
351c50c785cSJohn Marino 	bfd_boolean bfd_init_section_compress_status
352c50c785cSJohn Marino 	  (bfd *abfd, asection *section);
353c50c785cSJohn Marino 
354c50c785cSJohn Marino DESCRIPTION
355c50c785cSJohn Marino 	If open for read, compress section, update section size with
356c50c785cSJohn Marino 	compressed size and set compress_status to COMPRESS_SECTION_DONE.
357c50c785cSJohn Marino 
358c50c785cSJohn Marino 	Return @code{FALSE} if the section is not a valid compressed
359c50c785cSJohn Marino 	section or zlib is not installed on this machine.  Otherwise,
360c50c785cSJohn Marino 	return @code{TRUE}.
361c50c785cSJohn Marino */
362c50c785cSJohn Marino 
363c50c785cSJohn Marino bfd_boolean
364c50c785cSJohn Marino bfd_init_section_compress_status (bfd *abfd ATTRIBUTE_UNUSED,
365c50c785cSJohn Marino 				  sec_ptr sec ATTRIBUTE_UNUSED)
366c50c785cSJohn Marino {
367c50c785cSJohn Marino #ifndef HAVE_ZLIB_H
368c50c785cSJohn Marino   bfd_set_error (bfd_error_invalid_operation);
3695796c8dcSSimon Schubert   return FALSE;
370c50c785cSJohn Marino #else
371c50c785cSJohn Marino   bfd_size_type uncompressed_size;
372c50c785cSJohn Marino   bfd_byte *uncompressed_buffer;
373c50c785cSJohn Marino   bfd_boolean ret;
374c50c785cSJohn Marino 
375c50c785cSJohn Marino   /* Error if not opened for read.  */
376c50c785cSJohn Marino   if (abfd->direction != read_direction
377c50c785cSJohn Marino       || sec->size == 0
378c50c785cSJohn Marino       || sec->rawsize != 0
379c50c785cSJohn Marino       || sec->contents != NULL
380c50c785cSJohn Marino       || sec->compress_status != COMPRESS_SECTION_NONE)
381c50c785cSJohn Marino     {
382c50c785cSJohn Marino       bfd_set_error (bfd_error_invalid_operation);
383c50c785cSJohn Marino       return FALSE;
384c50c785cSJohn Marino     }
385c50c785cSJohn Marino 
386c50c785cSJohn Marino   /* Read in the full section contents and compress it.  */
387c50c785cSJohn Marino   uncompressed_size = sec->size;
388c50c785cSJohn Marino   uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
389c50c785cSJohn Marino   if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer,
390c50c785cSJohn Marino 				 0, uncompressed_size))
391c50c785cSJohn Marino     ret = FALSE;
392c50c785cSJohn Marino   else
393c50c785cSJohn Marino     ret = bfd_compress_section_contents (abfd, sec,
394c50c785cSJohn Marino 					 uncompressed_buffer,
395c50c785cSJohn Marino 					 uncompressed_size);
396c50c785cSJohn Marino 
397c50c785cSJohn Marino   free (uncompressed_buffer);
398c50c785cSJohn Marino   return ret;
399c50c785cSJohn Marino #endif
4005796c8dcSSimon Schubert }
401