@@ -, +, @@ --- Makefile | 5 +++++ firmware/stub/vboot_api_stub_sf.c | 15 +++++++++++++++ 2 files changed, 20 insertions(+) --- a/Makefile +++ a/Makefile @@ -205,6 +205,11 @@ ifdef HAVE_MACOS CFLAGS += -DHAVE_MACOS -Wno-deprecated-declarations endif +# Musl doesn't have execinfo.h. +ifndef HAVE_MUSL + CFLAGS += -DHAVE_EXECINFO_H +endif + # And a few more default utilities LD = ${CC} CXX ?= g++ --- a/firmware/stub/vboot_api_stub_sf.c +++ a/firmware/stub/vboot_api_stub_sf.c @@ -5,7 +5,12 @@ * Stub implementations of firmware-provided API functions. */ +/* Musl doesn't have execinfo.h. + TODO(dje): Add a replacement (libunwind) if/when fnl needs it. */ +#ifdef HAVE_EXECINFO_H #include +#endif + #include #define _STUB_IMPLEMENTATION_ @@ -26,12 +31,15 @@ struct alloc_node { struct alloc_node *next; void *ptr; size_t size; +#ifdef HAVE_EXECINFO_H void *bt_buffer[MAX_STACK_LEVELS]; int bt_levels; +#endif }; static struct alloc_node *alloc_head; +#ifdef HAVE_EXECINFO_H static void print_stacktrace(void) { void *buffer[MAX_STACK_LEVELS]; @@ -40,6 +48,7 @@ static void print_stacktrace(void) // print to stderr (fd = 2), and remove this function from the trace backtrace_symbols_fd(buffer + 1, levels - 1, 2); } +#endif void *VbExMalloc(size_t size) { @@ -57,7 +66,9 @@ void *VbExMalloc(size_t size) node->next = alloc_head; node->ptr = p; node->size = size; +#ifdef HAVE_EXECINFO_H node->bt_levels = backtrace(node->bt_buffer, MAX_STACK_LEVELS); +#endif alloc_head = node; return p; @@ -86,7 +97,9 @@ void VbExFree(void *ptr) } else { fprintf(stderr, "\n>>>>>> Invalid VbExFree() %p\n", ptr); fflush(stderr); +#ifdef HAVE_EXECINFO_H print_stacktrace(); +#endif /* * Fall through and do the free() so we get normal error * handling. @@ -118,8 +131,10 @@ int vboot_api_stub_check_memory(void) next = node->next; fprintf(stderr, "\nptr=%p, size=%zd\n", node->ptr, node->size); fflush(stderr); +#ifdef HAVE_EXECINFO_H backtrace_symbols_fd(node->bt_buffer + 1, node->bt_levels - 1, 2); +#endif free(node); }