Based on patch from H. Peter Anvin <hpa@transmeta.com>:
authorIan Lance Taylor <ian@airs.com>
Sat, 12 Jun 1999 15:42:04 +0000 (15:42 +0000)
committerIan Lance Taylor <ian@airs.com>
Sat, 12 Jun 1999 15:42:04 +0000 (15:42 +0000)
* 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
binutils/NEWS
binutils/binutils.texi
binutils/objcopy.1
binutils/objcopy.c

index 4542a6dd8d3eb21a051315460f0547c52e797a6b..56f98b1c7fccf6aeca046e033ac50a70851f3e00 100644 (file)
@@ -1,5 +1,18 @@
 1999-06-12  Ian Lance Taylor  <ian@zembu.com>
 
+       Based on patch from H. Peter Anvin <hpa@transmeta.com>:
+       * 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.
 
index 0bde43a1e4debdc07750ed8fdb4c343b74c01856..7c39501086155ad4298c5b9e1908a31c6f6a9e07 100644 (file)
@@ -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
index b431a95a3dd4b5d86e788ac025baba9dc28696ff..a079d921005c58e42b9bbf69cb0333e45f5ae182 100644 (file)
@@ -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
index aee776014989d937b9a08c5ef1ca0221f5596a20..68b98d3e8986a0648843025df7e3dded63b46983 100644 (file)
@@ -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
index 5e6d6836f43be543ff81dff0c09a0a98b82c51f5..53bd996fb48e7e5a582d611e68137356473c2645 100644 (file)
@@ -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;