diff options
-rw-r--r-- | binutils/ChangeLog | 10 | ||||
-rw-r--r-- | binutils/objcopy.c | 68 |
2 files changed, 74 insertions, 4 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index c516534..14c993c 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,13 @@ +Thu Dec 8 14:45:50 1994 Ken Raeburn <raeburn@cujo.cygnus.com> + + * objcopy.c (add_strip_symbol): Cast return value of xmalloc. + +Wed Nov 30 11:05:43 1994 Ian Lance Taylor <ian@rtl.cygnus.com> + + * ar.c (replace_members): Pass current->filename to normalize when + checking for duplicates, because the filename of a newly added + file will not have been normalized yet. + Thu Nov 17 15:00:13 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> * ar.c (main): Don't call do_quick_append if any of the archive diff --git a/binutils/objcopy.c b/binutils/objcopy.c index e752f4b..d1d03ae 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -28,6 +28,10 @@ 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 int is_strip_symbol PARAMS ((const char *)); +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;} @@ -116,6 +120,7 @@ static struct option strip_options[] = {"remove-section", required_argument, 0, 'R'}, {"strip-all", no_argument, 0, 's'}, {"strip-debug", no_argument, 0, 'S'}, + {"strip-symbol", required_argument, 0, 'N'}, {"target", required_argument, 0, 'F'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, @@ -158,6 +163,7 @@ static struct option copy_options[] = {"set-start", required_argument, 0, OPTION_SET_START}, {"strip-all", no_argument, 0, 'S'}, {"strip-debug", no_argument, 0, 'g'}, + {"strip-symbol", required_argument, 0, 'N'}, {"target", required_argument, 0, 'F'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, @@ -188,6 +194,7 @@ Usage: %s [-vVSgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-b byte]\n\ [--set-start=val] [--adjust-start=incr] [--adjust-vma=incr]\n\ [--adjust-section-vma=section{=,+,-}val] [--adjust-warnings]\n\ [--no-adjust-warnings] [--verbose] [--version] [--help]\n\ + [--strip-symbol symbol] [-N symbol]\n\ in-file [out-file]\n", program_name); exit (status); @@ -202,6 +209,7 @@ strip_usage (stream, status) 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] [--discard-all] [--discard-locals]\n\ + [--strip-symbol symbol] [-N symbol]\n\ [--remove-section=section] [--verbose] [--version] [--help] file...\n", program_name); exit (status); @@ -256,6 +264,44 @@ make_tempname (filename) return tmpname; } +/* Make a list of symbols to explicitly strip out. A linked list is + good enough for a small number from the command line, but this will + slow things down a lot if many symbols are being deleted. */ + +struct symlist +{ + const char *name; + struct symlist *next; +}; + +static struct symlist *strip_specific_list = NULL; + +static void +add_strip_symbol (name) + const char *name; +{ + struct symlist *tmp_list; + + tmp_list = (struct symlist *) xmalloc (sizeof (struct symlist)); + tmp_list->name = name; + tmp_list->next = strip_specific_list; + strip_specific_list = tmp_list; +} + +static int +is_strip_symbol (name) + const char *name; +{ + struct symlist *tmp_list; + + for (tmp_list = strip_specific_list; tmp_list; tmp_list = tmp_list->next) + { + if (strcmp (name, tmp_list->name) == 0) + return 1; + } + return 0; +} + /* Choose which symbol entries to copy; put the result in OSYMS. We don't copy in place, because that confuses the relocs. Return the number of symbols to print. */ @@ -286,6 +332,10 @@ filter_symbols (abfd, osyms, isyms, symcount) keep = discard_locals != locals_all && (discard_locals != locals_start_L || ! bfd_is_local_label (abfd, sym)); + + if (keep && is_strip_symbol (bfd_asymbol_name (sym))) + keep = 0; + if (keep) to[dst_count++] = sym; } @@ -475,7 +525,9 @@ copy_object (ibfd, obfd) nonfatal (bfd_get_filename (ibfd)); } - if (strip_symbols == strip_debug || discard_locals != locals_undef) + if (strip_symbols == strip_debug + || discard_locals != locals_undef + || strip_specific_list) { /* Mark symbols used in output relocations so that they are kept, even if they are local labels or static symbols. @@ -1121,7 +1173,7 @@ strip_main (argc, argv) boolean show_version = false; int c, i; - while ((c = getopt_long (argc, argv, "I:O:F:R:sSgxXVv", + while ((c = getopt_long (argc, argv, "I:O:F:R:sSgxXVvN:", strip_options, (int *) 0)) != EOF) { switch (c) @@ -1153,6 +1205,9 @@ strip_main (argc, argv) case 'g': strip_symbols = strip_debug; break; + case 'N': + add_strip_symbol (optarg); + break; case 'x': discard_locals = locals_all; break; @@ -1181,7 +1236,9 @@ strip_main (argc, argv) } /* Default is to strip all symbols. */ - if (strip_symbols == strip_undef && discard_locals == locals_undef) + if (strip_symbols == strip_undef + && discard_locals == locals_undef + && strip_specific_list == NULL) strip_symbols = strip_all; if (output_target == (char *) NULL) @@ -1223,7 +1280,7 @@ copy_main (argc, argv) int c; struct section_list *p; - while ((c = getopt_long (argc, argv, "b:i:I:s:O:d:F:R:SgxXVv", + while ((c = getopt_long (argc, argv, "b:i:I:s:O:d:F:R:SgxXVvN:", copy_options, (int *) 0)) != EOF) { switch (c) @@ -1270,6 +1327,9 @@ copy_main (argc, argv) case 'g': strip_symbols = strip_debug; break; + case 'N': + add_strip_symbol (optarg); + break; case 'x': discard_locals = locals_all; break; |