Port to musl: musl doesn't have execinfo.h.
authorDoug Evans <dje@google.com>
Thu, 19 Nov 2015 23:57:23 +0000 (15:57 -0800)
committerchrome-bot <chrome-bot@chromium.org>
Thu, 7 Jan 2016 09:46:35 +0000 (01:46 -0800)
Change-Id: Idc2f18880581d3a2e67185becee8b77cfa5cdf04
Reviewed-on: https://chromium-review.googlesource.com/313388
Commit-Ready: Doug Evans <dje@google.com>
Tested-by: Doug Evans <dje@google.com>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Makefile
firmware/stub/vboot_api_stub_sf.c

index d066916..944ae73 100644 (file)
--- a/Makefile
+++ b/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++
index 3c5ec85..76d45ee 100644 (file)
@@ -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 <execinfo.h>
+#endif
+
 #include <stdint.h>
 
 #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);
        }