Avoid DWARF definition DIE on ifunc symbols

This commit is contained in:
H.J. Lu 2012-08-09 16:04:37 -07:00
parent 6dcf80c782
commit f85fa27058
6 changed files with 93 additions and 19 deletions

View File

@ -1,3 +1,33 @@
2012-08-09 H.J. Lu <hongjiu.lu@intel.com>
[BZ #14166]
* sysdeps/i386/i686/multiarch/strstr-c.c (strstr): Redefined
to __redirect_strstr.
(__strstr_sse42): Use typeof __redirect_strstr.
(__strstr_ia32): Likewise.
(__libc_strstr): New prototype.
(strstr): Renamed to ...
(__libc_strstr): This.
(strstr): New strong alias of __libc_strstr.
* sysdeps/x86_64/multiarch/strstr-c.c: Likewise.
* sysdeps/unix/sysv/linux/x86_64/time.c (time): Redefined to
__redirect_time.
Include <time.h>.
(__libc_time): New prototype.
(time_ifunc): Replace time with __libc_time.
(time): New strong alias and hidden definition of __libc_time.
(__GI_time): Remove strong alias.
* sysdeps/x86_64/multiarch/memmove.c: Don't include <string.h>.
Include <stddef.h>.
(memmove): Redefined to __redirect_memmove.
(__memmove_sse2): Use typeof __redirect_memmove.
(__memmove_ssse3): Likewise.
(__memmove_ssse3_back): Likewise.
(__libc_memmove): New prototype.
(memmove): Renamed to ...
(__libc_memmove): This.
(memmove): New strong alias of __libc_memmove.
2012-08-08 Mark Salter <msalter@redhat.com> 2012-08-08 Mark Salter <msalter@redhat.com>
* elf/elf.h * elf/elf.h

4
NEWS
View File

@ -9,8 +9,8 @@ Version 2.17
* The following bugs are resolved with this release: * The following bugs are resolved with this release:
6778, 6808, 13717, 14042, 14150, 14151, 14154, 14157, 14173, 14283, 14298, 6778, 6808, 13717, 14042, 14166, 14150, 14151, 14154, 14157, 14173, 14283,
14307, 14328, 14331, 14336, 14337, 14347, 14349 14298, 14307, 14328, 14331, 14336, 14337, 14347, 14349
* Support for STT_GNU_IFUNC symbols added for s390 and s390x. * Support for STT_GNU_IFUNC symbols added for s390 and s390x.
Optimized versions of memcpy, memset, and memcmp added for System z10 and Optimized versions of memcpy, memset, and memcmp added for System z10 and

View File

@ -7,9 +7,20 @@
__hidden_ver1 (__strstr_ia32, __GI_strstr, __strstr_ia32); __hidden_ver1 (__strstr_ia32, __GI_strstr, __strstr_ia32);
#endif #endif
/* Redefine strstr so that the compiler won't complain about the type
mismatch with the IFUNC selector in strong_alias, below. */
#undef strstr
#define strstr __redirect_strstr
#include "string/strstr.c" #include "string/strstr.c"
extern char *__strstr_sse42 (const char *, const char *) attribute_hidden; extern __typeof (__redirect_strstr) __strstr_sse42 attribute_hidden;
extern __typeof (__strstr_ia32) __strstr_ia32 attribute_hidden; extern __typeof (__redirect_strstr) __strstr_ia32 attribute_hidden;
libc_ifunc (strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_ia32); /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
ifunc symbol properly. */
extern __typeof (__redirect_strstr) __libc_strstr;
libc_ifunc (__libc_strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_ia32)
#undef strstr
strong_alias (__libc_strstr, strstr)

View File

@ -16,11 +16,20 @@
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#ifdef SHARED #ifdef SHARED
/* Redefine time so that the compiler won't complain about the type
mismatch with the IFUNC selector in strong_alias, below. */
#undef time
#define time __redirect_time
#include <time.h>
#include <dl-vdso.h> #include <dl-vdso.h>
#define VSYSCALL_ADDR_vtime 0xffffffffff600400 #define VSYSCALL_ADDR_vtime 0xffffffffff600400
void *time_ifunc (void) __asm__ ("time"); /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
ifunc symbol properly. */
extern __typeof (__redirect_time) __libc_time;
void *time_ifunc (void) __asm__ ("__libc_time");
void * void *
time_ifunc (void) time_ifunc (void)
@ -30,7 +39,11 @@ time_ifunc (void)
/* If the vDSO is not available we fall back on the old vsyscall. */ /* If the vDSO is not available we fall back on the old vsyscall. */
return _dl_vdso_vsym ("__vdso_time", &linux26) ?: (void *) VSYSCALL_ADDR_vtime; return _dl_vdso_vsym ("__vdso_time", &linux26) ?: (void *) VSYSCALL_ADDR_vtime;
} }
__asm (".type time, %gnu_indirect_function"); __asm (".type __libc_time, %gnu_indirect_function");
#undef time
strong_alias (__libc_time, time)
libc_hidden_ver (__libc_time, time)
#else #else
@ -45,5 +58,3 @@ time (time_t *t)
} }
#endif #endif
strong_alias (time, __GI_time)

