commit 1ce128d22448271b6d991006b58e7348beb21bb2
parent 5f3d92572d243a0df47816971d44f64e6ccad5e7
Author: Brian Swetland <swetland@frotz.net>
Date:   Sun, 14 Jun 2015 21:26:35 -0700
mkbuiltins: tool to bundle binaries into executable
Diffstat:
2 files changed, 143 insertions(+), 0 deletions(-)
diff --git a/tools/mkbuiltins.c b/tools/mkbuiltins.c
@@ -0,0 +1,133 @@
+/* mkbuiltin.c
+ *
+ * Copyright 2011 Brian Swetland <swetland@frotz.net>
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+
+void *load_file(const char *fn, size_t *_sz) {
+	int fd;
+	off_t sz;
+	void *data = NULL;
+	fd = open(fn, O_RDONLY);
+	if (fd < 0) goto fail;
+	sz = lseek(fd, 0, SEEK_END);
+	if (sz < 0) goto fail;
+	if (lseek(fd, 0, SEEK_SET)) goto fail;
+	if ((data = malloc(sz + 4)) == NULL) goto fail;
+	if (read(fd, data, sz) != sz) goto fail;
+	*_sz = sz;
+	return data;
+fail:
+	if (data) free(data);
+	if (fd >= 0) close(fd);
+	return NULL;
+}
+
+typedef struct entry {
+	struct entry *next;
+	const char *fn;
+	void *data;
+	size_t sz;
+} entry;
+
+entry *first = NULL, *last = NULL;
+
+int import(const char *fn) {
+	char *x;
+	entry *e = malloc(sizeof(entry));
+	if (e == NULL) return -1;
+	e->data = load_file(fn, &e->sz);
+	if (e->data == NULL) return -1;
+	if ((x = strrchr(fn, '/'))) {
+		e->fn = x + 1;
+	} else {
+		e->fn = fn;
+	}
+	e->next = NULL;
+	if (last) {
+		last->next = e;
+	} else {
+		first = e;
+	}
+	last = e;
+	return 0;
+}
+
+void exportline(unsigned char *x, int len) {
+	printf("\t\"");
+	while (len > 0) {
+		printf("\\x%02X", *x++);
+		len--;
+	}
+	printf("\"\n");
+}
+
+void export(entry *e) {
+	unsigned char *x = e->data;
+	size_t len = e->sz;
+	printf("\t{ \"%s\", %zu,\n", e->fn, e->sz);
+	while (len > 0) {
+		int xfer = (len > 16) ? 16 : len;
+		exportline(x, xfer);
+		x += xfer;
+		len -= xfer;
+	}
+	printf("\t},\n");
+}
+
+int main(int argc, char **argv) {
+	entry *e;
+
+	while (argc > 1) {
+		if (import(argv[1])) return -1;
+		argc--;
+		argv++;
+	}
+
+	printf(
+"/* this file is machine-generated by mkbuiltins -- do not modify */\n\n"
+"#include <string.h>\n"
+"#include <stdint.h>\n\n"
+"static struct {\n"
+"	const char *name;\n"
+"	size_t size;\n"
+"	void *data;\n"
+"} files[] = {\n"
+	);
+	for (e = first; e != NULL; e = e->next) {
+		export(e);
+	}
+	printf(
+"};\n\n"
+"void *get_builtin_file(const char *name, size_t *sz) {\n"
+"	int n;\n"
+"	for (n = 0; n < (sizeof(files)/sizeof(files[0])); n++) {\n"
+"		if (!strcmp(name, files[n].name)) {\n"
+"			*sz = files[n].size;\n"
+"			return files[n].data;\n"
+"		}\n"
+"	}\n"
+"	return NULL;\n"
+"}\n"
+	);
+
+	return 0;
+}
+
diff --git a/tools/module.mk b/tools/module.mk
@@ -7,8 +7,14 @@ M_OBJS += tools/debugger-commands.o
 M_OBJS += tools/rswdp.o
 M_OBJS += tools/linenoise.o
 M_OBJS += tools/usb.o
+M_OBJS += out/debugger-builtins.o
 $(call build-host-executable)
 
+AGENTS := out/agent-lpc13xx.bin out/agent-lpc15xx.bin
+out/debugger-builtins.c: $(AGENTS) bin/mkbuiltins
+	@mkdir -p out
+	./bin/mkbuiltins $(AGENTS) > $@	
+
 M_NAME := gdb-bridge
 M_OBJS := tools/gdb-bridge.o
 M_OBJS += tools/debugger-core.o
@@ -16,6 +22,7 @@ M_OBJS += tools/debugger-commands.o
 M_OBJS += tools/rswdp.o
 M_OBJS += tools/linenoise.o
 M_OBJS += tools/usb.o
+M_OBJS += out/debugger-builtins.o
 $(call build-host-executable)
 
 M_NAME := stm32boot
@@ -44,3 +51,6 @@ M_NAME := uconsole
 M_OBJS := tools/uconsole.o tools/usb.o
 $(call build-host-executable)
 
+M_NAME := mkbuiltins
+M_OBJS := tools/mkbuiltins.o
+$(call build-host-executable)