ao-elftohex: Add '-n' option to elide symbol table from output
[fw/altos] / ao-tools / ao-elftohex / ao-elftohex.c
index f3ab0c38ca4a1fdeff140e14a553979b1aeecff6..a31f9656f6cd80a88d11f6eded1d9b4f008eef68 100644 (file)
@@ -27,6 +27,7 @@
 static const struct option options[] = {
        { .name = "verbose", .has_arg = 1, .val = 'v' },
        { .name = "output", .has_arg = 1, .val = 'o' },
+       { .name = "nosym", .has_arg = 0, .val = 'n' },
        { 0, 0, 0, 0},
 };
 
@@ -52,13 +53,15 @@ main (int argc, char **argv)
 {
        char                    *input = NULL;
        char                    *output = NULL;
-       struct ao_hex_image     *image;
-       struct ao_sym           *file_symbols;
+       struct ao_hex_image     *full_image = NULL;
+       struct ao_sym           *file_symbols = NULL;
        int                     num_file_symbols;
        FILE                    *file;
        int                     c;
+       int                     i;
+       int                     nosym = 0;
 
-       while ((c = getopt_long(argc, argv, "v:o:", options, NULL)) != -1) {
+       while ((c = getopt_long(argc, argv, "nv:o:", options, NULL)) != -1) {
                switch (c) {
                case 'o':
                        output = optarg;
@@ -66,23 +69,50 @@ main (int argc, char **argv)
                case 'v':
                        ao_verbose = (int) strtol(optarg, NULL, 0);
                        break;
+               case 'n':
+                       nosym = 1;
+                       break;
                default:
                        usage(argv[0]);
                        break;
                }
        }
 
-       input = argv[optind];
-       if (input == NULL)
+       if (optind >= argc)
                usage(argv[0]);
 
-       if (ends_with (input, ".ihx"))
-               image = ao_hex_load(input, &file_symbols, &num_file_symbols);
-       else
-               image = ao_load_elf(input, &file_symbols, &num_file_symbols);
+       for (i = optind; i < argc; i++) {
+               struct ao_hex_image *image;
 
-       if (!image)
-               usage(argv[0]);
+               input = argv[i];
+
+               free(file_symbols);
+               num_file_symbols = 0;
+               if (ends_with (input, ".ihx"))
+                       image = ao_hex_load(input, &file_symbols, &num_file_symbols);
+               else
+                       image = ao_load_elf(input, &file_symbols, &num_file_symbols);
+
+               if (!image) {
+                       fprintf(stderr, "Failed to load %s\n", input);
+                       usage(argv[0]);
+               }
+
+               if (nosym) {
+                       free(file_symbols);
+                       file_symbols = NULL;
+                       num_file_symbols = 0;
+               }
+
+               if (full_image) {
+                       full_image = ao_hex_image_cat(full_image, image);
+                       if (!full_image) {
+                               fprintf(stderr, "Can't merge image %s\n", input);
+                               usage(argv[0]);
+                       }
+               } else
+                       full_image = image;
+       }
 
        if (!output)
                file = stdout;
@@ -94,7 +124,7 @@ main (int argc, char **argv)
                }
        }
 
-       if (!ao_hex_save(file, image, file_symbols, num_file_symbols)) {
+       if (!ao_hex_save(file, full_image, file_symbols, num_file_symbols)) {
                fprintf(stderr, "%s: failed to write hex file\n", output ? output : "<stdout>");
                if (output)
                        unlink(output);