Update to deal with attribute handling in recent kernels

diff --git a/include/endian.h b/include/endian.h
index 10dbbd8..44f89cc 100644
--- a/include/endian.h
+++ b/include/endian.h
@@ -5,6 +5,7 @@
 #ifndef _ENDIAN_H
 #define _ENDIAN_H
 
+#include <klibc/compiler.h>
 #include <asm/byteorder.h>
 
 /* Linux' asm/byteorder.h defines either __LITTLE_ENDIAN or
diff --git a/include/klibc/compiler.h b/include/klibc/compiler.h
index 64b8c54..49872b8 100644
--- a/include/klibc/compiler.h
+++ b/include/klibc/compiler.h
@@ -65,4 +65,38 @@
 # define __unusedfunc
 #endif
 
+/* "pure" function:
+
+     Many functions have no effects except the return value and their
+     return value depends only on the parameters and/or global
+     variables.  Such a function can be subject to common subexpression
+     elimination and loop optimization just as an arithmetic operator
+     would be.  These functions should be declared with the attribute
+     `pure'.
+*/
+#ifdef __GNUC__
+# define __attribute_pure__	__attribute__((pure))
+#else
+# define __attribute_pure__
+#endif
+
+/* "const" function:
+
+     Many functions do not examine any values except their arguments,
+     and have no effects except the return value.  Basically this is
+     just slightly more strict class than the `pure' attribute above,
+     since function is not allowed to read global memory.
+
+     Note that a function that has pointer arguments and examines the
+     data pointed to must _not_ be declared `const'.  Likewise, a
+     function that calls a non-`const' function usually must not be
+     `const'.  It does not make sense for a `const' function to return
+     `void'.
+*/
+#ifdef __GNUC__
+# define __attribute_const__	__attribute__((const))
+#else
+# define __attribute_const__
+#endif
+
 #endif
diff --git a/klibc/include/endian.h b/klibc/include/endian.h
index 10dbbd8..44f89cc 100644
--- a/klibc/include/endian.h
+++ b/klibc/include/endian.h
@@ -5,6 +5,7 @@
 #ifndef _ENDIAN_H
 #define _ENDIAN_H
 
+#include <klibc/compiler.h>
 #include <asm/byteorder.h>
 
 /* Linux' asm/byteorder.h defines either __LITTLE_ENDIAN or
diff --git a/klibc/include/klibc/compiler.h b/klibc/include/klibc/compiler.h
index 64b8c54..49872b8 100644
--- a/klibc/include/klibc/compiler.h
+++ b/klibc/include/klibc/compiler.h
@@ -65,4 +65,38 @@
 # define __unusedfunc
 #endif
 
+/* "pure" function:
+
+     Many functions have no effects except the return value and their
+     return value depends only on the parameters and/or global
+     variables.  Such a function can be subject to common subexpression
+     elimination and loop optimization just as an arithmetic operator
+     would be.  These functions should be declared with the attribute
+     `pure'.
+*/
+#ifdef __GNUC__
+# define __attribute_pure__	__attribute__((pure))
+#else
+# define __attribute_pure__
+#endif
+
+/* "const" function:
+
+     Many functions do not examine any values except their arguments,
+     and have no effects except the return value.  Basically this is
+     just slightly more strict class than the `pure' attribute above,
+     since function is not allowed to read global memory.
+
+     Note that a function that has pointer arguments and examines the
+     data pointed to must _not_ be declared `const'.  Likewise, a
+     function that calls a non-`const' function usually must not be
+     `const'.  It does not make sense for a `const' function to return
+     `void'.
+*/
+#ifdef __GNUC__
+# define __attribute_const__	__attribute__((const))
+#else
+# define __attribute_const__
+#endif
+
 #endif
diff --git a/nfsmount/main.c b/nfsmount/main.c
index 76ed806..a1bf347 100644
--- a/nfsmount/main.c
+++ b/nfsmount/main.c
@@ -5,13 +5,14 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <linux/nfs_mount.h>
 #include <arpa/inet.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
+#include <linux/nfs_mount.h>
+
 #include "nfsmount.h"
 #include "sunrpc.h"