ao-elftohex: Allow multiple elf files to be merged together
[fw/altos] / ao-tools / ao-elftohex / ao-elftohex.c
index f3ab0c38ca4a1fdeff140e14a553979b1aeecff6..7afd29c321ff5bc3b0e7d29d265c0c155cc605ee 100644 (file)
@@ -52,11 +52,12 @@ main (int argc, char **argv)
 {
        char                    *input = NULL;
        char                    *output = NULL;
-       struct ao_hex_image     *image;
+       struct ao_hex_image     *full_image = NULL;
        struct ao_sym           *file_symbols;
        int                     num_file_symbols;
        FILE                    *file;
        int                     c;
+       int                     i;
 
        while ((c = getopt_long(argc, argv, "v:o:", options, NULL)) != -1) {
                switch (c) {
@@ -72,17 +73,33 @@ main (int argc, char **argv)
                }
        }
 
-       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];
+
+               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 (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 +111,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);