+
+ case OPTION_WEAKEN:
+ weaken = TRUE;
+ break;
+
+ case OPTION_ADD_SECTION:
+ {
+ const char *s;
+ off_t size;
+ struct section_add *pa;
+ int len;
+ char *name;
+ FILE *f;
+
+ s = strchr (optarg, '=');
+
+ if (s == NULL)
+ fatal (_("bad format for %s"), "--add-section");
+
+ size = get_file_size (s + 1);
+ if (size < 1)
+ break;
+
+ pa = xmalloc (sizeof (struct section_add));
+
+ len = s - optarg;
+ name = xmalloc (len + 1);
+ strncpy (name, optarg, len);
+ name[len] = '\0';
+ pa->name = name;
+
+ pa->filename = s + 1;
+ pa->size = size;
+ pa->contents = xmalloc (size);
+
+ f = fopen (pa->filename, FOPEN_RB);
+
+ if (f == NULL)
+ fatal (_("cannot open: %s: %s"),
+ pa->filename, strerror (errno));
+
+ if (fread (pa->contents, 1, pa->size, f) == 0
+ || ferror (f))
+ fatal (_("%s: fread failed"), pa->filename);
+
+ fclose (f);
+
+ pa->next = add_sections;
+ add_sections = pa;
+ }
+ break;
+
+ case OPTION_CHANGE_START:
+ change_start = parse_vma (optarg, "--change-start");
+ break;
+
+ case OPTION_CHANGE_SECTION_ADDRESS:
+ case OPTION_CHANGE_SECTION_LMA:
+ case OPTION_CHANGE_SECTION_VMA:
+ {
+ const char *s;
+ int len;
+ char *name;
+ char *option = NULL;
+ bfd_vma val;
+ enum change_action what = CHANGE_IGNORE;
+
+ switch (c)
+ {
+ case OPTION_CHANGE_SECTION_ADDRESS:
+ option = "--change-section-address";
+ break;
+ case OPTION_CHANGE_SECTION_LMA:
+ option = "--change-section-lma";
+ break;
+ case OPTION_CHANGE_SECTION_VMA:
+ option = "--change-section-vma";
+ break;
+ }
+
+ s = strchr (optarg, '=');
+ if (s == NULL)
+ {
+ s = strchr (optarg, '+');
+ if (s == NULL)
+ {
+ s = strchr (optarg, '-');
+ if (s == NULL)
+ fatal (_("bad format for %s"), option);
+ }
+ }
+
+ len = s - optarg;
+ name = xmalloc (len + 1);
+ strncpy (name, optarg, len);
+ name[len] = '\0';
+
+ p = find_section_list (name, TRUE);
+
+ val = parse_vma (s + 1, option);
+
+ switch (*s)
+ {
+ case '=': what = CHANGE_SET; break;
+ case '-': val = - val; /* Drop through. */
+ case '+': what = CHANGE_MODIFY; break;
+ }
+
+ switch (c)
+ {
+ case OPTION_CHANGE_SECTION_ADDRESS:
+ p->change_vma = what;
+ p->vma_val = val;
+ /* Drop through. */
+
+ case OPTION_CHANGE_SECTION_LMA:
+ p->change_lma = what;
+ p->lma_val = val;
+ break;
+
+ case OPTION_CHANGE_SECTION_VMA:
+ p->change_vma = what;
+ p->vma_val = val;
+ break;
+ }
+ }
+ break;
+
+ case OPTION_CHANGE_ADDRESSES:
+ change_section_address = parse_vma (optarg, "--change-addresses");
+ change_start = change_section_address;
+ break;
+
+ case OPTION_CHANGE_WARNINGS:
+ change_warn = TRUE;
+ break;
+
+ case OPTION_CHANGE_LEADING_CHAR:
+ change_leading_char = TRUE;
+ break;
+
+ case OPTION_DEBUGGING:
+ convert_debugging = TRUE;
+ break;
+
+ case OPTION_GAP_FILL:
+ {
+ bfd_vma gap_fill_vma;
+
+ gap_fill_vma = parse_vma (optarg, "--gap-fill");
+ gap_fill = (bfd_byte) gap_fill_vma;
+ if ((bfd_vma) gap_fill != gap_fill_vma)
+ {
+ char buff[20];
+
+ sprintf_vma (buff, gap_fill_vma);
+
+ non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
+ buff, gap_fill);
+ }
+ gap_fill_set = TRUE;
+ }
+ break;
+
+ case OPTION_NO_CHANGE_WARNINGS:
+ change_warn = FALSE;
+ break;
+
+ case OPTION_PAD_TO:
+ pad_to = parse_vma (optarg, "--pad-to");
+ pad_to_set = TRUE;
+ break;
+
+ case OPTION_REMOVE_LEADING_CHAR:
+ remove_leading_char = TRUE;
+ break;
+
+ case OPTION_REDEFINE_SYM:
+ {
+ /* Push this redefinition onto redefine_symbol_list. */
+
+ int len;
+ const char *s;
+ const char *nextarg;
+ char *source, *target;
+
+ s = strchr (optarg, '=');
+ if (s == NULL)
+ fatal (_("bad format for %s"), "--redefine-sym");
+
+ len = s - optarg;
+ source = xmalloc (len + 1);
+ strncpy (source, optarg, len);
+ source[len] = '\0';
+
+ nextarg = s + 1;
+ len = strlen (nextarg);
+ target = xmalloc (len + 1);
+ strcpy (target, nextarg);
+
+ redefine_list_append ("--redefine-sym", source, target);
+
+ free (source);
+ free (target);
+ }
+ break;
+
+ case OPTION_REDEFINE_SYMS:
+ add_redefine_syms_file (optarg);
+ break;
+
+ case OPTION_SET_SECTION_FLAGS:
+ {
+ const char *s;
+ int len;
+ char *name;
+
+ s = strchr (optarg, '=');
+ if (s == NULL)
+ fatal (_("bad format for %s"), "--set-section-flags");
+
+ len = s - optarg;
+ name = xmalloc (len + 1);
+ strncpy (name, optarg, len);
+ name[len] = '\0';
+
+ p = find_section_list (name, TRUE);
+
+ p->set_flags = TRUE;
+ p->flags = parse_flags (s + 1);
+ }
+ break;
+
+ case OPTION_RENAME_SECTION:
+ {
+ flagword flags;
+ const char *eq, *fl;
+ char *old_name;
+ char *new_name;
+ unsigned int len;
+
+ eq = strchr (optarg, '=');
+ if (eq == NULL)
+ fatal (_("bad format for %s"), "--rename-section");
+
+ len = eq - optarg;
+ if (len == 0)
+ fatal (_("bad format for %s"), "--rename-section");
+
+ old_name = xmalloc (len + 1);
+ strncpy (old_name, optarg, len);
+ old_name[len] = 0;
+
+ eq++;
+ fl = strchr (eq, ',');
+ if (fl)
+ {
+ flags = parse_flags (fl + 1);
+ len = fl - eq;
+ }
+ else
+ {
+ flags = -1;
+ len = strlen (eq);
+ }
+
+ if (len == 0)
+ fatal (_("bad format for %s"), "--rename-section");
+
+ new_name = xmalloc (len + 1);
+ strncpy (new_name, eq, len);
+ new_name[len] = 0;
+
+ add_section_rename (old_name, new_name, flags);
+ }
+ break;
+
+ case OPTION_SET_START:
+ set_start = parse_vma (optarg, "--set-start");
+ set_start_set = TRUE;
+ break;
+
+ case OPTION_SREC_LEN:
+ Chunk = parse_vma (optarg, "--srec-len");
+ break;
+
+ case OPTION_SREC_FORCES3:
+ S3Forced = TRUE;
+ break;
+
+ case OPTION_STRIP_SYMBOLS:
+ add_specific_symbols (optarg, &strip_specific_list);
+ break;
+
+ case OPTION_KEEP_SYMBOLS:
+ add_specific_symbols (optarg, &keep_specific_list);
+ break;
+
+ case OPTION_LOCALIZE_SYMBOLS:
+ add_specific_symbols (optarg, &localize_specific_list);
+ break;
+
+ case OPTION_KEEPGLOBAL_SYMBOLS:
+ add_specific_symbols (optarg, &keepglobal_specific_list);
+ break;
+
+ case OPTION_WEAKEN_SYMBOLS:
+ add_specific_symbols (optarg, &weaken_specific_list);
+ break;
+
+ case OPTION_ALT_MACH_CODE:
+ use_alt_mach_code = atoi (optarg);
+ if (use_alt_mach_code <= 0)
+ fatal (_("alternate machine code index must be positive"));
+ break;
+
+ case OPTION_PREFIX_SYMBOLS:
+ prefix_symbols_string = optarg;
+ break;
+
+ case OPTION_PREFIX_SECTIONS:
+ prefix_sections_string = optarg;
+ break;
+
+ case OPTION_PREFIX_ALLOC_SECTIONS:
+ prefix_alloc_sections_string = optarg;
+ break;
+
+ case OPTION_READONLY_TEXT:
+ bfd_flags_to_set |= WP_TEXT;
+ bfd_flags_to_clear &= ~WP_TEXT;
+ break;
+
+ case OPTION_WRITABLE_TEXT:
+ bfd_flags_to_clear |= WP_TEXT;
+ bfd_flags_to_set &= ~WP_TEXT;
+ break;
+
+ case OPTION_PURE:
+ bfd_flags_to_set |= D_PAGED;
+ bfd_flags_to_clear &= ~D_PAGED;
+ break;
+
+ case OPTION_IMPURE:
+ bfd_flags_to_clear |= D_PAGED;
+ bfd_flags_to_set &= ~D_PAGED;
+ break;
+