x86: Make strncmp usable from rtld
Commit Message
Due to the way the conditions were written, the rtld build of strncmp
ended up with no definition of the strncmp symbol at all: The
implementations were renamed for use within an IFUNC resolver, but the
IFUNC resolver itself was missing (because rtld does not use IFUNCs).
2018-06-12 Florian Weimer <fweimer@redhat.com>
x86: Make strncmp usable from rtld.
* sysdeps/i386/i686/multiarch/strncmp-c.c: Only rename strncmp to
__strncmp_ia32 if in libc (and not in rtld).
* sysdeps/x86_64/multiarch/strncmp-sse2.S: Rename strcmp to
strncmp if not in libc (and not to __strncmp_sse2).
Comments
On 06/12/2018 08:46 AM, Florian Weimer wrote:
> Due to the way the conditions were written, the rtld build of strncmp
> ended up with no definition of the strncmp symbol at all: The
> implementations were renamed for use within an IFUNC resolver, but the
> IFUNC resolver itself was missing (because rtld does not use IFUNCs).
>
> 2018-06-12 Florian Weimer <fweimer@redhat.com>
>
> x86: Make strncmp usable from rtld.
> * sysdeps/i386/i686/multiarch/strncmp-c.c: Only rename strncmp to
> __strncmp_ia32 if in libc (and not in rtld).
> * sysdeps/x86_64/multiarch/strncmp-sse2.S: Rename strcmp to
> strncmp if not in libc (and not to __strncmp_sse2).
This looks good to me.
I tested this on x86_64 and tested by adding code which calls strncmp from
early load.
It allows me to use strncmp in early dl-load.o* to simplify the logic
in is_dst().
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
> diff --git a/sysdeps/i386/i686/multiarch/strncmp-c.c b/sysdeps/i386/i686/multiarch/strncmp-c.c
> index cc059da494..2e3eca9b2b 100644
> --- a/sysdeps/i386/i686/multiarch/strncmp-c.c
> +++ b/sysdeps/i386/i686/multiarch/strncmp-c.c
> @@ -1,4 +1,4 @@
> -#ifdef SHARED
> +#if defined (SHARED) && IS_IN (libc)
> # define STRNCMP __strncmp_ia32
> # undef libc_hidden_builtin_def
> # define libc_hidden_builtin_def(name) \
> diff --git a/sysdeps/x86_64/multiarch/strncmp-sse2.S b/sysdeps/x86_64/multiarch/strncmp-sse2.S
> index cc5252d826..a5ecb82b13 100644
> --- a/sysdeps/x86_64/multiarch/strncmp-sse2.S
> +++ b/sysdeps/x86_64/multiarch/strncmp-sse2.S
> @@ -18,10 +18,13 @@
>
> #include <sysdep.h>
>
> -#define STRCMP __strncmp_sse2
> -
> -#undef libc_hidden_builtin_def
> -#define libc_hidden_builtin_def(strcmp)
> +#if IS_IN (libc)
> +# define STRCMP __strncmp_sse2
> +# undef libc_hidden_builtin_def
> +# define libc_hidden_builtin_def(strcmp)
> +#else
> +# define STRCMP strncmp
> +#endif
>
> #define USE_AS_STRNCMP
> #include <sysdeps/x86_64/strcmp.S>
>
@@ -1,4 +1,4 @@
-#ifdef SHARED
+#if defined (SHARED) && IS_IN (libc)
# define STRNCMP __strncmp_ia32
# undef libc_hidden_builtin_def
# define libc_hidden_builtin_def(name) \
@@ -18,10 +18,13 @@
#include <sysdep.h>
-#define STRCMP __strncmp_sse2
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(strcmp)
+#if IS_IN (libc)
+# define STRCMP __strncmp_sse2
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(strcmp)
+#else
+# define STRCMP strncmp
+#endif
#define USE_AS_STRNCMP
#include <sysdeps/x86_64/strcmp.S>