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.
This commit is contained in:
Rich Felker 2013-12-01 17:27:25 -05:00
parent 6ec82a3b58
commit 179ab5a505
5 changed files with 39 additions and 3 deletions

View File

@ -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)

1
VERSION Normal file
View File

@ -0,0 +1 @@
0.9.14

12
src/internal/version.c Normal file
View File

@ -0,0 +1,12 @@
#ifdef SHARED
#include "version.h"
static const char version[] = VERSION;
const char *__libc_get_version()
{
return version;
}
#endif

View 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);
}

12
tools/version.sh Normal file
View File

@ -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