From ed1653a7a6e4a758fa05f05f7e5d5b3257b84a42 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 26 Jun 2003 08:14:10 +0000 Subject: [PATCH] Add --only-keep-debug switch --- binutils/ChangeLog | 16 +++++++ binutils/NEWS | 6 +++ binutils/doc/binutils.texi | 86 +++++++++++++++++++++++++++++++++++--- binutils/objcopy.c | 31 ++++++++++++-- 4 files changed, 131 insertions(+), 8 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 7519a19418c..d6ca2f0d816 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,19 @@ +2003-06-26 Nick Clifton + + * 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 * NEWS: Correct spelling of "relocatable". diff --git a/binutils/NEWS b/binutils/NEWS index 1f869b473d3..4338946f10d 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= 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 90c871ad87e..899ab5367d3 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 cdda827003e..de777678962 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; -- 2.30.2