diff --git a/lib/ldap.c b/lib/ldap.c
index 223c3fb556f5d6fad5f6e9a8245dc8210d6f78e2..7323788cf6e85e119a1966aab760a2af17341fcb 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -164,7 +164,11 @@ static dynafunc DynaGetFunction(const char *name)
 
 #if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL)
   if (libldap) {
-    func = (dynafunc)dlsym(libldap, name);
+    /* This typecast magic below was brought by Joe Halpin. In ISO C, you
+     * cannot typecast a data pointer to a function pointer, but that's
+     * exactly what we need to do here to avoid compiler warnings on picky
+     * compilers! */
+    *(void**) (&func) = dlsym(libldap, name);
   }
 #elif defined(WIN32)
   if (libldap) {