From f91ea8497661e80927b17cabda43af803e60391c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 12 Jun 1999 15:42:04 +0000 Subject: [PATCH] Based on patch from H. Peter Anvin : * objcopy.c (struct section_list): Add copy field. (sections_copied): New static variable. (copy_options): Add "only-section". (copy_usage): Mention -j and --only-section. (find_section_list): Initialize copy field. (is_strip_section): Check for copying sections. (copy_object): Check sections_copied when calling filter_symbols. (setup_section): Check for copying sections. (copy_section): Likewise. (copy_main): Handle -j/--only-section. * binutils.texi, objcopy.1: Document -j/--only-section. --- binutils/ChangeLog | 13 +++++++++++++ binutils/NEWS | 3 +++ binutils/binutils.texi | 7 +++++++ binutils/objcopy.1 | 11 +++++++++-- binutils/objcopy.c | 39 ++++++++++++++++++++++++++++++++------- 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 4542a6dd8d..56f98b1c7f 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,5 +1,18 @@ 1999-06-12 Ian Lance Taylor + Based on patch from H. Peter Anvin : + * objcopy.c (struct section_list): Add copy field. + (sections_copied): New static variable. + (copy_options): Add "only-section". + (copy_usage): Mention -j and --only-section. + (find_section_list): Initialize copy field. + (is_strip_section): Check for copying sections. + (copy_object): Check sections_copied when calling filter_symbols. + (setup_section): Check for copying sections. + (copy_section): Likewise. + (copy_main): Handle -j/--only-section. + * binutils.texi, objcopy.1: Document -j/--only-section. + * configure.in: If frexp is not available, check in -lm. * configure: Rebuild. diff --git a/binutils/NEWS b/binutils/NEWS index 0bde43a1e4..7c39501086 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -18,6 +18,9 @@ Changes in binutils 2.10: * dlltool now takes --export-all-symbols, --no-export-all-symbols, --exclude-symbols, and --no-default-excludes options. +* objcopy now takes a -j/--only-section option to copy only the specified + sections. + Changes in binutils 2.9: * Added windres program, which can be used to manipulate resources in WIN32 diff --git a/binutils/binutils.texi b/binutils/binutils.texi index b431a95a3d..a079d92100 100644 --- a/binutils/binutils.texi +++ b/binutils/binutils.texi @@ -837,6 +837,7 @@ objcopy [ -F @var{bfdname} | --target=@var{bfdname} ] [ -x | --discard-all ] [ -X | --discard-locals ] [ -b @var{byte} | --byte=@var{byte} ] [ -i @var{interleave} | --interleave=@var{interleave} ] + [ -j @var{sectionname} | --only-section=@var{sectionname} ] [ -R @var{sectionname} | --remove-section=@var{sectionname} ] [ -p | --preserve-dates ] [ --debugging ] [ --gap-fill=@var{val} ] [ --pad-to=@var{address} ] @@ -905,6 +906,12 @@ Use @var{bfdname} as the object format for both the input and the output file; i.e., simply transfer data from source to destination with no translation. @xref{Target Selection}, for more information. +@item -j @var{sectionname} +@itemx --only-section=@var{sectionname} +Copy only the named section from the input file to the output file. +This option may be given more than once. Note that using this option +inappropriately may make the output file unusable. + @item -R @var{sectionname} @itemx --remove-section=@var{sectionname} Remove any section named @var{sectionname} from the output file. This diff --git a/binutils/objcopy.1 b/binutils/objcopy.1 index aee7760149..68b98d3e89 100644 --- a/binutils/objcopy.1 +++ b/binutils/objcopy.1 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1991, 93, 94, 95, 96, 97, 1998 Free Software Foundation +.\" Copyright (c) 1991, 93, 94, 95, 96, 97, 98, 1999 Free Software Foundation .\" See section COPYING for conditions for redistribution .TH objcopy 1 "October 1994" "cygnus support" "GNU Development Tools" .de BP @@ -18,6 +18,7 @@ objcopy \- copy and translate object files .RB "[\|" \-F\ \fIbfdname\fR\ |\ \fB\-\-target=\fIbfdname\fR "\|]" .RB "[\|" \-I\ \fIbfdname\fR\ |\ \fB\-\-input\-target=\fIbfdname\fR "\|]" .RB "[\|" \-O\ \fIbfdname\fR\ |\ \fB\-\-output\-target=\fIbfdname\fR "\|]" +.RB "[\|" \-j\ \fIsectionname\fR\ |\ \fB\-\-only\-section=\fIsectionname\fR "\|]" .RB "[\|" \-R\ \fIsectionname\fR\ |\ \fB\-\-remove\-section=\fIsectionname\fR "\|]" .RB "[\|" \-S\fR\ |\ \fB\-\-strip\-all\fR "\|]" .RB "[\|" \-g\fR\ |\ \fB\-\-strip\-debug\fR "\|]" @@ -123,6 +124,12 @@ Use as the object format for both the input and the output file; i.e. simply transfer data from source to destination with no translation. .TP +.B \-j \fIsectionname\fR, \fB\-\-only\-section=\fIsectionname +Copy only the named section from the input file to the output file, +discarding all other sections. This option may be given more than +once. Note that using this option inappropriately may make the output +file unusable. +.TP .B \-R \fIsectionname\fR, \fB\-\-remove-section=\fIsectionname Remove the named section from the file. This option may be given more than once. Note that using this option inappropriately may make the @@ -301,7 +308,7 @@ The GNU Binary Utilities\c \&, Roland H. Pesch (June 1993). .SH COPYING -Copyright (c) 1993, 94, 95, 96, 1997 Free Software Foundation, Inc. +Copyright (c) 1993, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc. .PP Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 5e6d6836f4..53bd996fb4 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -111,6 +111,7 @@ struct section_list const char * name; /* Section name. */ boolean used; /* Whether this entry was used. */ boolean remove; /* Whether to remove this section. */ + boolean copy; /* Whether to copy this section. */ enum change_action change_vma;/* Whether to change or set VMA. */ bfd_vma vma_val; /* Amount to change by or set to. */ enum change_action change_lma;/* Whether to change or set LMA. */ @@ -121,6 +122,7 @@ struct section_list static struct section_list *change_sections; static boolean sections_removed; +static boolean sections_copied; /* Changes to the start address. */ static bfd_vma change_start = 0; @@ -246,6 +248,7 @@ static struct option copy_options[] = {"debugging", no_argument, 0, OPTION_DEBUGGING}, {"discard-all", no_argument, 0, 'x'}, {"discard-locals", no_argument, 0, 'X'}, + {"only-section", required_argument, 0, 'j'}, {"format", required_argument, 0, 'F'}, /* Obsolete */ {"gap-fill", required_argument, 0, OPTION_GAP_FILL}, {"help", no_argument, 0, 'h'}, @@ -292,10 +295,12 @@ copy_usage (stream, exit_status) { fprintf (stream, _("\ Usage: %s [-vVSpgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-b byte]\n\ - [-R section] [-i interleave] [--interleave=interleave] [--byte=byte]\n\ + [-j section] [-R section]\n\ + [-i interleave] [--interleave=interleave] [--byte=byte]\n\ [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\ [--strip-all] [--strip-debug] [--strip-unneeded] [--discard-all]\n\ - [--discard-locals] [--debugging] [--remove-section=section]\n"), + [--discard-locals] [--debugging]\n\ + [--only-section=section] [--remove-section=section]\n"), program_name); fprintf (stream, _("\ [--gap-fill=val] [--pad-to=address] [--preserve-dates]\n\ @@ -411,6 +416,7 @@ find_section_list (name, add) p->name = name; p->used = false; p->remove = false; + p->copy = false; p->change_vma = CHANGE_IGNORE; p->change_lma = CHANGE_IGNORE; p->vma_val = 0; @@ -474,10 +480,15 @@ is_strip_section (abfd, sec) || convert_debugging)) return true; - if (! sections_removed) + if (! sections_removed && ! sections_copied) return false; + p = find_section_list (bfd_get_section_name (abfd, sec), false); - return p != NULL && p->remove ? true : false; + if (sections_removed && p != NULL && p->remove) + return true; + if (sections_copied && (p == NULL || ! p->copy)) + return true; + return false; } /* Choose which symbol entries to copy; put the result in OSYMS. @@ -816,6 +827,7 @@ copy_object (ibfd, obfd) || localize_specific_list != NULL || weaken_specific_list != NULL || sections_removed + || sections_copied || convert_debugging || change_leading_char || remove_leading_char @@ -1127,7 +1139,9 @@ setup_section (ibfd, isection, obfdarg) if (p != NULL) p->used = true; - if (p != NULL && p->remove) + if (sections_removed && p != NULL && p->remove) + return; + if (sections_copied && (p == NULL || ! p->copy)) return; osection = bfd_make_section_anyway (obfd, bfd_section_name (ibfd, isection)); @@ -1256,7 +1270,9 @@ copy_section (ibfd, isection, obfdarg) p = find_section_list (bfd_section_name (ibfd, isection), false); - if (p != NULL && p->remove) + if (sections_removed && p != NULL && p->remove) + return; + if (sections_copied && (p == NULL || ! p->copy)) return; osection = isection->output_section; @@ -1657,7 +1673,7 @@ copy_main (argc, argv) struct section_list *p; struct stat statbuf; - while ((c = getopt_long (argc, argv, "b:i:I:K:N:s:O:d:F:L:R:SpgxXVvW:", + while ((c = getopt_long (argc, argv, "b:i:I:j:K:N:s:O:d:F:L:R:SpgxXVvW:", copy_options, (int *) 0)) != EOF) { switch (c) @@ -1683,8 +1699,17 @@ copy_main (argc, argv) case 'F': input_target = output_target = optarg; break; + case 'j': + p = find_section_list (optarg, true); + if (p->remove) + fatal (_("%s both copied and removed"), optarg); + p->copy = true; + sections_copied = true; + break; case 'R': p = find_section_list (optarg, true); + if (p->copy) + fatal (_("%s both copied and removed"), optarg); p->remove = true; sections_removed = true; break;