static const char *lookup_sym_redefinition
PARAMS((const char *));
static void redefine_list_append
- PARAMS ((const char *, const char *));
+ PARAMS ((const char *, const char *, const char *));
static const char * find_section_rename
PARAMS ((bfd *, sec_ptr, flagword *));
static void add_section_rename
#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_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)
{"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},
--change-leading-char Force output format's leading character style\n\
--remove-leading-char Remove leading character from global symbols\n\
--redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
+ --redefine-syms <file> --redefine-sym for all symbol pairs \n\
+ listed in <file>\n\
--srec-len <number> Restrict the length of generated Srecords\n\
--srec-forceS3 Restrict the type of generated Srecords to S3\n\
--strip-symbols <file> -N for all symbols listed in <file>\n\
/* Add a node to a symbol redefine list. */
static void
-redefine_list_append (source, target)
+redefine_list_append (cause, source, target)
+ const char *cause;
const char *source;
const char *target;
{
{
if (strcmp (source, list->source) == 0)
fatal (_("%s: Multiple redefinition of symbol \"%s\""),
- "--redefine-sym",
- source);
+ cause, source);
if (strcmp (target, list->target) == 0)
fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
- "--redefine-sym",
- target);
+ cause, target);
}
new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
*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. */
target = (char *) xmalloc (len + 1);
strcpy (target, nextarg);
- redefine_list_append (source, target);
+ 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;