$(LN_S) $(notdir $<) $@)
endif
+# libtool will not create a shared library that is not installed. Workaround
+# this by creating it by ourselves
+CREATE_SHARED_OVERRIDE_LIB = \
+ $(AM_V_CCLD)gcc -fPIC $(AM_CPPFLAGS) $(AM_CFLAGS) -shared $^ \
+ -o $@ $(AM_LDFLAGS) -ldl
+
+testsuite/uname.so: testsuite/uname.c
+ $(CREATE_SHARED_OVERRIDE_LIB)
+
+EXTRA_DIST += testsuite/uname.c
+CLEANFILES += testsuite/uname.so
+
check_LTLIBRARIES = testsuite/libtestsuite.la
testsuite_libtestsuite_la_SOURCES = testsuite/testsuite.c \
testsuite/testsuite.h
--- /dev/null
+#include <errno.h>
+#include <dlfcn.h>
+#include <sys/utsname.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "testsuite.h"
+
+TS_EXPORT int uname(struct utsname *u)
+{
+ static void *nextlib = NULL;
+ static int (*nextlib_uname)(struct utsname *u);
+ const char *release = getenv(S_TC_UNAME_R);
+ int err;
+ size_t sz;
+
+ if (release == NULL) {
+ fprintf(stderr, "TRAP uname(): missing export %s?\n",
+ S_TC_UNAME_R);
+ errno = EFAULT;
+ return -1;
+ }
+
+ if (nextlib == NULL) {
+#ifdef RTLD_NEXT
+ nextlib = RTLD_NEXT;
+#else
+ nextlib = dlopen("libc.so.6", RTLD_LAZY);
+#endif
+ nextlib_uname = dlsym(nextlib, "uname");
+ }
+
+ err = nextlib_uname(u);
+ if (err < 0)
+ return err;
+
+ sz = strlen(release) + 1;
+ if (sz > sizeof(u->release)) {
+ fprintf(stderr, "uname(): sizeof release (%s) "
+ "is greater than available space: %lu",
+ release, sizeof(u->release));
+ errno = -EFAULT;
+ return -1;
+ }
+
+ memcpy(u->release, release, sz);
+ return 0;
+}