add infrastructure to record and report the version of libc.so
authorRich Felker <dalias@aerifal.cx>
Sun, 1 Dec 2013 22:27:25 +0000 (17:27 -0500)
committerRich Felker <dalias@aerifal.cx>
Sun, 1 Dec 2013 22:27:25 +0000 (17:27 -0500)
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.

Makefile
VERSION [new file with mode: 0644]
src/internal/version.c [new file with mode: 0644]
src/ldso/dynlink.c
tools/version.sh [new file with mode: 0644]

index 7ac58d486c3ca803f07223c50c68dd0a218d17ba..69ab304b3a2ce509444ff6e543494aa981b08893 100644 (file)
--- 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 (file)
index 0000000..6d44d22
--- /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 (file)
index 0000000..16554ba
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef SHARED
+
+#include "version.h"
+
+static const char version[] = VERSION;
+
+const char *__libc_get_version()
+{
+       return version;
+}
+
+#endif
index 174df572cc21c590e6981d7bf40e317b4c3db40d..27d92f2b0a647b87c40574b3c7293954d0e59f93 100644 (file)
@@ -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 (file)
index 0000000..f1cc594
--- /dev/null
@@ -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