summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2015-11-19 15:57:23 -0800
committerchrome-bot <chrome-bot@chromium.org>2016-01-07 01:46:35 -0800
commit58cb8c532b0909edb34d17c7fd32b0559b917eb9 (patch)
tree6aa5c6bf58273c1109a9553932fdc08d8e716282
parent7e0728dfca6d4f27c07434c9a6af468c966046a4 (diff)
downloadvboot-58cb8c532b0909edb34d17c7fd32b0559b917eb9.tar.gz
Port to musl: musl doesn't have execinfo.h.
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>
-rw-r--r--Makefile5
-rw-r--r--firmware/stub/vboot_api_stub_sf.c15
2 files changed, 20 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index d066916e..944ae739 100644
--- 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++
diff --git a/firmware/stub/vboot_api_stub_sf.c b/firmware/stub/vboot_api_stub_sf.c
index 3c5ec85a..76d45ee8 100644
--- a/firmware/stub/vboot_api_stub_sf.c
+++ b/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 <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);
}