syslog2stderr dynamic library

The SoftHSM library writes to the system logs. Preload this library to
make it write to stderr instead.
diff --git a/programs/.gitignore b/programs/.gitignore
index 27055b8..05fb0b6 100644
--- a/programs/.gitignore
+++ b/programs/.gitignore
@@ -49,6 +49,7 @@
 test/udp_proxy
 util/pem2der
 util/strerror
+util/syslog2stderr.so
 x509/cert_app
 x509/cert_req
 x509/crl_app
diff --git a/programs/Makefile b/programs/Makefile
index 443689b..163059b 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -277,6 +277,12 @@
 	echo "  CC    x509/req_app.c"
 	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) x509/req_app.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@
 
+ifndef WINDOWS
+util/syslog2stderr.so: util/syslog2stderr.c
+	echo "  CC    util/syslog2stderr.c"
+	$(CC) $(CFLAGS) -fPIC -shared -o $@ $< -ldl
+endif
+
 clean:
 ifndef WINDOWS
 	rm -f $(APPS)
diff --git a/programs/util/syslog2stderr.c b/programs/util/syslog2stderr.c
new file mode 100644
index 0000000..6a636ec
--- /dev/null
+++ b/programs/util/syslog2stderr.c
@@ -0,0 +1,41 @@
+#include <dlfcn.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+
+
+void openlog( const char *ident, int option, int facility )
+{
+    (void) ident;
+    (void) option;
+    (void) facility;
+}
+
+/* POSIX API */
+void syslog( int priority, const char *format, ... )
+{
+    va_list args;
+    va_start( args, format );
+    vfprintf( stderr, format, args );
+    va_end( args );
+}
+
+/* Linux ABI
+ * http://refspecs.linux-foundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/libc---syslog-chk-1.html
+ */
+void __syslog_chk( int priority, int flag, const char *format, ... )
+{
+    va_list args;
+    (int) flag;
+    va_start( args, format );
+    vfprintf( stderr, format, args );
+    fputc( '\n', stderr );
+    va_end( args );
+}
+
+void closelog( void )
+{
+    /* no-op */
+}