📄 objcopy.c
字号:
case 'g': case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */ strip_symbols = STRIP_DEBUG; break; case OPTION_STRIP_UNNEEDED: strip_symbols = STRIP_UNNEEDED; break; case 'K': add_specific_symbol (optarg, &keep_specific_list); break; case 'N': add_specific_symbol (optarg, &strip_specific_list); break; case 'o': output_file = optarg; break; case 'p': preserve_dates = true; break; case 'x': discard_locals = LOCALS_ALL; break; case 'X': discard_locals = LOCALS_START_L; break; case 'v': verbose = true; break; case 'V': show_version = true; break; case 0: break; /* we've been given a long option */ case 'h': strip_usage (stdout, 0); default: strip_usage (stderr, 1); } } if (show_version) print_version ("strip"); /* Default is to strip all symbols. */ if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF && strip_specific_list == NULL) strip_symbols = STRIP_ALL; if (output_target == (char *) NULL) output_target = input_target; i = optind; if (i == argc || (output_file != NULL && (i + 1) < argc)) strip_usage (stderr, 1); for (; i < argc; i++) { int hold_status = status; struct stat statbuf; char *tmpname; if (preserve_dates) { if (stat (argv[i], &statbuf) < 0) { non_fatal (_("%s: cannot stat: %s"), argv[i], strerror (errno)); continue; } } if (output_file != NULL) tmpname = output_file; else tmpname = make_tempname (argv[i]); status = 0; copy_file (argv[i], tmpname, input_target, output_target); if (status == 0) { if (preserve_dates) set_times (tmpname, &statbuf); if (output_file == NULL) smart_rename (tmpname, argv[i], preserve_dates); status = hold_status; } else unlink (tmpname); if (output_file == NULL) free (tmpname); } return 0;}static intcopy_main (argc, argv) int argc; char *argv[];{ char *input_filename = NULL, *output_filename = NULL; char *input_target = NULL, *output_target = NULL; boolean show_version = false; boolean change_warn = true; int c; struct section_list *p; struct stat statbuf; 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) { case 'b': copy_byte = atoi (optarg); if (copy_byte < 0) fatal (_("byte number must be non-negative")); break; case 'i': interleave = atoi (optarg); if (interleave < 1) fatal (_("interleave must be positive")); break; case 'I': case 's': /* "source" - 'I' is preferred */ input_target = optarg; break; case 'O': case 'd': /* "destination" - 'O' is preferred */ output_target = optarg; break; 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; case 'S': strip_symbols = STRIP_ALL; break; case 'g': strip_symbols = STRIP_DEBUG; break; case OPTION_STRIP_UNNEEDED: strip_symbols = STRIP_UNNEEDED; break; case 'K': add_specific_symbol (optarg, &keep_specific_list); break; case 'N': add_specific_symbol (optarg, &strip_specific_list); break; case 'L': add_specific_symbol (optarg, &localize_specific_list); break; case 'G': add_specific_symbol (optarg, &keepglobal_specific_list); break; case 'W': add_specific_symbol (optarg, &weaken_specific_list); break; case 'p': preserve_dates = true; break; case 'x': discard_locals = LOCALS_ALL; break; case 'X': discard_locals = LOCALS_START_L; break; case 'v': verbose = true; break; case 'V': show_version = true; break; case OPTION_WEAKEN: weaken = true; break; case OPTION_ADD_SECTION: { const char *s; struct stat st; struct section_add *pa; int len; char *name; FILE *f; s = strchr (optarg, '='); if (s == NULL) fatal (_("bad format for %s"), "--add-section"); if (stat (s + 1, & st) < 0) fatal (_("cannot stat: %s: %s"), s + 1, strerror (errno)); pa = (struct section_add *) xmalloc (sizeof (struct section_add)); len = s - optarg; name = (char *) xmalloc (len + 1); strncpy (name, optarg, len); name[len] = '\0'; pa->name = name; pa->filename = s + 1; pa->size = st.st_size; pa->contents = (bfd_byte *) xmalloc (pa->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 = (char *) 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 = (char *) xmalloc (len + 1); strncpy (source, optarg, len); source[len] = '\0'; nextarg = s + 1; len = strlen (nextarg); target = (char *) xmalloc (len + 1); strcpy (target, nextarg); redefine_list_append (source, target); free (source); free (target); } 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 = (char *) 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_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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -