about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-12-01 17:27:25 -0500
committerRich Felker <dalias@aerifal.cx>2013-12-01 17:27:25 -0500
commit179ab5a505c7060e2703015961173ee900eed780 (patch)
tree55636e19f1ebfe9d0a129c0021035ef95fdc3d99
parent6ec82a3b58ee1b873ff0dfad8fa9d41c3d25dcc0 (diff)
downloadmusl-179ab5a505c7060e2703015961173ee900eed780.tar.gz
musl-179ab5a505c7060e2703015961173ee900eed780.tar.xz
musl-179ab5a505c7060e2703015961173ee900eed780.zip
add infrastructure to record and report the version of libc.so
this is still experimental and subject to change. for git checkouts,
an attempt is made to record the exact revision to aid in bug reports
and debugging. no version information is recorded in the static libc.a
or binaries it's linked into.
-rw-r--r--Makefile8
-rw-r--r--VERSION1
-rw-r--r--src/internal/version.c12
-rw-r--r--src/ldso/dynlink.c9
-rw-r--r--tools/version.sh12
5 files changed, 39 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index 7ac58d48..69ab304b 100644
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,7 @@ SRCS = $(sort $(wildcard src/*/*.c arch/$(ARCH)/src/*.c))
 OBJS = $(SRCS:.c=.o)
 LOBJS = $(OBJS:.o=.lo)
 GENH = include/bits/alltypes.h
+GENH_INT = src/internal/version.h
 IMPH = src/internal/stdio_impl.h src/internal/pthread_impl.h src/internal/libc.h
 
 LDFLAGS = 
@@ -64,7 +65,7 @@ clean:
 	rm -f $(LOBJS)
 	rm -f $(ALL_LIBS) lib/*.[ao] lib/*.so
 	rm -f $(ALL_TOOLS)
-	rm -f $(GENH) 
+	rm -f $(GENH) $(GENH_INT)
 	rm -f include/bits
 
 distclean: clean
@@ -79,6 +80,11 @@ include/bits/alltypes.h.in: include/bits
 include/bits/alltypes.h: include/bits/alltypes.h.in include/alltypes.h.in tools/mkalltypes.sed
 	sed -f tools/mkalltypes.sed include/bits/alltypes.h.in include/alltypes.h.in > $@
 
+src/internal/version.h: $(wildcard VERSION .git .git/*)
+	printf '#define VERSION "%s"\n' "$$(sh tools/version.sh)" > $@
+
+src/internal/version.lo: src/internal/version.h
+
 src/ldso/dynlink.lo: arch/$(ARCH)/reloc.h
 
 crt/crt1.o crt/Scrt1.o: $(wildcard arch/$(ARCH)/crt_arch.h)
diff --git a/VERSION b/VERSION
new file mode 100644
index 00000000..6d44d227
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+0.9.14
diff --git a/src/internal/version.c b/src/internal/version.c
new file mode 100644
index 00000000..16554ba2
--- /dev/null
+++ b/src/internal/version.c
@@ -0,0 +1,12 @@
+#ifdef SHARED
+
+#include "version.h"
+
+static const char version[] = VERSION;
+
+const char *__libc_get_version()
+{
+	return version;
+}
+
+#endif
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index 174df572..27d92f2b 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -93,6 +93,8 @@ void __init_ssp(size_t *);
 void *__install_initial_tls(void *);
 void __init_libc(char **, char *);
 
+const char *__libc_get_version(void);
+
 static struct dso *head, *tail, *ldso, *fini_head;
 static char *env_path, *sys_path;
 static unsigned long long gencnt;
@@ -1040,8 +1042,11 @@ void *__dynlink(int argc, char **argv)
 		*argv++ = (void *)-1;
 		if (argv[0] && !strcmp(argv[0], "--")) *argv++ = (void *)-1;
 		if (!argv[0]) {
-			dprintf(2, "musl libc/dynamic program loader\n");
-			dprintf(2, "usage: %s pathname%s\n", ldname,
+			dprintf(2, "musl libc\n"
+				"Version %s\n"
+				"Dynamic Program Loader\n"
+				"Usage: %s [--] pathname%s\n",
+				__libc_get_version(), ldname,
 				ldd_mode ? "" : " [args]");
 			_exit(1);
 		}
diff --git a/tools/version.sh b/tools/version.sh
new file mode 100644
index 00000000..f1cc5948
--- /dev/null
+++ b/tools/version.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+if test -d .git ; then
+if type git >/dev/null 2>&1 ; then
+git describe --tags --match 'v[0-9]*' 2>/dev/null \
+| sed -e 's/^v//' -e 's/-/-git-/'
+else
+sed 's/$/-git/' < VERSION
+fi
+else
+cat VERSION
+fi