View File

@ -17,7 +17,7 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <string.h> #include <stddef.h>
#ifndef NOT_IN_libc #ifndef NOT_IN_libc
#include <shlib-compat.h> #include <shlib-compat.h>
@ -29,20 +29,31 @@
# define libc_hidden_builtin_def(name) \ # define libc_hidden_builtin_def(name) \
__hidden_ver1 (__memmove_sse2, __GI_memmove, __memmove_sse2); __hidden_ver1 (__memmove_sse2, __GI_memmove, __memmove_sse2);
#endif #endif
#endif
extern __typeof (memmove) __memmove_sse2 attribute_hidden; /* Redefine memmove so that the compiler won't complain about the type
extern __typeof (memmove) __memmove_ssse3 attribute_hidden; mismatch with the IFUNC selector in strong_alias, below. */
extern __typeof (memmove) __memmove_ssse3_back attribute_hidden; #undef memmove
#define memmove __redirect_memmove
#endif
#include "string/memmove.c" #include "string/memmove.c"
#ifndef NOT_IN_libc #ifndef NOT_IN_libc
libc_ifunc (memmove, extern __typeof (__redirect_memmove) __memmove_sse2 attribute_hidden;
extern __typeof (__redirect_memmove) __memmove_ssse3 attribute_hidden;
extern __typeof (__redirect_memmove) __memmove_ssse3_back attribute_hidden;
/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
ifunc symbol properly. */
extern __typeof (__redirect_memmove) __libc_memmove;
libc_ifunc (__libc_memmove,
HAS_SSSE3 HAS_SSSE3
? (HAS_FAST_COPY_BACKWARD ? (HAS_FAST_COPY_BACKWARD
? __memmove_ssse3_back : __memmove_ssse3) ? __memmove_ssse3_back : __memmove_ssse3)
: __memmove_sse2); : __memmove_sse2)
#undef memmove
strong_alias (__libc_memmove, memmove)
#if SHLIB_COMPAT (libc, GLIBC_2_2_5, GLIBC_2_14) #if SHLIB_COMPAT (libc, GLIBC_2_2_5, GLIBC_2_14)
compat_symbol (libc, memmove, memcpy, GLIBC_2_2_5); compat_symbol (libc, memmove, memcpy, GLIBC_2_2_5);

View File

@ -7,9 +7,20 @@
__hidden_ver1 (__strstr_sse2, __GI_strstr, __strstr_sse2); __hidden_ver1 (__strstr_sse2, __GI_strstr, __strstr_sse2);
#endif #endif
/* Redefine strstr so that the compiler won't complain about the type
mismatch with the IFUNC selector in strong_alias, below. */
#undef strstr
#define strstr __redirect_strstr
#include "string/strstr.c" #include "string/strstr.c"
extern char *__strstr_sse42 (const char *, const char *) attribute_hidden; extern __typeof (__redirect_strstr) __strstr_sse42 attribute_hidden;
extern __typeof (__strstr_sse2) __strstr_sse2 attribute_hidden; extern __typeof (__redirect_strstr) __strstr_sse2 attribute_hidden;
libc_ifunc (strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_sse2); /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
ifunc symbol properly. */
extern __typeof (__redirect_strstr) __libc_strstr;
libc_ifunc (__libc_strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_sse2)
#undef strstr
strong_alias (__libc_strstr, strstr)