Using current gcc CVS I hit a pieve of code in whcih the compiler was emitting
a memmove() call.  The kernel link failed.

Uninline it.

Also, move the memcpy and memset exports into memcpy.c.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/i386/kernel/i386_ksyms.c |    8 +-------
 25-akpm/arch/i386/lib/memcpy.c        |   29 +++++++++++++++++++++++++++--
 25-akpm/include/asm-i386/string.h     |   19 +------------------
 3 files changed, 29 insertions(+), 27 deletions(-)

diff -puN include/asm-i386/string.h~i386-uninline-memmove include/asm-i386/string.h
--- 25/include/asm-i386/string.h~i386-uninline-memmove	2004-06-24 04:15:26.295858368 -0700
+++ 25-akpm/include/asm-i386/string.h	2004-06-24 04:15:26.301857456 -0700
@@ -294,24 +294,7 @@ extern void __struct_cpy_bug (void);
 })
 
 #define __HAVE_ARCH_MEMMOVE
-static inline void * memmove(void * dest,const void * src, size_t n)
-{
-int d0, d1, d2;
-if (dest<src) {
-	memcpy(dest,src,n);
-} else
-__asm__ __volatile__(
-	"std\n\t"
-	"rep\n\t"
-	"movsb\n\t"
-	"cld"
-	: "=&c" (d0), "=&S" (d1), "=&D" (d2)
-	:"0" (n),
-	 "1" (n-1+(const char *)src),
-	 "2" (n-1+(char *)dest)
-	:"memory");
-return dest;
-}
+void *memmove(void * dest,const void * src, size_t n);
 
 #define memcmp __builtin_memcmp
 
diff -puN arch/i386/lib/memcpy.c~i386-uninline-memmove arch/i386/lib/memcpy.c
--- 25/arch/i386/lib/memcpy.c~i386-uninline-memmove	2004-06-24 04:15:26.296858216 -0700
+++ 25-akpm/arch/i386/lib/memcpy.c	2004-06-24 04:15:26.302857304 -0700
@@ -1,10 +1,11 @@
 #include <linux/config.h>
 #include <linux/string.h>
+#include <linux/module.h>
 
 #undef memcpy
 #undef memset
 
-void * memcpy(void * to, const void * from, size_t n)
+void *memcpy(void *to, const void *from, size_t n)
 {
 #ifdef CONFIG_X86_USE_3DNOW
 	return __memcpy3d(to, from, n);
@@ -12,8 +13,32 @@ void * memcpy(void * to, const void * fr
 	return __memcpy(to, from, n);
 #endif
 }
+EXPORT_SYMBOL_NOVERS(memcpy);
 
-void * memset(void * s, int c, size_t count)
+void *memset(void *s, int c, size_t count)
 {
 	return __memset(s, c, count);
 }
+EXPORT_SYMBOL_NOVERS(memset);
+
+void *memmove(void *dest, const void *src, size_t n)
+{
+	int d0, d1, d2;
+
+	if (dest < src) {
+		memcpy(dest,src,n);
+	} else {
+		__asm__ __volatile__(
+			"std\n\t"
+			"rep\n\t"
+			"movsb\n\t"
+			"cld"
+			: "=&c" (d0), "=&S" (d1), "=&D" (d2)
+			:"0" (n),
+			 "1" (n-1+(const char *)src),
+			 "2" (n-1+(char *)dest)
+			:"memory");
+	}
+	return dest;
+}
+EXPORT_SYMBOL_NOVERS(memmove);
diff -puN arch/i386/kernel/i386_ksyms.c~i386-uninline-memmove arch/i386/kernel/i386_ksyms.c
--- 25/arch/i386/kernel/i386_ksyms.c~i386-uninline-memmove	2004-06-24 04:15:26.298857912 -0700
+++ 25-akpm/arch/i386/kernel/i386_ksyms.c	2004-06-24 04:15:26.302857304 -0700
@@ -172,15 +172,9 @@ EXPORT_SYMBOL(rtc_lock);
 
 EXPORT_SYMBOL_GPL(set_nmi_callback);
 EXPORT_SYMBOL_GPL(unset_nmi_callback);
- 
-#undef memcpy
-#undef memset
+
 #undef memcmp
-extern void * memset(void *,int,__kernel_size_t);
-extern void * memcpy(void *,const void *,__kernel_size_t);
 extern int memcmp(const void *,const void *,__kernel_size_t);
-EXPORT_SYMBOL_NOVERS(memcpy);
-EXPORT_SYMBOL_NOVERS(memset);
 EXPORT_SYMBOL_NOVERS(memcmp);
 
 #ifdef CONFIG_HAVE_DEC_LOCK
_