diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2011-04-01 19:38:21 -0400 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-04-01 19:38:21 -0400 |
commit | 0354e355014b7bfda32622e0255399d859862fcd (patch) | |
tree | d2f823c407add9a82d7b6b3c055b78a9811914cb /sysdeps/x86_64 | |
parent | 8593482f5ec33daa90fca63db380edc8283c39df (diff) | |
download | glibc-0354e355014b7bfda32622e0255399d859862fcd.tar.gz |
Work around old buggy program which cannot cope with memcpy semantics.
Diffstat (limited to 'sysdeps/x86_64')
-rw-r--r-- | sysdeps/x86_64/Versions | 5 | ||||
-rw-r--r-- | sysdeps/x86_64/memcpy.S | 11 | ||||
-rw-r--r-- | sysdeps/x86_64/memmove.c | 27 | ||||
-rw-r--r-- | sysdeps/x86_64/multiarch/memcpy.S | 12 | ||||
-rw-r--r-- | sysdeps/x86_64/multiarch/memmove.c | 8 |
5 files changed, 58 insertions, 5 deletions
diff --git a/sysdeps/x86_64/Versions b/sysdeps/x86_64/Versions index 253a65f04e..a437f85e6e 100644 --- a/sysdeps/x86_64/Versions +++ b/sysdeps/x86_64/Versions @@ -1,3 +1,8 @@ +libc { + GLIBC_2.14 { + memcpy; + } +} libm { GLIBC_2.1 { # A generic bug got this omitted from other configurations' version diff --git a/sysdeps/x86_64/memcpy.S b/sysdeps/x86_64/memcpy.S index b4545ac9f7..724d44e6ce 100644 --- a/sysdeps/x86_64/memcpy.S +++ b/sysdeps/x86_64/memcpy.S @@ -31,6 +31,12 @@ # define RETVAL (0) #else # define RETVAL (-8) +# if defined SHARED && !defined USE_MULTIARCH && !defined NOT_IN_libc +# define memcpy __memcpy +# undef libc_hidden_builtin_def +# define libc_hidden_builtin_def(name) \ + .globl __GI_memcpy; __GI_memcpy = __memcpy +# endif #endif #define SAVE0 (RETVAL - 8) #define SAVE1 (SAVE0 - 8) @@ -571,4 +577,9 @@ END(memcpy) #ifndef USE_AS_MEMPCPY libc_hidden_builtin_def (memcpy) +# if defined SHARED && !defined USE_MULTIARCH && !defined NOT_IN_libc +# undef memcpy +# include <shlib-compat.h> +versioned_symbol (libc, __memcpy, memcpy, GLIBC_2_14); +# endif #endif diff --git a/sysdeps/x86_64/memmove.c b/sysdeps/x86_64/memmove.c new file mode 100644 index 0000000000..1a6f87dc8f --- /dev/null +++ b/sysdeps/x86_64/memmove.c @@ -0,0 +1,27 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include "string/memmove.c" + +#if !defined memmove && !defined NOT_IN_libc +#include <shlib-compat.h> + +#if SHLIB_COMPAT (libc, GLIBC_2_2_5, GLIBC_2_14) +compat_symbol (libc, memmove, memcpy, GLIBC_2_2_5); +#endif +#endif diff --git a/sysdeps/x86_64/multiarch/memcpy.S b/sysdeps/x86_64/multiarch/memcpy.S index 8e9fb190d3..9863014f55 100644 --- a/sysdeps/x86_64/multiarch/memcpy.S +++ b/sysdeps/x86_64/multiarch/memcpy.S @@ -1,5 +1,6 @@ /* Multiple versions of memcpy - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 2010, 2011 + Free Software Foundation, Inc. Contributed by Intel Corporation. This file is part of the GNU C Library. @@ -19,6 +20,7 @@ 02111-1307 USA. */ #include <sysdep.h> +#include <shlib-compat.h> #include <init-arch.h> /* Define multiple versions only for the definition in lib and for @@ -26,8 +28,8 @@ happened. */ #if defined SHARED && !defined NOT_IN_libc .text -ENTRY(memcpy) - .type memcpy, @gnu_indirect_function +ENTRY(__new_memcpy) + .type __new_memcpy, @gnu_indirect_function cmpl $0, KIND_OFFSET+__cpu_features(%rip) jne 1f call __init_cpu_features @@ -39,7 +41,7 @@ ENTRY(memcpy) jz 2f leaq __memcpy_ssse3_back(%rip), %rax 2: ret -END(memcpy) +END(__new_memcpy) # undef ENTRY # define ENTRY(name) \ @@ -68,6 +70,8 @@ END(memcpy) by the indirect call in the PLT. */ # define libc_hidden_builtin_def(name) \ .globl __GI_memcpy; __GI_memcpy = __memcpy_sse2 + +versioned_symbol (libc, __new_memcpy, memcpy, GLIBC_2_14); #endif #include "../memcpy.S" diff --git a/sysdeps/x86_64/multiarch/memmove.c b/sysdeps/x86_64/multiarch/memmove.c index 379862722b..04de891293 100644 --- a/sysdeps/x86_64/multiarch/memmove.c +++ b/sysdeps/x86_64/multiarch/memmove.c @@ -1,5 +1,6 @@ /* Multiple versions of memmove. - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 2010, 2011 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -20,6 +21,7 @@ #include <string.h> #ifndef NOT_IN_libc +#include <shlib-compat.h> #include "init-arch.h" #define MEMMOVE __memmove_sse2 @@ -42,4 +44,8 @@ libc_ifunc (memmove, ? (HAS_FAST_COPY_BACKWARD ? __memmove_ssse3_back : __memmove_ssse3) : __memmove_sse2); + +#if SHLIB_COMPAT (libc, GLIBC_2_2_5, GLIBC_2_14) +compat_symbol (libc, memmove, memcpy, GLIBC_2_2_5); +#endif #endif |