aboutsummaryrefslogtreecommitdiff
path: root/binutils/objcopy.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1999-06-12 15:42:04 +0000
committerIan Lance Taylor <ian@airs.com>1999-06-12 15:42:04 +0000
commitf91ea8497661e80927b17cabda43af803e60391c (patch)
treeb568bebd345c04df219493bd41412a2b8ee46d18 /binutils/objcopy.c
parentf353eb8a51a81b3997cf97a7e02c5a7fdafb8a6e (diff)
downloadgdb-f91ea8497661e80927b17cabda43af803e60391c.zip
gdb-f91ea8497661e80927b17cabda43af803e60391c.tar.gz
gdb-f91ea8497661e80927b17cabda43af803e60391c.tar.bz2
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.
Diffstat (limited to 'binutils/objcopy.c')
-rw-r--r--binutils/objcopy.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 5e6d683..53bd996 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;