Index: objcopy.c =================================================================== RCS file: /cvs/src/src/binutils/objcopy.c,v retrieving revision 1.47 diff -c -r1.47 objcopy.c *** objcopy.c 13 May 2003 11:15:59 -0000 1.47 --- objcopy.c 1 Jun 2003 01:32:51 -0000 *************** *** 105,111 **** static const char *lookup_sym_redefinition PARAMS((const char *)); static void redefine_list_append ! PARAMS ((const char *, const char *)); static const char * find_section_rename PARAMS ((bfd *, sec_ptr, flagword *)); static void add_section_rename --- 105,111 ---- static const char *lookup_sym_redefinition PARAMS((const char *)); static void redefine_list_append ! PARAMS ((const char *, const char *, const char *)); static const char * find_section_rename PARAMS ((bfd *, sec_ptr, flagword *)); static void add_section_rename *************** *** 263,269 **** #define OPTION_STRIP_UNNEEDED (OPTION_SET_START + 1) #define OPTION_WEAKEN (OPTION_STRIP_UNNEEDED + 1) #define OPTION_REDEFINE_SYM (OPTION_WEAKEN + 1) ! #define OPTION_SREC_LEN (OPTION_REDEFINE_SYM + 1) #define OPTION_SREC_FORCES3 (OPTION_SREC_LEN + 1) #define OPTION_STRIP_SYMBOLS (OPTION_SREC_FORCES3 + 1) #define OPTION_KEEP_SYMBOLS (OPTION_STRIP_SYMBOLS + 1) --- 263,270 ---- #define OPTION_STRIP_UNNEEDED (OPTION_SET_START + 1) #define OPTION_WEAKEN (OPTION_STRIP_UNNEEDED + 1) #define OPTION_REDEFINE_SYM (OPTION_WEAKEN + 1) ! #define OPTION_REDEFINE_SYMS (OPTION_REDEFINE_SYM + 1) ! #define OPTION_SREC_LEN (OPTION_REDEFINE_SYMS + 1) #define OPTION_SREC_FORCES3 (OPTION_SREC_LEN + 1) #define OPTION_STRIP_SYMBOLS (OPTION_SREC_FORCES3 + 1) #define OPTION_KEEP_SYMBOLS (OPTION_STRIP_SYMBOLS + 1) *************** *** 350,355 **** --- 351,357 ---- {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS}, {"preserve-dates", no_argument, 0, 'p'}, {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM}, + {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS}, {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR}, {"remove-section", required_argument, 0, 'R'}, {"rename-section", required_argument, 0, OPTION_RENAME_SECTION}, *************** *** 444,449 **** --- 446,453 ---- --change-leading-char Force output format's leading character style\n\ --remove-leading-char Remove leading character from global symbols\n\ --redefine-sym = Redefine symbol name to \n\ + --redefine-syms --redefine-sym for all symbol pairs \n\ + listed in \n\ --srec-len Restrict the length of generated Srecords\n\ --srec-forceS3 Restrict the type of generated Srecords to S3\n\ --strip-symbols -N for all symbols listed in \n\ *************** *** 940,946 **** /* Add a node to a symbol redefine list. */ static void ! redefine_list_append (source, target) const char *source; const char *target; { --- 944,951 ---- /* Add a node to a symbol redefine list. */ static void ! redefine_list_append (cause, source, target) ! const char *cause; const char *source; const char *target; { *************** *** 952,964 **** { if (strcmp (source, list->source) == 0) fatal (_("%s: Multiple redefinition of symbol \"%s\""), ! "--redefine-sym", ! source); if (strcmp (target, list->target) == 0) fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"), ! "--redefine-sym", ! target); } new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node)); --- 957,967 ---- { if (strcmp (source, list->source) == 0) fatal (_("%s: Multiple redefinition of symbol \"%s\""), ! cause, source); if (strcmp (target, list->target) == 0) fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"), ! cause, target); } new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node)); *************** *** 970,975 **** --- 973,1088 ---- *p = new_node; } + /* Handle the --redefine-syms option. Read lines containing "old new" + from the file, and add them to the symbol redefine list. */ + + void + add_redefine_syms_file (filename) + const char *filename; + { + FILE *file; + char *buf; + size_t bufsize, len, outsym_off; + int c, lineno; + + file = fopen (filename, "r"); + if (file == (FILE *) NULL) + fatal (_("couldn't open symbol redefinition file %s (error: %s)"), + filename, strerror (errno)); + + bufsize = 100; + buf = (char *) xmalloc (bufsize); + + lineno = 1; + c = getc (file); + len = 0; + outsym_off = 0; + while (c != EOF) + { + /* Collect the input symbol name. */ + while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF) + { + if (c == '#') + goto comment; + buf[len++] = c; + if (len >= bufsize) + { + bufsize *= 2; + buf = xrealloc (buf, bufsize); + } + c = getc (file); + } + buf[len++] = '\0'; + if (c == EOF) + break; + + /* Eat white space between the symbol names. */ + while (IS_WHITESPACE (c)) + c = getc (file); + if (c == '#' || IS_LINE_TERMINATOR (c)) + goto comment; + if (c == EOF) + break; + + /* Collect the output symbol name. */ + outsym_off = len; + while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF) + { + if (c == '#') + goto comment; + buf[len++] = c; + if (len >= bufsize) + { + bufsize *= 2; + buf = xrealloc (buf, bufsize); + } + c = getc (file); + } + buf[len++] = '\0'; + if (c == EOF) + break; + + /* Eat white space at end of line. */ + while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c)) + c = getc (file); + if (c == '#') + goto comment; + /* Handle \r\n. */ + if ((c == '\r' && (c = getc (file)) == '\n') + || c == '\n' || c == EOF) + { + end_of_line: + /* Append the redefinition to the list. */ + if (buf[0] != '\0') + redefine_list_append (filename, &buf[0], &buf[outsym_off]); + + lineno++; + len = 0; + outsym_off = 0; + if (c == EOF) + break; + c = getc (file); + continue; + } + else + fatal (_("%s: garbage at end of line %d"), filename, lineno); + comment: + if (len != 0 && (outsym_off == 0 || outsym_off == len)) + fatal (_("%s: missing new symbol name at line %d"), filename, lineno); + buf[len++] = '\0'; + + /* Eat the rest of the line and finish it. */ + while (c != '\n' && c != EOF) + c = getc (file); + goto end_of_line; + } + + if (len != 0) + fatal (_("%s: premature end of file at line %d"), filename, lineno); + + free (buf); + } + /* Keep only every `copy_byte'th byte in MEMHUNK, which is *SIZE bytes long. Adjust *SIZE. */ *************** *** 2547,2557 **** target = (char *) xmalloc (len + 1); strcpy (target, nextarg); ! redefine_list_append (source, target); free (source); free (target); } break; case OPTION_SET_SECTION_FLAGS: --- 2660,2674 ---- target = (char *) 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: Index: doc/binutils.texi =================================================================== RCS file: /cvs/src/src/binutils/doc/binutils.texi,v retrieving revision 1.39 diff -c -r1.39 binutils.texi *** doc/binutils.texi 24 Apr 2003 07:58:49 -0000 1.39 --- doc/binutils.texi 1 Jun 2003 01:32:54 -0000 *************** *** 958,963 **** --- 958,964 ---- [@option{--change-leading-char} ] [@option{--remove-leading-char}] [@option{--srec-len=}@var{ival} ] [@option{--srec-forceS3}] [@option{--redefine-sym} @var{old}=@var{new} ] + [@option{--redefine-syms=}@var{filename} ] [@option{--weaken}] [@option{--keep-symbols=}@var{filename}] [@option{--strip-symbols=}@var{filename}] *************** *** 1283,1288 **** --- 1284,1295 ---- Change the name of a symbol @var{old}, to @var{new}. This can be useful when one is trying link two things together for which you have no source, and there are name collisions. + + @item --redefine-syms=@var{filename} + Apply @option{--redefine-sym} to each symbol pair "@var{old} @var{new}" + listed in the file @var{filename}. @var{filename} is simply a flat file, + with one symbol pair per line. Line comments may be introduced by the hash + character. This option may be given more than once. @item --weaken Change all global symbols in the file to be weak. This can be useful