提交 0c28130b 编写于 作者: P Paolo 'Blaisorblade' Giarrusso 提交者: Linus Torvalds

[PATCH] x86_64: make string func definition work as intended

In include/asm-x86_64/string.h there are such comments:

/* Use C out of line version for memcmp */
#define memcmp __builtin_memcmp
int memcmp(const void * cs,const void * ct,size_t count);

This would mean that if the compiler does not decide to use __builtin_memcmp,
it emits a call to memcmp to be satisfied by the C out-of-line version in
lib/string.c.  What happens is that after preprocessing, in lib/string.i you
may find the definition of "__builtin_strcmp".

Actually, by accident, in the object you will find the definition of strcmp
and such (maybe a trick intended to redirect calls to __builtin_memcmp to the
default memcmp when the definition is not expanded); however, this particular
case is not a documented feature as far as I can see.

Also, the EXPORT_SYMBOL does not work, so it's duplicated in the arch.

I simply added some #undef to lib/string.c and removed the (now duplicated)
exports in x86-64 and UML/x86_64 subarchs (the second ones are introduced by
another patch I just posted for -mm).
Signed-off-by: NPaolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
CC: Andi Kleen <ak@suse.de>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 23352fc2
...@@ -169,10 +169,6 @@ EXPORT_SYMBOL(rtc_lock); ...@@ -169,10 +169,6 @@ EXPORT_SYMBOL(rtc_lock);
EXPORT_SYMBOL_GPL(set_nmi_callback); EXPORT_SYMBOL_GPL(set_nmi_callback);
EXPORT_SYMBOL_GPL(unset_nmi_callback); EXPORT_SYMBOL_GPL(unset_nmi_callback);
#undef memcmp
extern int memcmp(const void *,const void *,__kernel_size_t);
EXPORT_SYMBOL(memcmp);
EXPORT_SYMBOL(register_die_notifier); EXPORT_SYMBOL(register_die_notifier);
#ifdef CONFIG_HAVE_DEC_LOCK #ifdef CONFIG_HAVE_DEC_LOCK
EXPORT_SYMBOL(_atomic_dec_and_lock); EXPORT_SYMBOL(_atomic_dec_and_lock);
......
...@@ -14,9 +14,6 @@ EXPORT_SYMBOL(__up_wakeup); ...@@ -14,9 +14,6 @@ EXPORT_SYMBOL(__up_wakeup);
/*XXX: we need them because they would be exported by x86_64 */ /*XXX: we need them because they would be exported by x86_64 */
EXPORT_SYMBOL(__memcpy); EXPORT_SYMBOL(__memcpy);
EXPORT_SYMBOL(strcmp);
EXPORT_SYMBOL(strcat);
EXPORT_SYMBOL(strcpy);
/* Networking helper routines. */ /* Networking helper routines. */
/*EXPORT_SYMBOL(csum_partial_copy_from); /*EXPORT_SYMBOL(csum_partial_copy_from);
......
...@@ -139,35 +139,23 @@ EXPORT_SYMBOL_GPL(unset_nmi_callback); ...@@ -139,35 +139,23 @@ EXPORT_SYMBOL_GPL(unset_nmi_callback);
#undef memmove #undef memmove
#undef memchr #undef memchr
#undef strlen #undef strlen
#undef strcpy
#undef strncmp #undef strncmp
#undef strncpy #undef strncpy
#undef strchr #undef strchr
#undef strcmp
#undef strcpy
#undef strcat
#undef memcmp
extern void * memset(void *,int,__kernel_size_t); extern void * memset(void *,int,__kernel_size_t);
extern size_t strlen(const char *); extern size_t strlen(const char *);
extern void * memmove(void * dest,const void *src,size_t count); extern void * memmove(void * dest,const void *src,size_t count);
extern char * strcpy(char * dest,const char *src);
extern int strcmp(const char * cs,const char * ct);
extern void *memchr(const void *s, int c, size_t n); extern void *memchr(const void *s, int c, size_t n);
extern void * memcpy(void *,const void *,__kernel_size_t); extern void * memcpy(void *,const void *,__kernel_size_t);
extern void * __memcpy(void *,const void *,__kernel_size_t); extern void * __memcpy(void *,const void *,__kernel_size_t);
extern char * strcat(char *, const char *);
extern int memcmp(const void * cs,const void * ct,size_t count);
EXPORT_SYMBOL(memset); EXPORT_SYMBOL(memset);
EXPORT_SYMBOL(strlen); EXPORT_SYMBOL(strlen);
EXPORT_SYMBOL(memmove); EXPORT_SYMBOL(memmove);
EXPORT_SYMBOL(strcpy);
EXPORT_SYMBOL(strncmp); EXPORT_SYMBOL(strncmp);
EXPORT_SYMBOL(strncpy); EXPORT_SYMBOL(strncpy);
EXPORT_SYMBOL(strchr); EXPORT_SYMBOL(strchr);
EXPORT_SYMBOL(strcmp);
EXPORT_SYMBOL(strcat);
EXPORT_SYMBOL(strncat); EXPORT_SYMBOL(strncat);
EXPORT_SYMBOL(memchr); EXPORT_SYMBOL(memchr);
EXPORT_SYMBOL(strrchr); EXPORT_SYMBOL(strrchr);
...@@ -175,7 +163,6 @@ EXPORT_SYMBOL(strnlen); ...@@ -175,7 +163,6 @@ EXPORT_SYMBOL(strnlen);
EXPORT_SYMBOL(memscan); EXPORT_SYMBOL(memscan);
EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memcpy);
EXPORT_SYMBOL(__memcpy); EXPORT_SYMBOL(__memcpy);
EXPORT_SYMBOL(memcmp);
#ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM
/* prototypes are wrong, these are assembly with custom calling functions */ /* prototypes are wrong, these are assembly with custom calling functions */
......
...@@ -65,6 +65,7 @@ EXPORT_SYMBOL(strnicmp); ...@@ -65,6 +65,7 @@ EXPORT_SYMBOL(strnicmp);
* @dest: Where to copy the string to * @dest: Where to copy the string to
* @src: Where to copy the string from * @src: Where to copy the string from
*/ */
#undef strcpy
char * strcpy(char * dest,const char *src) char * strcpy(char * dest,const char *src)
{ {
char *tmp = dest; char *tmp = dest;
...@@ -132,6 +133,7 @@ EXPORT_SYMBOL(strlcpy); ...@@ -132,6 +133,7 @@ EXPORT_SYMBOL(strlcpy);
* @dest: The string to be appended to * @dest: The string to be appended to
* @src: The string to append to it * @src: The string to append to it
*/ */
#undef strcat
char * strcat(char * dest, const char * src) char * strcat(char * dest, const char * src)
{ {
char *tmp = dest; char *tmp = dest;
...@@ -209,6 +211,7 @@ EXPORT_SYMBOL(strlcat); ...@@ -209,6 +211,7 @@ EXPORT_SYMBOL(strlcat);
* @cs: One string * @cs: One string
* @ct: Another string * @ct: Another string
*/ */
#undef strcmp
int strcmp(const char * cs,const char * ct) int strcmp(const char * cs,const char * ct)
{ {
register signed char __res; register signed char __res;
...@@ -514,6 +517,7 @@ EXPORT_SYMBOL(memmove); ...@@ -514,6 +517,7 @@ EXPORT_SYMBOL(memmove);
* @ct: Another area of memory * @ct: Another area of memory
* @count: The size of the area. * @count: The size of the area.
*/ */
#undef memcmp
int memcmp(const void * cs,const void * ct,size_t count) int memcmp(const void * cs,const void * ct,size_t count)
{ {
const unsigned char *su1, *su2; const unsigned char *su1, *su2;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册