From: Roland Dreier Quite a few functions in lib/string.c are not exported. I ran into this trying to use strnchr() in a module. This patch - exports every function defined in lib/string.c - adds some missing __HAVE_ARCH_xxx defines for i386 - gets rid of the exports of functions from lib/string.c in arch/s390 (BTW, why is s390 exporting things NOVERS?) Signed-off-by: Roland Dreier Signed-off-by: Andrew Morton --- 25-akpm/arch/s390/lib/string.c | 9 --------- 25-akpm/include/asm-i386/string.h | 8 ++++++++ 25-akpm/lib/string.c | 22 +++++++++++++++++++++- 3 files changed, 29 insertions(+), 10 deletions(-) diff -puN arch/s390/lib/string.c~export-all-functions-in-lib-stringc arch/s390/lib/string.c --- 25/arch/s390/lib/string.c~export-all-functions-in-lib-stringc 2004-07-26 18:01:37.068971080 -0700 +++ 25-akpm/arch/s390/lib/string.c 2004-07-26 18:01:37.076969864 -0700 @@ -394,12 +394,3 @@ void *memset(void *s, int c, size_t n) return s; } EXPORT_SYMBOL_NOVERS(memset); - -/* - * missing exports for string functions defined in lib/string.c - */ -EXPORT_SYMBOL_NOVERS(memmove); -EXPORT_SYMBOL_NOVERS(strchr); -EXPORT_SYMBOL_NOVERS(strnchr); -EXPORT_SYMBOL_NOVERS(strncmp); -EXPORT_SYMBOL_NOVERS(strpbrk); diff -puN include/asm-i386/string.h~export-all-functions-in-lib-stringc include/asm-i386/string.h --- 25/include/asm-i386/string.h~export-all-functions-in-lib-stringc 2004-07-26 18:01:37.070970776 -0700 +++ 25-akpm/include/asm-i386/string.h 2004-07-26 18:01:37.076969864 -0700 @@ -27,6 +27,7 @@ */ #if !defined(IN_STRING_C) +#define __HAVE_ARCH_STRCPY static inline char * strcpy(char * dest,const char *src) { int d0, d1, d2; @@ -40,6 +41,7 @@ __asm__ __volatile__( return dest; } +#define __HAVE_ARCH_STRNCPY static inline char * strncpy(char * dest,const char *src,size_t count) { int d0, d1, d2, d3; @@ -58,6 +60,7 @@ __asm__ __volatile__( return dest; } +#define __HAVE_ARCH_STRCAT static inline char * strcat(char * dest,const char * src) { int d0, d1, d2, d3; @@ -74,6 +77,7 @@ __asm__ __volatile__( return dest; } +#define __HAVE_ARCH_STRNCAT static inline char * strncat(char * dest,const char * src,size_t count) { int d0, d1, d2, d3; @@ -96,6 +100,7 @@ __asm__ __volatile__( return dest; } +#define __HAVE_ARCH_STRCMP static inline int strcmp(const char * cs,const char * ct) { int d0, d1; @@ -116,6 +121,7 @@ __asm__ __volatile__( return __res; } +#define __HAVE_ARCH_STRNCMP static inline int strncmp(const char * cs,const char * ct,size_t count) { register int __res; @@ -138,6 +144,7 @@ __asm__ __volatile__( return __res; } +#define __HAVE_ARCH_STRCHR static inline char * strchr(const char * s, int c) { int d0; @@ -156,6 +163,7 @@ __asm__ __volatile__( return __res; } +#define __HAVE_ARCH_STRRCHR static inline char * strrchr(const char * s, int c) { int d0, d1; diff -puN lib/string.c~export-all-functions-in-lib-stringc lib/string.c --- 25/lib/string.c~export-all-functions-in-lib-stringc 2004-07-26 18:01:37.072970472 -0700 +++ 25-akpm/lib/string.c 2004-07-26 18:01:37.077969712 -0700 @@ -75,6 +75,7 @@ char * strcpy(char * dest,const char *sr /* nothing */; return tmp; } +EXPORT_SYMBOL(strcpy); #endif #ifndef __HAVE_ARCH_STRNCPY @@ -98,6 +99,7 @@ char * strncpy(char * dest,const char *s } return dest; } +EXPORT_SYMBOL(strncpy); #endif #ifndef __HAVE_ARCH_STRLCPY @@ -143,6 +145,7 @@ char * strcat(char * dest, const char * return tmp; } +EXPORT_SYMBOL(strcat); #endif #ifndef __HAVE_ARCH_STRNCAT @@ -172,6 +175,7 @@ char * strncat(char *dest, const char *s return tmp; } +EXPORT_SYMBOL(strncat); #endif #ifndef __HAVE_ARCH_STRLCAT @@ -218,6 +222,7 @@ int strcmp(const char * cs,const char * return __res; } +EXPORT_SYMBOL(strcmp); #endif #ifndef __HAVE_ARCH_STRNCMP @@ -239,6 +244,7 @@ int strncmp(const char * cs,const char * return __res; } +EXPORT_SYMBOL(strncmp); #endif #ifndef __HAVE_ARCH_STRCHR @@ -254,6 +260,7 @@ char * strchr(const char * s, int c) return NULL; return (char *) s; } +EXPORT_SYMBOL(strchr); #endif #ifndef __HAVE_ARCH_STRRCHR @@ -271,6 +278,7 @@ char * strrchr(const char * s, int c) } while (--p >= s); return NULL; } +EXPORT_SYMBOL(strrchr); #endif #ifndef __HAVE_ARCH_STRNCHR @@ -287,6 +295,7 @@ char *strnchr(const char *s, size_t coun return (char *) s; return NULL; } +EXPORT_SYMBOL(strnchr); #endif #ifndef __HAVE_ARCH_STRLEN @@ -302,6 +311,7 @@ size_t strlen(const char * s) /* nothing */; return sc - s; } +EXPORT_SYMBOL(strlen); #endif #ifndef __HAVE_ARCH_STRNLEN @@ -318,6 +328,7 @@ size_t strnlen(const char * s, size_t co /* nothing */; return sc - s; } +EXPORT_SYMBOL(strnlen); #endif #ifndef __HAVE_ARCH_STRSPN @@ -371,6 +382,7 @@ size_t strcspn(const char *s, const char return count; } +EXPORT_SYMBOL(strcspn); #ifndef __HAVE_ARCH_STRPBRK /** @@ -390,6 +402,7 @@ char * strpbrk(const char * cs,const cha } return NULL; } +EXPORT_SYMBOL(strpbrk); #endif #ifndef __HAVE_ARCH_STRSEP @@ -440,6 +453,7 @@ void * memset(void * s,int c,size_t coun return s; } +EXPORT_SYMBOL(memset); #endif #ifndef __HAVE_ARCH_BCOPY @@ -463,6 +477,7 @@ void bcopy(const void * srcp, void * des while (count--) *dest++ = *src++; } +EXPORT_SYMBOL(bcopy); #endif #ifndef __HAVE_ARCH_MEMCPY @@ -484,6 +499,7 @@ void * memcpy(void * dest,const void *sr return dest; } +EXPORT_SYMBOL(memcpy); #endif #ifndef __HAVE_ARCH_MEMMOVE @@ -514,6 +530,7 @@ void * memmove(void * dest,const void *s return dest; } +EXPORT_SYMBOL(memmove); #endif #ifndef __HAVE_ARCH_MEMCMP @@ -533,6 +550,7 @@ int memcmp(const void * cs,const void * break; return res; } +EXPORT_SYMBOL(memcmp); #endif #ifndef __HAVE_ARCH_MEMSCAN @@ -557,6 +575,7 @@ void * memscan(void * addr, int c, size_ } return (void *) p; } +EXPORT_SYMBOL(memscan); #endif #ifndef __HAVE_ARCH_STRSTR @@ -581,6 +600,7 @@ char * strstr(const char * s1,const char } return NULL; } +EXPORT_SYMBOL(strstr); #endif #ifndef __HAVE_ARCH_MEMCHR @@ -603,5 +623,5 @@ void *memchr(const void *s, int c, size_ } return NULL; } - +EXPORT_SYMBOL(memchr); #endif _