aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2003-06-26 08:14:10 +0000
committerNick Clifton <nickc@redhat.com>2003-06-26 08:14:10 +0000
commited1653a7a6e4a758fa05f05f7e5d5b3257b84a42 (patch)
treeba89a5e68f9e14de3f19a201a4cd1c4c3ec8ea46
parent41108f153c5bbc26d9bd7dcd7aabfca43632ab47 (diff)
downloadgdb-ed1653a7a6e4a758fa05f05f7e5d5b3257b84a42.zip
gdb-ed1653a7a6e4a758fa05f05f7e5d5b3257b84a42.tar.gz
gdb-ed1653a7a6e4a758fa05f05f7e5d5b3257b84a42.tar.bz2
Add --only-keep-debug switch
-rw-r--r--binutils/ChangeLog16
-rw-r--r--binutils/NEWS6
-rw-r--r--binutils/doc/binutils.texi86
-rw-r--r--binutils/objcopy.c31
4 files changed, 131 insertions, 8 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 7519a19..d6ca2f0 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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".
diff --git a/binutils/NEWS b/binutils/NEWS
index 1f869b4..4338946 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -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.
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index 90c871a..899ab53 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -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}.
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index cdda827..de77767 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -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;