From ed795c24e6269a10e74b9bc3c385e787bcc230fe Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 19 Sep 2022 09:09:04 -0700 Subject: [PATCH] ao-elftohex: Allow multiple elf files to be merged together This allows combining the flash loader and core firmware. Signed-off-by: Keith Packard --- ao-tools/ao-elftohex/ao-elftohex.1 | 6 ++--- ao-tools/ao-elftohex/ao-elftohex.c | 37 ++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/ao-tools/ao-elftohex/ao-elftohex.1 b/ao-tools/ao-elftohex/ao-elftohex.1 index e52e6f5a..0c1666c8 100644 --- a/ao-tools/ao-elftohex/ao-elftohex.1 +++ b/ao-tools/ao-elftohex/ao-elftohex.1 @@ -18,15 +18,15 @@ .\" .TH AO-LOAD 1 "ao-elftohex" "" .SH NAME -ao-elftohex \- convert a program to IHX format +ao-elftohex \- convert programs to IHX format .SH SYNOPSIS .B "ao-elftohex" [\--output-\fIoutput.ihx\fP] [\--verbose] -\fIinput.elf\fP +\fIinput.elf ...\fP .SH DESCRIPTION .I ao-elftohex -reads the specified .elf file and writes out a .ihx version. +reads the specified .elf files and writes out a .ihx version. .SH OPTIONS .TP \--output=\fIoutput.ihx\fP diff --git a/ao-tools/ao-elftohex/ao-elftohex.c b/ao-tools/ao-elftohex/ao-elftohex.c index f3ab0c38..7afd29c3 100644 --- a/ao-tools/ao-elftohex/ao-elftohex.c +++ b/ao-tools/ao-elftohex/ao-elftohex.c @@ -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 : ""); if (output) unlink(output); -- 2.30.2