9c2663
diff --git a/configure.ac b/configure.ac
9c2663
index 5de5c76..d3e31c3 100644
9c2663
--- a/configure.ac
9c2663
+++ b/configure.ac
9c2663
@@ -130,4 +130,12 @@ AC_ARG_ENABLE(tests,
9c2663
 	[enable_tests=yes])
9c2663
 AM_CONDITIONAL(BUILD_TESTS, [test $enable_tests != no])
9c2663
 
9c2663
+# GCC tries to be "helpful" and only issue a warning for unrecognized
9c2663
+# attributes.  So we compile the test with Werror, so that if the
9c2663
+# attribute is not recognized the compilation fails
9c2663
+AC_LANG(C)
9c2663
+AC_LANG_WERROR
9c2663
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[__attribute__ ((symver ("foo@foo_1"))) void frob (void) { }]])],
9c2663
+                  [AC_DEFINE([HAVE_ATTRIBUTE_SYMVER], [1], [Checking for symver attribute])], [])
9c2663
+
9c2663
 AC_OUTPUT
9c2663
diff --git a/src/lib/connectx.c b/src/lib/connectx.c
9c2663
index 5f4552b..2a21e3a 100644
9c2663
--- a/src/lib/connectx.c
9c2663
+++ b/src/lib/connectx.c
9c2663
@@ -26,6 +26,18 @@
9c2663
 #include <stdlib.h>
9c2663
 #include <string.h>
9c2663
 #include <fcntl.h>
9c2663
+#include "config.h"
9c2663
+
9c2663
+#define __SYMPFX(pfx, sym) #pfx sym
9c2663
+#define _SYMPFX(pfx, sym) __SYMPFX(pfx, sym)
9c2663
+#define SYMPFX(sym) _SYMPFX(__USER_LABEL_PREFIX__, #sym)
9c2663
+
9c2663
+#if HAVE_ATTRIBUTE_SYMVER
9c2663
+#define SYMVER(name, name2) __attribute__ ((symver (SYMPFX(name2))))
9c2663
+#else
9c2663
+#define SYMVER(name, name2) __asm__(".symver " SYMPFX(name) "," SYMPFX(name2));
9c2663
+#endif
9c2663
+
9c2663
 
9c2663
 /* Support the sctp_connectx() interface.
9c2663
  *
9c2663
@@ -64,6 +76,7 @@ static int __connectx_addrsize(const struct sockaddr *addrs,
9c2663
 }
9c2663
 			
9c2663
 
9c2663
+SYMVER(__sctp_connectx, sctp_connectx@)
9c2663
 int __sctp_connectx(int fd, struct sockaddr *addrs, int addrcnt)
9c2663
 {
9c2663
 	int addrs_size = __connectx_addrsize(addrs, addrcnt);
9c2663
@@ -75,6 +88,7 @@ int __sctp_connectx(int fd, struct sockaddr *addrs, int addrcnt)
9c2663
 			    addrs_size);
9c2663
 }
9c2663
 
9c2663
+SYMVER(sctp_connectx_orig, sctp_connectx@VERS_1)
9c2663
 extern int sctp_connectx_orig (int)
9c2663
 	__attribute ((alias ("__sctp_connectx")));
9c2663
 
9c2663
@@ -114,6 +128,7 @@ static int __connectx(int fd, struct sockaddr *addrs, socklen_t addrs_size,
9c2663
 			  addrs, addrs_size);
9c2663
 }
9c2663
 
9c2663
+SYMVER(sctp_connectx2, sctp_connectx@VERS_2)
9c2663
 int sctp_connectx2(int fd, struct sockaddr *addrs, int addrcnt,
9c2663
 		      sctp_assoc_t *id)
9c2663
 {
9c2663
@@ -125,6 +140,7 @@ int sctp_connectx2(int fd, struct sockaddr *addrs, int addrcnt,
9c2663
 	return __connectx(fd, addrs, addrs_size, id);
9c2663
 }
9c2663
 
9c2663
+SYMVER(sctp_connectx3, sctp_connectx@@VERS_3)
9c2663
 int sctp_connectx3(int fd, struct sockaddr *addrs, int addrcnt,
9c2663
 		      sctp_assoc_t *id)
9c2663
 {
9c2663
@@ -179,12 +195,3 @@ int sctp_connectx3(int fd, struct sockaddr *addrs, int addrcnt,
9c2663
 	return __connectx(fd, addrs, addrs_size, id);
9c2663
 }
9c2663
 
9c2663
-#define __SYMPFX(pfx, sym) #pfx sym
9c2663
-#define _SYMPFX(pfx, sym) __SYMPFX(pfx, sym)
9c2663
-#define SYMPFX(sym) _SYMPFX(__USER_LABEL_PREFIX__, #sym)
9c2663
-#define SYMVER(name, name2) __asm__(".symver " SYMPFX(name) "," SYMPFX(name2))
9c2663
-
9c2663
-SYMVER(__sctp_connectx, sctp_connectx@);
9c2663
-SYMVER(sctp_connectx_orig, sctp_connectx@VERS_1);
9c2663
-SYMVER(sctp_connectx2, sctp_connectx@VERS_2);
9c2663
-SYMVER(sctp_connectx3, sctp_connectx@@VERS_3);