Add --only-keep-debug switch
authorNick Clifton <nickc@redhat.com>
Thu, 26 Jun 2003 08:14:10 +0000 (08:14 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 26 Jun 2003 08:14:10 +0000 (08:14 +0000)
binutils/ChangeLog
binutils/NEWS
binutils/doc/binutils.texi
binutils/objcopy.c

index 7519a19..d6ca2f0 100644 (file)
@@ -1,3 +1,19 @@
+2003-06-26  Nick Clifton  <nickc@redhat.com>
+
+       * objcopy (enum strip_action): Add STRIP_NONDEBUG.
+        (OPTION_ONLY_KEEP_DEBUG): New.
+        (strip_options): Add --only-keep-debug.
+        (copy_options): Likewise.
+        (is_strip_section): Invert return value if STRIP_NONDEBUG is
+        active.
+        (copy_object): Do not copy private data when STRIP_NONDEBUG is
+        active.
+        (setup_section): Likewise.
+        (strip_main): Handle --only-keep-debug.
+        (copy_main): Likewise.
+       * NEWS: Mention new switch
+       * doc/binutils.texi: Document new switch.
+
 2003-06-25  Alan Modra  <amodra@bigpond.net.au>
 
        * NEWS: Correct spelling of "relocatable".
index 1f869b4..4338946 100644 (file)
@@ -1,5 +1,11 @@
 -*- text -*-
 
+* objcopy and strip now accept --only-keep-debug to create a file containing
+  those sections that would be stripped out by --strip-debug.  The idea is that
+  this can be used in conjunction with the --add-gnu-debuglink switch to create
+  a two part program distribution - one a stripped executable and the other the
+  debugging info.
+
 * objcopy now accepts --add-gnu-debuglink=<file> to insert a .gnu_debuglink
   section into a (presumably stripped) executable.  This allows the debug
   information for the file to be held in a seperate file.
index 90c871a..899ab53 100644 (file)
@@ -934,7 +934,6 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}]
         [@option{-B} @var{bfdarch}|@option{--binary-architecture=}@var{bfdarch}]
         [@option{-S}|@option{--strip-all}]
         [@option{-g}|@option{--strip-debug}]
-        [@option{--add-gnu-debuglink=}@var{path-to-file}]
         [@option{-K} @var{symbolname}|@option{--keep-symbol=}@var{symbolname}]
         [@option{-N} @var{symbolname}|@option{--strip-symbol=}@var{symbolname}]
         [@option{-G} @var{symbolname}|@option{--keep-global-symbol=}@var{symbolname}]
@@ -974,6 +973,8 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}]
         [@option{--prefix-symbols=}@var{string}]
         [@option{--prefix-sections=}@var{string}]
         [@option{--prefix-alloc-sections=}@var{string}]
+        [@option{--add-gnu-debuglink=}@var{path-to-file}]
+        [@option{--only-keep-debug}]
         [@option{-v}|@option{--verbose}]
         [@option{-V}|@option{--version}]  
         [@option{--help}] [@option{--info}]
@@ -1079,10 +1080,6 @@ Do not copy debugging symbols or sections from the source file.
 @item --strip-unneeded
 Strip all symbols that are not needed for relocation processing.
 
-@item --add-gnu-debuglink=@var{path-to-file}
-Creates a .gnu_debuglink section which contains a reference to @var{path-to-file}
-and adds it to the output file.
-
 @item -K @var{symbolname}
 @itemx --keep-symbol=@var{symbolname}
 Copy only symbol @var{symbolname} from the source file.  This option may
@@ -1353,6 +1350,47 @@ Prefix all section names in the output file with @var{string}.
 Prefix all the names of all allocated sections in the output file with
 @var{string}.
 
