Commit 0c28130b5c9e8f0b153436d3dae39482e5a70af1

Authored by Paolo 'Blaisorblade' Giarrusso
Committed by Linus Torvalds
1 parent 23352fc252

[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: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
CC: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 4 changed files with 4 additions and 20 deletions Side-by-side Diff

arch/i386/kernel/i386_ksyms.c
... ... @@ -169,10 +169,6 @@
169 169 EXPORT_SYMBOL_GPL(set_nmi_callback);
170 170 EXPORT_SYMBOL_GPL(unset_nmi_callback);
171 171  
172   -#undef memcmp
173   -extern int memcmp(const void *,const void *,__kernel_size_t);
174   -EXPORT_SYMBOL(memcmp);
175   -
176 172 EXPORT_SYMBOL(register_die_notifier);
177 173 #ifdef CONFIG_HAVE_DEC_LOCK
178 174 EXPORT_SYMBOL(_atomic_dec_and_lock);
arch/um/sys-x86_64/ksyms.c
... ... @@ -14,9 +14,6 @@
14 14  
15 15 /*XXX: we need them because they would be exported by x86_64 */
16 16 EXPORT_SYMBOL(__memcpy);
17   -EXPORT_SYMBOL(strcmp);
18   -EXPORT_SYMBOL(strcat);
19   -EXPORT_SYMBOL(strcpy);
20 17  
21 18 /* Networking helper routines. */
22 19 /*EXPORT_SYMBOL(csum_partial_copy_from);
arch/x86_64/kernel/x8664_ksyms.c
... ... @@ -139,35 +139,23 @@
139 139 #undef memmove
140 140 #undef memchr
141 141 #undef strlen
142   -#undef strcpy
143 142 #undef strncmp
144 143 #undef strncpy
145 144 #undef strchr
146   -#undef strcmp
147   -#undef strcpy
148   -#undef strcat
149   -#undef memcmp
150 145  
151 146 extern void * memset(void *,int,__kernel_size_t);
152 147 extern size_t strlen(const char *);
153 148 extern void * memmove(void * dest,const void *src,size_t count);
154   -extern char * strcpy(char * dest,const char *src);
155   -extern int strcmp(const char * cs,const char * ct);
156 149 extern void *memchr(const void *s, int c, size_t n);
157 150 extern void * memcpy(void *,const void *,__kernel_size_t);
158 151 extern void * __memcpy(void *,const void *,__kernel_size_t);
159   -extern char * strcat(char *, const char *);
160   -extern int memcmp(const void * cs,const void * ct,size_t count);
161 152  
162 153 EXPORT_SYMBOL(memset);
163 154 EXPORT_SYMBOL(strlen);
164 155 EXPORT_SYMBOL(memmove);
165   -EXPORT_SYMBOL(strcpy);
166 156 EXPORT_SYMBOL(strncmp);
167 157 EXPORT_SYMBOL(strncpy);
168 158 EXPORT_SYMBOL(strchr);
169   -EXPORT_SYMBOL(strcmp);
170   -EXPORT_SYMBOL(strcat);
171 159 EXPORT_SYMBOL(strncat);
172 160 EXPORT_SYMBOL(memchr);
173 161 EXPORT_SYMBOL(strrchr);
... ... @@ -175,7 +163,6 @@
175 163 EXPORT_SYMBOL(memscan);
176 164 EXPORT_SYMBOL(memcpy);
177 165 EXPORT_SYMBOL(__memcpy);
178   -EXPORT_SYMBOL(memcmp);
179 166  
180 167 #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM
181 168 /* prototypes are wrong, these are assembly with custom calling functions */
... ... @@ -65,6 +65,7 @@
65 65 * @dest: Where to copy the string to
66 66 * @src: Where to copy the string from
67 67 */
  68 +#undef strcpy
68 69 char * strcpy(char * dest,const char *src)
69 70 {
70 71 char *tmp = dest;
... ... @@ -132,6 +133,7 @@
132 133 * @dest: The string to be appended to
133 134 * @src: The string to append to it
134 135 */
  136 +#undef strcat
135 137 char * strcat(char * dest, const char * src)
136 138 {
137 139 char *tmp = dest;
... ... @@ -209,6 +211,7 @@
209 211 * @cs: One string
210 212 * @ct: Another string
211 213 */
  214 +#undef strcmp
212 215 int strcmp(const char * cs,const char * ct)
213 216 {
214 217 register signed char __res;
... ... @@ -514,6 +517,7 @@
514 517 * @ct: Another area of memory
515 518 * @count: The size of the area.
516 519 */
  520 +#undef memcmp
517 521 int memcmp(const void * cs,const void * ct,size_t count)
518 522 {
519 523 const unsigned char *su1, *su2;