summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-08-09 16:04:37 -0700
committerH.J. Lu <hjl.tools@gmail.com>2012-08-09 16:04:37 -0700
commitf85fa27058eb7d4b56b8deaf885064cf8d730f68 (patch)
treef7e63a9691ff3c88f60506816e388e17bcfbeb89 /sysdeps
parent6dcf80c78273c5e0bdcacaf64a9b34fd930b405f (diff)
downloadglibc-f85fa27058eb7d4b56b8deaf885064cf8d730f68.tar.gz
Avoid DWARF definition DIE on ifunc symbols
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/i386/i686/multiarch/strstr-c.c17
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/time.c19
-rw-r--r--sysdeps/x86_64/multiarch/memmove.c25
-rw-r--r--sysdeps/x86_64/multiarch/strstr-c.c17
4 files changed, 61 insertions, 17 deletions
diff --git a/sysdeps/i386/i686/multiarch/strstr-c.c b/sysdeps/i386/i686/multiarch/strstr-c.c
index 1fcb00edac..17c75c5f0b 100644
--- a/sysdeps/i386/i686/multiarch/strstr-c.c
+++ b/sysdeps/i386/i686/multiarch/strstr-c.c
@@ -7,9 +7,20 @@
__hidden_ver1 (__strstr_ia32, __GI_strstr, __strstr_ia32);
#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"
-extern char *__strstr_sse42 (const char *, const char *) attribute_hidden;
-extern __typeof (__strstr_ia32) __strstr_ia32 attribute_hidden;
+extern __typeof (__redirect_strstr) __strstr_sse42 attribute_hidden;
+extern __typeof (__redirect_strstr) __strstr_ia32 attribute_hidden;
+
+/* 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)
-libc_ifunc (strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_ia32);
+#undef strstr
+strong_alias (__libc_strstr, strstr)
diff --git a/sysdeps/unix/sysv/linux/x86_64/time.c b/sysdeps/unix/sysv/linux/x86_64/time.c
index 0e05ddd523..65703cab90 100644
--- a/sysdeps/unix/sysv/linux/x86_64/time.c
+++ b/sysdeps/unix/sysv/linux/x86_64/time.c
@@ -16,11 +16,20 @@
<http://www.gnu.org/licenses/>. */
#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>
#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 *
time_ifunc (void)
@@ -30,7 +39,11 @@ time_ifunc (void)
/* If the vDSO is not available we fall back on the old vsyscall. */
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
@@ -45,5 +58,3 @@ time (time_t *t)
}
#endif
-
-strong_alias (time, __GI_time)
diff --git a/sysdeps/x86_64/multiarch/memmove.c b/sysdeps/x86_64/multiarch/memmove.c
index ca16263a17..6e91025eb6 100644
--- a/sysdeps/x86_64/multiarch/memmove.c
+++ b/sysdeps/x86_64/multiarch/memmove.c
@@ -17,7 +17,7 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <string.h>
+#include <stddef.h>
#ifndef NOT_IN_libc
#include <shlib-compat.h>
@@ -29,20 +29,31 @@
# define libc_hidden_builtin_def(name) \
__hidden_ver1 (__memmove_sse2, __GI_memmove, __memmove_sse2);
#endif
-#endif
-extern __typeof (memmove) __memmove_sse2 attribute_hidden;
-extern __typeof (memmove) __memmove_ssse3 attribute_hidden;
-extern __typeof (memmove) __memmove_ssse3_back attribute_hidden;
+/* Redefine memmove so that the compiler won't complain about the type
+ mismatch with the IFUNC selector in strong_alias, below. */
+#undef memmove
+#define memmove __redirect_memmove
+#endif
#include "string/memmove.c"
#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_FAST_COPY_BACKWARD
? __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)
compat_symbol (libc, memmove, memcpy, GLIBC_2_2_5);
diff --git a/sysdeps/x86_64/multiarch/strstr-c.c b/sysdeps/x86_64/multiarch/strstr-c.c
index b8ed3161d5..795789e704 100644
--- a/sysdeps/x86_64/multiarch/strstr-c.c
+++ b/sysdeps/x86_64/multiarch/strstr-c.c
@@ -7,9 +7,20 @@
__hidden_ver1 (__strstr_sse2, __GI_strstr, __strstr_sse2);
#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"
-extern char *__strstr_sse42 (const char *, const char *) attribute_hidden;
-extern __typeof (__strstr_sse2) __strstr_sse2 attribute_hidden;
+extern __typeof (__redirect_strstr) __strstr_sse42 attribute_hidden;
+extern __typeof (__redirect_strstr) __strstr_sse2 attribute_hidden;
+
+/* 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)
-libc_ifunc (strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_sse2);
+#undef strstr
+strong_alias (__libc_strstr, strstr)