This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
PATCH: invalid IFUNC DW_AT_linkage_name: memmove strstr time
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: GNU C Library <libc-alpha at sourceware dot org>
- Date: Wed, 8 Aug 2012 15:42:51 -0700
- Subject: PATCH: invalid IFUNC DW_AT_linkage_name: memmove strstr time
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
Hi,
We should avoid put IFUNC symbols in DW_AT_linkage_name. This patch
renames IFUNC memmove/strstr/time to __libc_memmove/__libc_strstr/__GI_time
and make them aliases of the new functions. Also there is no need for
__GI_time in libc.a.
Tested on Linux/x32, Linux/ia32 and Linux/x86-64. OK to install?
Thanks.
H.J.
--
[BZ #14166]
* sysdeps/i386/i686/multiarch/strstr-c.c (strstr): Redefined
to __redirect_strstr.
(__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>.
(__GI_time): New prototype.
(time_ifunc): Replace time with __GI_time.
(time): New strong alias of __GI_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): Make it explicit prototype.
(__memmove_ssse3): Replace memmove with __memmove_sse2.
(__memmove_ssse3_back): Likewise.
(__libc_memmove): New prototype.
(memmove): Renamed to ...
(__libc_memmove): This.
(memmove): New strong alias of __libc_memmove.
diff --git a/sysdeps/i386/i686/multiarch/strstr-c.c b/sysdeps/i386/i686/multiarch/strstr-c.c
index 1fcb00e..cbb2d8c 100644
--- a/sysdeps/i386/i686/multiarch/strstr-c.c
+++ b/sysdeps/i386/i686/multiarch/strstr-c.c
@@ -5,11 +5,17 @@
#undef libc_hidden_builtin_def
#define libc_hidden_builtin_def(name) \
__hidden_ver1 (__strstr_ia32, __GI_strstr, __strstr_ia32);
+#undef strstr
+#define strstr __redirect_strstr
#endif
#include "string/strstr.c"
extern char *__strstr_sse42 (const char *, const char *) attribute_hidden;
extern __typeof (__strstr_ia32) __strstr_ia32 attribute_hidden;
+extern __typeof (__strstr_ia32) __libc_strstr;
-libc_ifunc (strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_ia32);
+libc_ifunc (__libc_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 0e05ddd..6d2b62e 100644
--- a/sysdeps/unix/sysv/linux/x86_64/time.c
+++ b/sysdeps/unix/sysv/linux/x86_64/time.c
@@ -16,11 +16,15 @@
<http://www.gnu.org/licenses/>. */
#ifdef SHARED
-#include <dl-vdso.h>
+# undef time
+# define time __redirect_time
+# include <time.h>
+# include <dl-vdso.h>
-#define VSYSCALL_ADDR_vtime 0xffffffffff600400
+# define VSYSCALL_ADDR_vtime 0xffffffffff600400
-void *time_ifunc (void) __asm__ ("time");
+extern time_t __GI_time (time_t *);
+void *time_ifunc (void) __asm__ ("__GI_time");
void *
time_ifunc (void)
@@ -30,7 +34,10 @@ 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 __GI_time, %gnu_indirect_function");
+
+# undef time
+strong_alias (__GI_time, time)
#else
@@ -45,5 +52,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 ca16263..87cc07d 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>
@@ -28,22 +28,28 @@
# undef libc_hidden_builtin_def
# define libc_hidden_builtin_def(name) \
__hidden_ver1 (__memmove_sse2, __GI_memmove, __memmove_sse2);
+# undef memmove
+# define memmove __redirect_memmove
#endif
#endif
-extern __typeof (memmove) __memmove_sse2 attribute_hidden;
-extern __typeof (memmove) __memmove_ssse3 attribute_hidden;
-extern __typeof (memmove) __memmove_ssse3_back attribute_hidden;
+extern void *__memmove_sse2 (void *, const void *, size_t) attribute_hidden;
+extern __typeof (__memmove_sse2) __memmove_ssse3 attribute_hidden;
+extern __typeof (__memmove_sse2) __memmove_ssse3_back attribute_hidden;
#include "string/memmove.c"
#ifndef NOT_IN_libc
-libc_ifunc (memmove,
+extern __typeof (__memmove_sse2) __libc_memmove;
+libc_ifunc (__libc_memmove,
HAS_SSSE3
? (HAS_FAST_COPY_BACKWARD
? __memmove_ssse3_back : __memmove_ssse3)
: __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);
#endif
diff --git a/sysdeps/x86_64/multiarch/strstr-c.c b/sysdeps/x86_64/multiarch/strstr-c.c
index b8ed316..ed2677d 100644
--- a/sysdeps/x86_64/multiarch/strstr-c.c
+++ b/sysdeps/x86_64/multiarch/strstr-c.c
@@ -5,11 +5,17 @@
# undef libc_hidden_builtin_def
# define libc_hidden_builtin_def(name) \
__hidden_ver1 (__strstr_sse2, __GI_strstr, __strstr_sse2);
+# undef strstr
+# define strstr __redirect_strstr
#endif
#include "string/strstr.c"
extern char *__strstr_sse42 (const char *, const char *) attribute_hidden;
extern __typeof (__strstr_sse2) __strstr_sse2 attribute_hidden;
+extern __typeof (__strstr_sse2) __libc_strstr;
-libc_ifunc (strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_sse2);
+libc_ifunc (__libc_strstr, HAS_SSE4_2 ? __strstr_sse42 : __strstr_sse2);
+
+#undef strstr
+strong_alias (__libc_strstr, strstr);