[AArch64] Drop unused argument to elf_aarch64_create_or_find_stub_sec
[deliverable/binutils-gdb.git] / bfd / compress.c
index 683156209a75e9b121fe81276ac6b10b8046979d..de74d60b1957ee7988d4f7e073e513d17994210a 100644 (file)
@@ -1,5 +1,5 @@
 /* Compressed section support (intended for debug sections).
-   Copyright (C) 2008-2014 Free Software Foundation, Inc.
+   Copyright (C) 2008-2015 Free Software Foundation, Inc.
 
    This file is part of BFD, the Binary File Descriptor library.
 
@@ -61,39 +61,22 @@ decompress_contents (bfd_byte *compressed_buffer,
   rc |= inflateEnd (&strm);
   return rc == Z_OK && strm.avail_out == 0;
 }
-#endif
-
-/*
-FUNCTION
-       bfd_compress_section_contents
 
-SYNOPSIS
-       bfd_boolean bfd_compress_section_contents
-         (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer,
-          bfd_size_type uncompressed_size);
-
-DESCRIPTION
+/* Compress data of the size specified in @var{uncompressed_size}
+   and pointed to by @var{uncompressed_buffer} using zlib and store
+   as the contents field.  This function assumes the contents
+   field was allocated using bfd_malloc() or equivalent.  If zlib
+   is not installed on this machine, the input is unmodified.
 
-       Compress data of the size specified in @var{uncompressed_size}
-       and pointed to by @var{uncompressed_buffer} using zlib and store
-       as the contents field.  This function assumes the contents
-       field was allocated using bfd_malloc() or equivalent.  If zlib
-       is not installed on this machine, the input is unmodified.
+   Return @code{TRUE} if the full section contents is compressed
+   successfully.  */
 
-       Return @code{TRUE} if the full section contents is compressed
-       successfully.
-*/
-
-bfd_boolean
+static bfd_boolean
 bfd_compress_section_contents (bfd *abfd ATTRIBUTE_UNUSED,
                               sec_ptr sec ATTRIBUTE_UNUSED,
                               bfd_byte *uncompressed_buffer ATTRIBUTE_UNUSED,
                               bfd_size_type uncompressed_size ATTRIBUTE_UNUSED)
 {
-#ifndef HAVE_ZLIB_H
-  bfd_set_error (bfd_error_invalid_operation);
-  return FALSE;
-#else
   uLong compressed_size;
   bfd_byte *compressed_buffer;
 
@@ -135,8 +118,8 @@ bfd_compress_section_contents (bfd *abfd ATTRIBUTE_UNUSED,
   sec->compress_status = COMPRESS_SECTION_DONE;
 
   return TRUE;
-#endif  /* HAVE_ZLIB_H */
 }
+#endif  /* HAVE_ZLIB_H */
 
 /*
 FUNCTION
@@ -152,7 +135,8 @@ DESCRIPTION
        return @var{*ptr} with memory malloc'd by this function.
 
        Return @code{TRUE} if the full section contents is retrieved
-       successfully.
+       successfully.  If the section has no contents then this function
+       returns @code{TRUE} but @var{*ptr} is set to NULL.
 */
 
 bfd_boolean
@@ -172,25 +156,21 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
   else
     sz = sec->size;
   if (sz == 0)
-    return TRUE;
+    {
+      *ptr = NULL;
+      return TRUE;
+    }
 
   switch (sec->compress_status)
     {
     case COMPRESS_SECTION_NONE:
-      /* PR binutils/17512: Avoid malloc or file reading errors due to
-        ridiculous section sizes.  But ignore linker created objects
-        and bfds with no contents (yet).  */
-      if (bfd_get_size (abfd) > 0
-         && (sec->flags & SEC_LINKER_CREATED) == 0
-         && sz > (bfd_size_type) bfd_get_size (abfd))
-       return FALSE;
-
       if (p == NULL)
        {
          p = (bfd_byte *) bfd_malloc (sz);
          if (p == NULL)
            return FALSE;
        }
+
       if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
        {
          if (*ptr != p)
@@ -247,6 +227,8 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
 #endif
 
     case COMPRESS_SECTION_DONE:
+      if (sec->contents == NULL)
+       return FALSE;
       if (p == NULL)
        {
          p = (bfd_byte *) bfd_malloc (sz);
@@ -254,7 +236,9 @@ bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
            return FALSE;
          *ptr = p;
        }
-      memcpy (p, sec->contents, sz);
+      /* PR 17512; file: 5bc29788.  */
+      if (p != sec->contents)
+       memcpy (p, sec->contents, sz);
       return TRUE;
 
     default:
@@ -440,7 +424,18 @@ bfd_init_section_compress_status (bfd *abfd ATTRIBUTE_UNUSED,
                                         uncompressed_buffer,
                                         uncompressed_size);
 
-  free (uncompressed_buffer);
+  /* PR binutils/18087: If compression didn't make
+     the section smaller, just keep it uncompressed.  */
+  if (ret && uncompressed_size < sec->size)
+    {
+      free (sec->contents);
+      sec->contents = uncompressed_buffer;
+      sec->size = uncompressed_size;
+      sec->compress_status = COMPRESS_SECTION_NONE;
+    }
+  else
+    free (uncompressed_buffer);
+
   return ret;
 #endif
 }
This page took 0.024913 seconds and 4 git commands to generate.