Add SHF_COMPRESSED support to gas and objcopy
[deliverable/binutils-gdb.git] / gas / write.c
index 1ae47a900903bea1e8aa7e57e6181b4ecb7250c8..bc76962c600efc442d7d180e360320f69808685d 100644 (file)
@@ -1413,6 +1413,9 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
   struct z_stream_s *strm;
   int x;
   flagword flags = bfd_get_section_flags (abfd, sec);
+  unsigned int header_size, compression_header_size;
+  /* Maximimum compression header is 24 bytes.  */
+  bfd_byte compression_header[24];
 
   if (seginfo == NULL
       || sec->size < 32
@@ -1427,18 +1430,26 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
   if (strm == NULL)
     return;
 
+  if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
+    stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI;
+  else
+    stdoutput->flags |= BFD_COMPRESS;
+  compression_header_size
+    = bfd_get_compression_header_size (stdoutput, NULL);
+
   /* Create a new frag to contain the "ZLIB" header.  */
+  header_size = 12 + compression_header_size;
   first_newf = frag_alloc (ob);
-  if (obstack_room (ob) < 12)
+  if (obstack_room (ob) < header_size)
     first_newf = frag_alloc (ob);
-  if (obstack_room (ob) < 12)
-    as_fatal (_("can't extend frag %u chars"), 12);
+  if (obstack_room (ob) < header_size)
+    as_fatal (_("can't extend frag %u chars"), header_size);
   last_newf = first_newf;
-  obstack_blank_fast (ob, 12);
+  obstack_blank_fast (ob, header_size);
   last_newf->fr_type = rs_fill;
-  last_newf->fr_fix = 12;
+  last_newf->fr_fix = header_size;
   header = last_newf->fr_literal;
-  compressed_size = 12;
+  compressed_size = header_size;
 
   /* Stream the frags through the compression engine, adding new frags
      as necessary to accomodate the compressed output.  */
@@ -1522,21 +1533,27 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
   if (compressed_size >= uncompressed_size)
     return;
 
-  memcpy (header, "ZLIB", 4);
-  bfd_putb64 (uncompressed_size, header + 4);
+  if (compression_header_size)
+    memcpy (header, compression_header, compression_header_size);
+  memcpy (header + compression_header_size, "ZLIB", 4);
+  bfd_putb64 (uncompressed_size, header + compression_header_size + 4);
 
   /* Replace the uncompressed frag list with the compressed frag list.  */
   seginfo->frchainP->frch_root = first_newf;
   seginfo->frchainP->frch_last = last_newf;
 
   /* Update the section size and its name.  */
+  bfd_update_compression_header (abfd, (bfd_byte *) header, sec);
   x = bfd_set_section_size (abfd, sec, compressed_size);
   gas_assert (x);
-  compressed_name = (char *) xmalloc (strlen (section_name) + 2);
-  compressed_name[0] = '.';
-  compressed_name[1] = 'z';
-  strcpy (compressed_name + 2, section_name + 1);
-  bfd_section_name (stdoutput, sec) = compressed_name;
+  if (!compression_header_size)
+    {
+      compressed_name = (char *) xmalloc (strlen (section_name) + 2);
+      compressed_name[0] = '.';
+      compressed_name[1] = 'z';
+      strcpy (compressed_name + 2, section_name + 1);
+      bfd_section_name (stdoutput, sec) = compressed_name;
+    }
 }
 
 static void
This page took 0.024763 seconds and 4 git commands to generate.