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