aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2016-09-01 11:20:05 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2016-11-17 11:36:55 +0100
commit3516b8b7558a69dfd06410b0c997d096a78221c9 (patch)
tree6e3d993f086e5fd3fd90f998e3d88988ac07ce7d
parentd3b66fbf88b07f7954ee5e7ceddab543bdd3a833 (diff)
Add libmissing
This patch adds a libmissing library to mtd-utils, containing implementations of functionality found in glibc but typically missing from embedded C libraries such as uclibc ot musl. For now, the library only contains stub implementations of the backtrace*() family of functions. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at> Signed-off-by: Richard Weinberger <richard@nod.at>
-rw-r--r--Makefile.am4
-rw-r--r--configure.ac3
-rw-r--r--include/libmissing.h15
-rw-r--r--lib/Makemodule.am5
-rw-r--r--lib/execinfo.c25
-rw-r--r--tests/fs-tests/Makemodule.am5
-rw-r--r--tests/fs-tests/integrity/integck.c2
7 files changed, 57 insertions, 2 deletions
diff --git a/Makefile.am b/Makefile.am
index 53c6ec3..686a747 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -10,6 +10,10 @@ if WITHOUT_LZO
AM_CPPFLAGS += -DWITHOUT_LZO
endif
+if HAVE_EXECINFO
+AM_CPPFLAGS += -DHAVE_EXECINFO
+endif
+
sbin_PROGRAMS =
sbin_SCRIPTS =
noinst_LIBRARIES =
diff --git a/configure.ac b/configure.ac
index 9c8666c..637d692 100644
--- a/configure.ac
+++ b/configure.ac
@@ -72,6 +72,9 @@ AC_ARG_WITH([lzo],
[AM_CONDITIONAL([WITHOUT_LZO], [false])])
+AC_CHECK_HEADERS([execinfo.h], [execinfo_found=yes])
+AM_CONDITIONAL([HAVE_EXECINFO], [test "x$execinfo_found" == "xyes"])
+
PKG_CHECK_MODULES(ZLIB, [ zlib ])
PKG_CHECK_MODULES(UUID, [ uuid ])
diff --git a/include/libmissing.h b/include/libmissing.h
new file mode 100644
index 0000000..c765f6d
--- /dev/null
+++ b/include/libmissing.h
@@ -0,0 +1,15 @@
+#ifndef LIBMISSING_H
+#define LIBMISSING_H
+
+#ifdef HAVE_EXECINFO
+#include <execinfo.h>
+#endif
+
+#ifndef HAVE_EXECINFO
+int backtrace(void **buffer, int size);
+char **backtrace_symbols(void *const *buffer, int size);
+void backtrace_symbols_fd(void *const *buffer, int size, int fd);
+#endif
+
+#endif /* LIBMISSING_H */
+
diff --git a/lib/Makemodule.am b/lib/Makemodule.am
index 2fd933d..b30a8aa 100644
--- a/lib/Makemodule.am
+++ b/lib/Makemodule.am
@@ -5,4 +5,7 @@ libmtd_a_SOURCES = \
lib/libmtd_legacy.c \
lib/libmtd_int.h
-noinst_LIBRARIES += libmtd.a
+libmissing_a_SOURCES = \
+ lib/execinfo.c
+
+noinst_LIBRARIES += libmtd.a libmissing.a
diff --git a/lib/execinfo.c b/lib/execinfo.c
new file mode 100644
index 0000000..a39df83
--- /dev/null
+++ b/lib/execinfo.c
@@ -0,0 +1,25 @@
+#include "libmissing.h"
+
+#ifndef HAVE_EXECINFO
+#define PROGRAM_NAME "libmissing"
+#include "common.h"
+
+int backtrace(void **buffer, int size)
+{
+ void *addr = __builtin_return_address(0);
+
+ errmsg("backtrace() is not implemented. Called from %p", addr);
+ return 0;
+}
+
+char **backtrace_symbols(void *const *buffer, int size)
+{
+ errmsg("backtrace_symbols() is not implemented");
+ return NULL;
+}
+
+void backtrace_symbols_fd(void *const *buffer, int size, int fd)
+{
+ errmsg("backtrace_symbols_fd() is not implemented");
+}
+#endif /* !HAVE_EXECINFO */
diff --git a/tests/fs-tests/Makemodule.am b/tests/fs-tests/Makemodule.am
index 031355a..d3acaa5 100644
--- a/tests/fs-tests/Makemodule.am
+++ b/tests/fs-tests/Makemodule.am
@@ -2,6 +2,11 @@ integck_SOURCES = tests/fs-tests/integrity/integck.c
integck_LDADD = libubi.a
integck_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/ubi-utils/include
+if HAVE_EXECINFO
+else
+integck_LDADD += libmissing.a
+endif
+
test_1_SOURCES = tests/fs-tests/simple/test_1.c tests/fs-tests/lib/tests.c
test_1_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/tests/fs-tests/lib
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c
index 67384fa..7cb5305 100644
--- a/tests/fs-tests/integrity/integck.c
+++ b/tests/fs-tests/integrity/integck.c
@@ -31,7 +31,6 @@
#include <getopt.h>
#include <assert.h>
#include <mntent.h>
-#include <execinfo.h>
#include <sys/mman.h>
#include <sys/vfs.h>
#include <sys/mount.h>
@@ -40,6 +39,7 @@
#define PROGRAM_NAME "integck"
#include "common.h"
#include "libubi.h"
+#include "libmissing.h"
/*
* WARNING! This is a dirty hack! The symbols for static functions are not