[PATCH 1/2] Redirect mempcpy and stpcpy only in libc.a

Sam James sam@gentoo.org
Thu Jan 2 17:17:49 GMT 2025


"H.J. Lu" <hjl.tools@gmail.com> writes:

> Within libc, __mempcpy and __stpcpy are defined as macros which call
> __builtin_mempcpy and __builtin_stpcpy which may end up calling the C
> functions mempcpy and __stpcpy.  In libc.so, libc_hidden_builtin_proto
> ensures that calls to those C functions are in turn mapped to call
> __GI_mempcpy and __GI_stpcpy.  In libc.a, mempcpy and stpcpy may be
> called which pollutes the ISO C namespace.  include/string.h contains
>
> extern __typeof (mempcpy) mempcpy __asm__ ("__mempcpy");
> extern __typeof (stpcpy) stpcpy __asm__ ("__stpcpy");
>
> to redirect mempcpy and stpcpy to __mempcpy and __stpcpy.  Since mempcpy
> and stpcpy macros are only defined and used within libc, limit these
> redirections to libc.a to avoid Clang error:
>
> In file included from tst-iconv-sticky-input-error.c:22:
> In file included from ./gconv_int.h:24:
> ../include/string.h:182:44: error: attribute declaration must precede definition [-Werror,-Wignored-attributes]
>   182 | extern __typeof (mempcpy) mempcpy __asm__ ("__mempcpy");
>       |                                            ^
> ../string/bits/string_fortified.h:42:8: note: previous definition is here
>    42 | __NTH (mempcpy (void *__restrict __dest, const void *__restrict __src,
>       |        ^
>
> when testing with Clang for fortify build.
>
> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>

Can you include that reference to
18b10de7ced9e9c3843299fb600e40b11af3e0af?

With that added: Reviewed-by: Sam James <sam@gentoo.org>

> ---
>  include/string.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/include/string.h b/include/string.h
> index 3b4c6007d7..1f6aef9f93 100644
> --- a/include/string.h
> +++ b/include/string.h
> @@ -175,7 +175,7 @@ extern __typeof (strnlen) strnlen attribute_hidden;
>  extern __typeof (strsep) strsep attribute_hidden;
>  #endif
>  
> -#if (!IS_IN (libc) || !defined SHARED) \
> +#if IS_IN (libc) && !defined SHARED \
>    && !defined NO_MEMPCPY_STPCPY_REDIRECT
>  /* Redirect calls to __builtin_mempcpy and __builtin_stpcpy to call
>     __mempcpy and __stpcpy if not inlined.  */


More information about the Libc-alpha mailing list