Work around old buggy program which cannot cope with memcpy semantics.

This commit is contained in:
H.J. Lu 2011-04-01 19:38:21 -04:00 committed by Ulrich Drepper
parent 8593482f5e
commit 0354e35501
7 changed files with 73 additions and 7 deletions

View File

@ -1,3 +1,16 @@
2011-03-26 H.J. Lu <hongjiu.lu@intel.com>
[BZ #12518]
* sysdeps/x86_64/Versions: Add memcpy to GLIBC_2.14.
* sysdeps/x86_64/memcpy.S: Provide GLIBC_2_14 memcpy.
* sysdeps/x86_64/memmove.c: New file.
* sysdeps/x86_64/multiarch/memcpy.S: Include <shlib-compat.h>.
(memcpy): Renamed to ...
(__new_memcpy): This.
(memcpy): Provide GLIBC_2_14 memcpy.
* sysdeps/x86_64/multiarch/memmove.c: Include <shlib-compat.h>.
(memcpy): Provide GLIBC_2_2_5 memcpy.
2011-04-01 Ulrich Drepper <drepper@gmail.com> 2011-04-01 Ulrich Drepper <drepper@gmail.com>
[BZ #12631] [BZ #12631]

4
NEWS
View File

@ -11,8 +11,8 @@ Version 2.14
* The following bugs are resolved with this release: * The following bugs are resolved with this release:
11724, 12445, 12454, 12460, 12469, 12489, 12509, 12510, 12583, 12587, 12597, 11724, 12445, 12454, 12460, 12469, 12489, 12509, 12510, 12518, 12583, 12587,
12631 12597, 12631
Version 2.13 Version 2.13

View File

@ -1,3 +1,8 @@
libc {
GLIBC_2.14 {
memcpy;
}
}
libm { libm {
GLIBC_2.1 { GLIBC_2.1 {
# A generic bug got this omitted from other configurations' version # A generic bug got this omitted from other configurations' version

View File

@ -31,6 +31,12 @@
# define RETVAL (0) # define RETVAL (0)
#else #else
# define RETVAL (-8) # 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 #endif
#define SAVE0 (RETVAL - 8) #define SAVE0 (RETVAL - 8)
#define SAVE1 (SAVE0 - 8) #define SAVE1 (SAVE0 - 8)
@ -571,4 +577,9 @@ END(memcpy)
#ifndef USE_AS_MEMPCPY #ifndef USE_AS_MEMPCPY
libc_hidden_builtin_def (memcpy) 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 #endif

27
sysdeps/x86_64/memmove.c Normal file
View File

@ -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

View File

@ -1,5 +1,6 @@
/* Multiple versions of memcpy /* Multiple versions of memcpy
Copyright (C) 2010 Free Software Foundation, Inc. Copyright (C) 2010, 2011
Free Software Foundation, Inc.
Contributed by Intel Corporation. Contributed by Intel Corporation.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -19,6 +20,7 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <sysdep.h> #include <sysdep.h>
#include <shlib-compat.h>
#include <init-arch.h> #include <init-arch.h>
/* Define multiple versions only for the definition in lib and for /* Define multiple versions only for the definition in lib and for
@ -26,8 +28,8 @@
happened. */ happened. */
#if defined SHARED && !defined NOT_IN_libc #if defined SHARED && !defined NOT_IN_libc
.text .text
ENTRY(memcpy) ENTRY(__new_memcpy)
.type memcpy, @gnu_indirect_function .type __new_memcpy, @gnu_indirect_function
cmpl $0, KIND_OFFSET+__cpu_features(%rip) cmpl $0, KIND_OFFSET+__cpu_features(%rip)
jne 1f jne 1f
call __init_cpu_features call __init_cpu_features
@ -39,7 +41,7 @@ ENTRY(memcpy)
jz 2f jz 2f
leaq __memcpy_ssse3_back(%rip), %rax leaq __memcpy_ssse3_back(%rip), %rax
2: ret 2: ret
END(memcpy) END(__new_memcpy)
# undef ENTRY # undef ENTRY
# define ENTRY(name) \ # define ENTRY(name) \
@ -68,6 +70,8 @@ END(memcpy)
by the indirect call in the PLT. */ by the indirect call in the PLT. */
# define libc_hidden_builtin_def(name) \ # define libc_hidden_builtin_def(name) \
.globl __GI_memcpy; __GI_memcpy = __memcpy_sse2 .globl __GI_memcpy; __GI_memcpy = __memcpy_sse2
versioned_symbol (libc, __new_memcpy, memcpy, GLIBC_2_14);
#endif #endif
#include "../memcpy.S" #include "../memcpy.S"

View File

@ -1,5 +1,6 @@
/* Multiple versions of memmove. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -20,6 +21,7 @@
#include <string.h> #include <string.h>
#ifndef NOT_IN_libc #ifndef NOT_IN_libc
#include <shlib-compat.h>
#include "init-arch.h" #include "init-arch.h"
#define MEMMOVE __memmove_sse2 #define MEMMOVE __memmove_sse2
@ -42,4 +44,8 @@ libc_ifunc (memmove,
? (HAS_FAST_COPY_BACKWARD ? (HAS_FAST_COPY_BACKWARD
? __memmove_ssse3_back : __memmove_ssse3) ? __memmove_ssse3_back : __memmove_ssse3)
: __memmove_sse2); : __memmove_sse2);
#if SHLIB_COMPAT (libc, GLIBC_2_2_5, GLIBC_2_14)
compat_symbol (libc, memmove, memcpy, GLIBC_2_2_5);
#endif
#endif #endif