+@item --add-gnu-debuglink=@var{path-to-file}
+Creates a .gnu_debuglink section which contains a reference to @var{path-to-file}
+and adds it to the output file.
+
+@item --only-keep-debug
+Strip a file, removing any sections that would be stripped by
+@option{--strip-debug} and leaving the debugging sections.
+
+The intention is that this option will be used in conjunction with
+@option{--add-gnu-debuglink} to create a two part executable.  One a
+stripped binary which will occupy less space in RAM and in a
+distribution and the second a debugging information file which is only
+needed if debugging abilities are required.  The suggested procedure
+to create these files is as follows:
+
+@enumerate
+@item Link the executable as normal.  Assuming that is is called
+@code{foo} then...
+@item Run @code{objcopy --only-keep-debug foo foo.dbg} to
+create a file containing the debugging info.
+@item Run @code{objcopy --strip-debug foo} to create a
+stripped executable.
+@item Run @code{objcopy --add-gnu-debuglink=foo.dbg foo}
+to add a link to the debugging info into the stripped executable.
+@end enumerate
+
+Note - the choice of @code{.dbg} as an extension for the debug info
+file is arbitrary.  Also the @code{--only-keep-debug} step is
+optional.  You could instead do this:
+
+@enumerate
+@item Link the executable as normal.
+@item Copy @code{foo} to  @code{foo.full}
+@item Run @code{objcopy --strip-debug foo}
+@item Run @code{objcopy --add-gnu-debuglink=foo.full foo}
+@end enumerate
+
+ie the file pointed to by the @option{--add-gnu-debuglink} can be the
+full executable.  It does not have to be a file created by the
+@option{--only-keep-debug} switch.
+
 @item -V
 @itemx --version
 Show the version number of @command{objcopy}.
@@ -2073,6 +2111,7 @@ strip [@option{-F} @var{bfdname} |@option{--target=}@var{bfdname}]
       [@option{-x}|@option{--discard-all}] [@option{-X} |@option{--discard-locals}]
       [@option{-R} @var{sectionname} |@option{--remove-section=}@var{sectionname}]
       [@option{-o} @var{file}] [@option{-p}|@option{--preserve-dates}]
+      [@option{--only-keep-debug}]
       [@option{-v} |@option{--verbose}] [@option{-V}|@option{--version}]
       [@option{--help}] [@option{--info}]
       @var{objfile}@dots{}
@@ -2164,6 +2203,43 @@ Remove non-global symbols.
 Remove compiler-generated local symbols.
 (These usually start with @samp{L} or @samp{.}.)
 
+@item --only-keep-debug
+Strip a file, removing any sections that would be stripped by
+@option{--strip-debug} and leaving the debugging sections.
+
+The intention is that this option will be used in conjunction with
+@option{--add-gnu-debuglink} to create a two part executable.  One a
+stripped binary which will occupy less space in RAM and in a
+distribution and the second a debugging information file which is only
+needed if debugging abilities are required.  The suggested procedure
+to create these files is as follows:
+
+@enumerate
+@item Link the executable as normal.  Assuming that is is called
+@code{foo} then...
+@item Run @code{objcopy --only-keep-debug foo foo.dbg} to
+create a file containing the debugging info.
+@item Run @code{objcopy --strip-debug foo} to create a
+stripped executable.
+@item Run @code{objcopy --add-gnu-debuglink=foo.dbg foo}
+to add a link to the debugging info into the stripped executable.
+@end enumerate
+
+Note - the choice of @code{.dbg} as an extension for the debug info
+file is arbitrary.  Also the @code{--only-keep-debug} step is
+optional.  You could instead do this:
+
+@enumerate
+@item Link the executable as normal.
+@item Copy @code{foo} to  @code{foo.full}
+@item Run @code{strip --strip-debug foo}
+@item Run @code{objcopy --add-gnu-debuglink=foo.full foo}
+@end enumerate
+
+ie the file pointed to by the @option{--add-gnu-debuglink} can be the
+full executable.  It does not have to be a file created by the
+@option{--only-keep-debug} switch.
+
 @item -V
 @itemx --version
 Show the version number for @command{strip}.
index cdda827..de77767 100644 (file)
@@ -132,6 +132,7 @@ enum strip_action
     STRIP_NONE,                        /* don't strip */
     STRIP_DEBUG,               /* strip all debugger symbols */
     STRIP_UNNEEDED,            /* strip unnecessary symbols */
+    STRIP_NONDEBUG,            /* Strip everything but debug info.  */
     STRIP_ALL                  /* strip all symbols */
   };
 
