Add NEWS entry for fast tracepoint support on aarch64-linux
[deliverable/binutils-gdb.git] / binutils / objcopy.c
index a21006a166c733d73feb27b96437793330e40631..e4cb3e2d3fb6db4d3ef747fc3b4a89d0e92dca6e 100644 (file)
@@ -202,9 +202,12 @@ static bfd_boolean convert_debugging = FALSE;
 /* Whether to compress/decompress DWARF debug sections.  */
 static enum
 {
-  nothing,
-  compress,
-  decompress
+  nothing = 0,
+  compress = 1 << 0,
+  compress_zlib = compress | 1 << 1,
+  compress_gnu_zlib = compress | 1 << 2,
+  compress_gabi_zlib = compress | 1 << 3,
+  decompress = 1 << 4
 } do_debug_sections = nothing;
 
 /* Whether to change the leading character in symbol names.  */
@@ -380,7 +383,7 @@ static struct option copy_options[] =
   {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
   {"change-start", required_argument, 0, OPTION_CHANGE_START},
   {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
-  {"compress-debug-sections", no_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
+  {"compress-debug-sections", optional_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
   {"debugging", no_argument, 0, OPTION_DEBUGGING},
   {"decompress-debug-sections", no_argument, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS},
   {"disable-deterministic-archives", no_argument, 0, 'U'},
@@ -601,7 +604,8 @@ copy_usage (FILE *stream, int exit_status)
                                    <commit>\n\
      --subsystem <name>[:<version>]\n\
                                    Set PE subsystem to <name> [& <version>]\n\
-     --compress-debug-sections     Compress DWARF debug sections using zlib\n\
+     --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\
+                                   Compress DWARF debug sections using zlib\n\
      --decompress-debug-sections   Decompress DWARF debug sections using zlib\n\
   -v --verbose                     List all object files modified\n\
   @<file>                          Read options from <file>\n\
@@ -728,7 +732,7 @@ parse_flags (const char *s)
    We need to be careful in how we match section names because of the support
    for wildcard characters.  For example suppose that the user has invoked
    objcopy like this:
-         
+
        --set-section-flags .debug_*=debug
        --set-section-flags .debug_str=readonly,debug
        --change-section-address .debug_*ranges=0x1000
@@ -756,7 +760,7 @@ find_section_list (const char *name, bfd_boolean add, unsigned int context)
   struct section_list *p;
 
   /* assert ((context & ((1 << 7) - 1)) != 0); */
-  
+
   for (p = change_sections; p != NULL; p = p->next)
     {
       if (add)
@@ -981,15 +985,15 @@ is_specified_symbol_predicate (void **slot, void *data)
       if (! fnmatch (slot_name, d->name, 0))
        {
          d->found = TRUE;
-         /* Stop traversal.  */
-         return 0;
+         /* Continue traversal, there might be a non-match rule.  */
+         return 1;
        }
     }
   else
     {
-      if (fnmatch (slot_name + 1, d->name, 0))
+      if (fnmatch (slot_name + 1, d->name, 0))
        {
-         d->found = TRUE;
+         d->found = FALSE;
          /* Stop traversal.  */
          return 0;
        }
@@ -1660,6 +1664,15 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
       return FALSE;
     }
 
+  if ((do_debug_sections & compress) != 0
+      && do_debug_sections != compress
+      && ibfd->xvec->flavour != bfd_target_elf_flavour)
+    {
+      non_fatal (_("--compress-debug-sections=[zlib|zlib-gnu|zlib-gabi] is unsupported on `%s'"),
+                bfd_get_archive_filename (ibfd));
+      return FALSE;
+    }
+
   if (verbose)
     printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
            bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
@@ -1951,7 +1964,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
                                    _("can't dump section - it has no contents"));
              continue;
            }
-         
+
          bfd_size_type size = bfd_get_section_size (sec);
          if (size == 0)
            {
@@ -1988,7 +2001,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
          free (contents);
        }
     }
-  
+
   if (gnu_debuglink_filename != NULL)
     {
       /* PR 15125: Give a helpful warning message if
@@ -2588,7 +2601,14 @@ copy_file (const char *input_filename, const char *output_filename,
   switch (do_debug_sections)
     {
     case compress:
+    case compress_zlib:
+    case compress_gnu_zlib:
+    case compress_gabi_zlib:
       ibfd->flags |= BFD_COMPRESS;
+      /* Don't check if input is ELF here since this information is
+        only available after bfd_check_format_matches is called.  */
+      if (do_debug_sections != compress_gnu_zlib)
+       ibfd->flags |= BFD_COMPRESS_GABI;
       break;
     case decompress:
       ibfd->flags |= BFD_DECOMPRESS;
@@ -2852,6 +2872,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
     elf_section_type (osection) = SHT_NOBITS;
 
   size = bfd_section_size (ibfd, isection);
+  size = bfd_convert_section_size (ibfd, isection, obfd, size);
   if (copy_byte >= 0)
     size = (size + interleave - 1) / interleave * copy_width;
   else if (extract_symbol)
@@ -2909,6 +2930,9 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
   /* Copy merge entity size.  */
   osection->entsize = isection->entsize;
 
+  /* Copy compress status.  */
+  osection->compress_status = isection->compress_status;
+
   /* This used to be mangle_section; we do here to avoid using
      bfd_get_section_by_name since some formats allow multiple
      sections with the same name.  */
@@ -3086,14 +3110,20 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
     return;
 
   osection = isection->output_section;
-  size = bfd_get_section_size (isection);
+  /* The output SHF_COMPRESSED section size is different from input if
+     ELF classes of input and output aren't the same.  We must use the
+     output section size here, which has been updated in setup_section
+     via bfd_convert_section_size.  */
+  size = bfd_get_section_size (osection);
 
   if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
       && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
     {
       bfd_byte *memhunk = NULL;
 
-      if (!bfd_get_full_section_contents (ibfd, isection, &memhunk))
+      if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)
+         || !bfd_convert_section_contents (ibfd, isection, obfd,
+                                           &memhunk))
        {
          status = 1;
          bfd_nonfatal_message (NULL, ibfd, isection, NULL);
@@ -3895,7 +3925,7 @@ copy_main (int argc, char *argv[])
           dump_sections = init_section_add (optarg, dump_sections,
                                             "--dump-section");
          break;
-         
+
        case OPTION_CHANGE_START:
          change_start = parse_vma (optarg, "--change-start");
          break;
@@ -3998,7 +4028,22 @@ copy_main (int argc, char *argv[])
          break;
 
        case OPTION_COMPRESS_DEBUG_SECTIONS:
-         do_debug_sections = compress;
+         if (optarg)
+           {
+             if (strcasecmp (optarg, "none") == 0)
+               do_debug_sections = decompress;
+             else if (strcasecmp (optarg, "zlib") == 0)
+               do_debug_sections = compress_zlib;
+             else if (strcasecmp (optarg, "zlib-gnu") == 0)
+               do_debug_sections = compress_gnu_zlib;
+             else if (strcasecmp (optarg, "zlib-gabi") == 0)
+               do_debug_sections = compress_gabi_zlib;
+             else
+               fatal (_("unrecognized --compress-debug-sections type `%s'"),
+                      optarg);
+           }
+         else
+           do_debug_sections = compress;
          break;
 
        case OPTION_DEBUGGING:
This page took 0.026413 seconds and 4 git commands to generate.