x86: Make strncmp usable from rtld

Message ID 20180612124655.F196E439942E1@oldenburg.str.redhat.com
State Committed
Headers

Commit Message

Florian Weimer June 12, 2018, 12:46 p.m. UTC
  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

Carlos O'Donell June 12, 2018, 12:59 p.m. UTC | #1
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>
>
  

Patch

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>