[--verbose] [--version] [--help]\n\
[--remove-leading-char] [--verbose] [--version] [--help]\n\
static struct section_list *find_section_list PARAMS ((const char *, boolean));static void setup_section PARAMS ((bfd *, asection *, PTR));static void copy_section PARAMS ((bfd *, asection *, PTR));static void get_sections PARAMS ((bfd *, asection *, PTR));static int compare_section_vma PARAMS ((const PTR, const PTR));static void add_strip_symbol PARAMS ((const char *));static boolean is_strip_symbol PARAMS ((const char *));static boolean is_strip_section PARAMS ((bfd *, asection *));static unsigned int filter_symbols  PARAMS ((bfd *, asymbol **, asymbol **, long));static void mark_symbols_used_in_relocations PARAMS ((bfd *, asection *, PTR));#define nonfatal(s) {bfd_nonfatal(s); status = 1; return;}static asymbol **isympp = NULL;	/* Input symbols */static asymbol **osympp = NULL;	/* Output symbols that survive stripping *//* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes.  */static int copy_byte = -1;static int interleave = 4;static boolean verbose;		/* Print file and target names. */static int status = 0;		/* Exit status.  */enum strip_action  {    strip_undef,    strip_none,			/* don't strip */    strip_debug,		/* strip all debugger symbols */    strip_unneeded,		/* strip unnecessary symbols */    strip_all			/* strip all symbols */  };/* Which symbols to remove. */static enum strip_action strip_symbols;enum locals_action  {    locals_undef,    locals_start_L,		/* discard locals starting with L */    locals_all			/* discard all locals */  };/* Which local symbols to remove.  Overrides strip_all.  */static enum locals_action discard_locals;/* Structure used to hold lists of sections and actions to take.  */struct section_list{  /* Next section to adjust.  */  struct section_list *next;  /* Section name.  */  const char *name;  /* Whether this entry was used.  */  boolean used;  /* Whether to remove this section.  */  boolean remove;  /* Whether to adjust or set VMA.  */  enum { ignore_vma, adjust_vma, set_vma } adjust;  /* Amount to adjust by or set to.  */  bfd_vma val;  /* Whether to set the section flags.  */  boolean set_flags;  /* What to set the section flags to.  */  flagword flags;};static struct section_list *adjust_sections;static boolean sections_removed;/* Adjustments to the start address.  */static bfd_vma adjust_start = 0;static boolean set_start_set = false;static bfd_vma set_start;/* Adjustments to section VMA's.  */static bfd_vma adjust_section_vma = 0;/* Filling gaps between sections.  */static boolean gap_fill_set = false;static bfd_byte gap_fill = 0;/* Pad to a given address.  */static boolean pad_to_set = false;static bfd_vma pad_to;/* List of sections to add.  */struct section_add{  /* Next section to add.  */  struct section_add *next;  /* Name of section to add.  */  const char *name;  /* Name of file holding section contents.  */  const char *filename;  /* Size of file.  */  size_t size;  /* Contents of file.  */  bfd_byte *contents;  /* BFD section, after it has been added.  */  asection *section;};static struct section_add *add_sections;/* 150 isn't special; it's just an arbitrary non-ASCII char value.  */#define OPTION_ADD_SECTION 150#define OPTION_ADJUST_START (OPTION_ADD_SECTION + 1)#define OPTION_ADJUST_VMA (OPTION_ADJUST_START + 1)#define OPTION_ADJUST_SECTION_VMA (OPTION_ADJUST_VMA + 1)#define OPTION_ADJUST_WARNINGS (OPTION_ADJUST_SECTION_VMA + 1)#define OPTION_GAP_FILL (OPTION_ADJUST_WARNINGS + 1)#define OPTION_NO_ADJUST_WARNINGS (OPTION_GAP_FILL + 1)#define OPTION_PAD_TO (OPTION_NO_ADJUST_WARNINGS + 1)#define OPTION_SET_SECTION_FLAGS (OPTION_PAD_TO + 1)#define OPTION_SET_START (OPTION_SET_SECTION_FLAGS + 1)#define OPTION_STRIP_UNNEEDED (OPTION_SET_START + 1)/* Options to handle if running as "strip".  */static struct option strip_options[] ={  {"discard-all", no_argument, 0, 'x'},  {"discard-locals", no_argument, 0, 'X'},  {"format", required_argument, 0, 'F'}, /* Obsolete */  {"help", no_argument, 0, 'h'},  {"input-format", required_argument, 0, 'I'}, /* Obsolete */  {"input-target", required_argument, 0, 'I'},  {"keep-symbol", required_argument, 0, 'K'},  {"output-format", required_argument, 0, 'O'},	/* Obsolete */  {"output-target", required_argument, 0, 'O'},  {"remove-section", required_argument, 0, 'R'},  {"strip-all", no_argument, 0, 's'},  {"strip-debug", no_argument, 0, 'S'},  {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},  {"strip-symbol", required_argument, 0, 'N'},  {"target", required_argument, 0, 'F'},  {"verbose", no_argument, 0, 'v'},  {"version", no_argument, 0, 'V'},  {0, no_argument, 0, 0}};/* Options to handle if running as "objcopy".  */static struct option copy_options[] ={  {"add-section", required_argument, 0, OPTION_ADD_SECTION},  {"adjust-start", required_argument, 0, OPTION_ADJUST_START},  {"adjust-vma", required_argument, 0, OPTION_ADJUST_VMA},  {"adjust-section-vma", required_argument, 0, OPTION_ADJUST_SECTION_VMA},  {"adjust-warnings", no_argument, 0, OPTION_ADJUST_WARNINGS},  {"byte", required_argument, 0, 'b'},  {"discard-all", no_argument, 0, 'x'},  {"discard-locals", no_argument, 0, 'X'},  {"format", required_argument, 0, 'F'}, /* Obsolete */  {"gap-fill", required_argument, 0, OPTION_GAP_FILL},  {"help", no_argument, 0, 'h'},  {"input-format", required_argument, 0, 'I'}, /* Obsolete */  {"input-target", required_argument, 0, 'I'},  {"interleave", required_argument, 0, 'i'},  {"keep-symbol", required_argument, 0, 'K'},  {"no-adjust-warnings", no_argument, 0, OPTION_NO_ADJUST_WARNINGS},  {"output-format", required_argument, 0, 'O'},	/* Obsolete */  {"output-target", required_argument, 0, 'O'},  {"pad-to", required_argument, 0, OPTION_PAD_TO},  {"remove-section", required_argument, 0, 'R'},  {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},  {"set-start", required_argument, 0, OPTION_SET_START},  {"strip-all", no_argument, 0, 'S'},  {"strip-debug", no_argument, 0, 'g'},  {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},  {"strip-symbol", required_argument, 0, 'N'},  {"target", required_argument, 0, 'F'},  {"verbose", no_argument, 0, 'v'},  {"version", no_argument, 0, 'V'},  {0, no_argument, 0, 0}};/* IMPORTS */extern char *program_name;extern char *program_version;/* This flag distinguishes between strip and objcopy:   1 means this is 'strip'; 0 means this is 'objcopy'.   -1 means if we should use argv[0] to decide. */extern int is_strip;static voidcopy_usage (stream, exit_status)     FILE *stream;     int exit_status;{  fprintf (stream, "\Usage: %s [-vVSgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-b byte]\n\       [-R section] [-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] [--remove-section=section] [--gap-fill=val]\n",	   program_name);  fprintf (stream, "\       [--pad-to=address] [--set-start=val] [--adjust-start=incr]\n\       [--adjust-vma=incr] [--adjust-section-vma=section{=,+,-}val]\n\       [--adjust-warnings] [--no-adjust-warnings]\n\       [--set-section-flags=section=flags] [--add-section=sectionname=filename]\n\       [--keep-symbol symbol] [-K symbol] [--strip-symbol symbol] [-N symbol]\n\       [--verbose] [--version] [--help]\n\       in-file [out-file]\n");  list_supported_targets (program_name, stream);  exit (exit_status);}static voidstrip_usage (stream, exit_status)     FILE *stream;     int exit_status;{  fprintf (stream, "\Usage: %s [-vVsSgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-R section]\n\       [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\       [--strip-all] [--strip-debug] [--strip-unneeded] [--discard-all]\n\       [--discard-locals] [--keep-symbol symbol] [-K symbol]\n\       [--strip-symbol symbol] [-N symbol] [--remove-section=section]\n\       [--verbose] [--version] [--help] file...\n",	   program_name);  list_supported_targets (program_name, stream);  exit (exit_status);}/* Parse section flags into a flagword, with a fatal error if the   string can't be parsed.  */static flagwordparse_flags (s)     const char *s;{  flagword ret;  const char *snext;  int len;  ret = SEC_NO_FLAGS;  do    {      snext = strchr (s, ',');      if (snext == NULL)	len = strlen (s);      else	{	  len = snext - s;	  ++snext;	}#define PARSE_FLAG(fname,fval) if (strncmp (fname, s, len) == 0) ret |= fval;      PARSE_FLAG ("alloc", SEC_ALLOC);      PARSE_FLAG ("load", SEC_LOAD);      PARSE_FLAG ("readonly", SEC_READONLY);      PARSE_FLAG ("code", SEC_CODE);      PARSE_FLAG ("data", SEC_DATA);      PARSE_FLAG ("rom", SEC_ROM);#undef PARSE_FLAG      s = snext;    }  while (s != NULL);  return ret;}/* Find and optionally add an entry in the adjust_sections list.  */static struct section_list *find_section_list (name, add)     const char *name;     boolean add;{  register struct section_list *p;  for (p = adjust_sections; p != NULL; p = p->next)    if (strcmp (p->name, name) == 0)      return p;  if (! add)    return NULL;  p = (struct section_list *) xmalloc (sizeof (struct section_list));  p->name = name;  p->used = false;  p->remove = false;  p->adjust = ignore_vma;  p->val = 0;  p->set_flags = false;  p->flags = 0;  p->next = adjust_sections;  adjust_sections = p;  return p;}