about summary refs log tree commit diff
path: root/sysdeps/i386
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/i386
parent6dcf80c78273c5e0bdcacaf64a9b34fd930b405f (diff)
downloadglibc-f85fa27058eb7d4b56b8deaf885064cf8d730f68.tar.gz
glibc-f85fa27058eb7d4b56b8deaf885064cf8d730f68.tar.xz
glibc-f85fa27058eb7d4b56b8deaf885064cf8d730f68.zip
Avoid DWARF definition DIE on ifunc symbols
Diffstat (limited to 'sysdeps/i386')
-rw-r--r--sysdeps/i386/i686/multiarch/strstr-c.c17
1 files changed, 14 insertions, 3 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)