@@ -284,6 +285,7 @@ static char *prefix_alloc_sections_string = 0;
 #define OPTION_PREFIX_ALLOC_SECTIONS (OPTION_PREFIX_SECTIONS + 1)
 #define OPTION_FORMATS_INFO (OPTION_PREFIX_ALLOC_SECTIONS + 1)
 #define OPTION_ADD_GNU_DEBUGLINK (OPTION_FORMATS_INFO + 1)
+#define OPTION_ONLY_KEEP_DEBUG (OPTION_ADD_GNU_DEBUGLINK + 1)
 
 /* Options to handle if running as "strip".  */
 
@@ -297,6 +299,7 @@ static struct option strip_options[] =
   {"input-format", required_argument, 0, 'I'}, /* Obsolete */
   {"input-target", required_argument, 0, 'I'},
   {"keep-symbol", required_argument, 0, 'K'},
+  {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
   {"output-format", required_argument, 0, 'O'},        /* Obsolete */
   {"output-target", required_argument, 0, 'O'},
   {"output-file", required_argument, 0, 'o'},
@@ -350,6 +353,7 @@ static struct option copy_options[] =
   {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
   {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
   {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
+  {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
   {"only-section", required_argument, 0, 'j'},
   {"output-format", required_argument, 0, 'O'},        /* Obsolete */
   {"output-target", required_argument, 0, 'O'},
@@ -781,9 +785,12 @@ is_strip_section (abfd, sec)
          || discard_locals == LOCALS_ALL
          || convert_debugging)
        return TRUE;
+
+      if (strip_symbols == STRIP_NONDEBUG)
+       return FALSE;
     }
 
-  return FALSE;
+  return strip_symbols == STRIP_NONDEBUG ? TRUE : FALSE;
 }
 
 /* Choose which symbol entries to copy; put the result in OSYMS.
@@ -1346,6 +1353,7 @@ copy_object (ibfd, obfd)
   if (strip_symbols == STRIP_DEBUG
       || strip_symbols == STRIP_ALL
       || strip_symbols == STRIP_UNNEEDED
+      || strip_symbols == STRIP_NONDEBUG
       || discard_locals != LOCALS_UNDEF
       || strip_specific_list != NULL
       || keep_specific_list != NULL
@@ -1451,7 +1459,12 @@ copy_object (ibfd, obfd)
      from the input BFD to the output BFD.  This is done last to
      permit the routine to look at the filtered symbol table, which is
      important for the ECOFF code at least.  */
-  if (! bfd_copy_private_bfd_data (ibfd, obfd))
+  if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
+      && strip_symbols == STRIP_NONDEBUG)
+    /* Do not copy the private data when creating an ELF format
+       debug info file.  We do not want the program headers.  */
+    ;
+  else if (! bfd_copy_private_bfd_data (ibfd, obfd))
     {
       non_fatal (_("%s: error copying private BFD data: %s"),
                 bfd_get_filename (obfd),
@@ -1879,7 +1892,12 @@ setup_section (ibfd, isection, obfdarg)
 
   /* Allow the BFD backend to copy any private data it understands
      from the input section to the output section.  */
-  if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
+  if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
+      && strip_symbols == STRIP_NONDEBUG)
+    /* Do not copy the private data when creating an ELF format
+       debug info file.  We do not want the program headers.  */
+    ;
+  else if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
     {
       err = _("private data");
       goto loser;
@@ -2262,6 +2280,9 @@ strip_main (argc, argv)
        case OPTION_FORMATS_INFO:
          formats_info = TRUE;
          break;
+       case OPTION_ONLY_KEEP_DEBUG:
+         strip_symbols = STRIP_NONDEBUG;
+         break;
        case 0:
          /* We've been given a long option.  */
          break;
@@ -2415,6 +2436,10 @@ copy_main (argc, argv)
          strip_symbols = STRIP_UNNEEDED;
          break;
 
+       case OPTION_ONLY_KEEP_DEBUG:
+         strip_symbols = STRIP_NONDEBUG;
+         break;
+
        case OPTION_ADD_GNU_DEBUGLINK:
          gnu_debuglink_filename = optarg;
          break;