diff options
-rw-r--r-- | elf/Makefile | 5 | ||||
-rw-r--r-- | elf/dl-support.c | 1 | ||||
-rw-r--r-- | sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h | 24 | ||||
-rw-r--r-- | sysdeps/generic/dl-symbol-redir-ifunc.h | 38 | ||||
-rw-r--r-- | sysdeps/i386/i686/multiarch/dl-symbol-redir-ifunc.h | 24 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/le/multiarch/dl-symbol-redir-ifunc.h | 24 | ||||
-rw-r--r-- | sysdeps/s390/multiarch/dl-symbol-redir-ifunc.h | 29 | ||||
-rw-r--r-- | sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h | 24 | ||||
-rw-r--r-- | sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h | 24 | ||||
-rw-r--r-- | sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h | 34 |
10 files changed, 222 insertions, 5 deletions
diff --git a/elf/Makefile b/elf/Makefile index 276343a47f..7b50ccc07a 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -162,11 +162,6 @@ ifeq (yes,$(have-loop-to-function)) CFLAGS-rtld.c += -fno-tree-loop-distribute-patterns endif -ifeq (yes,$(have-loop-to-function)) -# Likewise, during static library startup, memset is not yet available. -CFLAGS-dl-support.c = -fno-tree-loop-distribute-patterns -endif - # Compile rtld itself without stack protection. # Also compile all routines in the static library that are elided from # the shared libc because they are in libc.a in the same way. diff --git a/elf/dl-support.c b/elf/dl-support.c index 4af0b5b2ce..614b5b3e0c 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -44,6 +44,7 @@ #include <dl-auxv.h> #include <dl-find_object.h> #include <array_length.h> +#include <dl-symbol-redir-ifunc.h> extern char *__progname; char **_dl_argv = &__progname; /* This is checked for some error messages. */ diff --git a/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h new file mode 100644 index 0000000000..6ee6537181 --- /dev/null +++ b/sysdeps/aarch64/multiarch/dl-symbol-redir-ifunc.h @@ -0,0 +1,24 @@ +/* Symbol rediretion for loader/static initialization code. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_IFUNC_GENERIC_H +#define _DL_IFUNC_GENERIC_H + +asm ("memset = __memset_generic"); + +#endif diff --git a/sysdeps/generic/dl-symbol-redir-ifunc.h b/sysdeps/generic/dl-symbol-redir-ifunc.h new file mode 100644 index 0000000000..b4a087e531 --- /dev/null +++ b/sysdeps/generic/dl-symbol-redir-ifunc.h @@ -0,0 +1,38 @@ +/* Symbol rediretion for loader/static initialization code. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_IFUNC_GENERIC_H +#define _DL_IFUNC_GENERIC_H + +/* The compiler might optimize loops or other constructs to library calls even + in freestanding mode. Although it is safe in most scenarios, on program + loading and static startup, iFUNC resolution might require other dynamic + relocation that are not yet done. + + Instead of adding per-file compiler flags to avoid the libcall generation, + this header defines generic symbols that will be routed instead of the + default symbols name. + + Each port can then make the required redirection to the expected generic + implementation if the symbol is provided as iFUNC, with a global definition + such as: + + asm ("memset = __memset_generic"); + */ + +#endif diff --git a/sysdeps/i386/i686/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/i386/i686/multiarch/dl-symbol-redir-ifunc.h new file mode 100644 index 0000000000..a0c66f8892 --- /dev/null +++ b/sysdeps/i386/i686/multiarch/dl-symbol-redir-ifunc.h @@ -0,0 +1,24 @@ +/* Symbol rediretion for loader/static initialization code. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_IFUNC_GENERIC_H +#define _DL_IFUNC_GENERIC_H + +asm ("memset = __memset_ia32"); + +#endif diff --git a/sysdeps/powerpc/powerpc64/le/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/powerpc/powerpc64/le/multiarch/dl-symbol-redir-ifunc.h new file mode 100644 index 0000000000..1883bc3a9d --- /dev/null +++ b/sysdeps/powerpc/powerpc64/le/multiarch/dl-symbol-redir-ifunc.h @@ -0,0 +1,24 @@ +/* Symbol rediretion for loader/static initialization code. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_IFUNC_GENERIC_H +#define _DL_IFUNC_GENERIC_H + +asm ("memset = __memset_power8"); + +#endif diff --git a/sysdeps/s390/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/s390/multiarch/dl-symbol-redir-ifunc.h new file mode 100644 index 0000000000..14cdd46808 --- /dev/null +++ b/sysdeps/s390/multiarch/dl-symbol-redir-ifunc.h @@ -0,0 +1,29 @@ +/* Symbol rediretion for loader/static initialization code. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_IFUNC_GENERIC_H +#define _DL_IFUNC_GENERIC_H + +#include <ifunc-memset.h> + +#define IFUNC_SYMBOL_STR1(s) #s +#define IFUNC_SYMBOL_STR(s) IFUNC_SYMBOL_STR1(s) + +asm ("memset = " IFUNC_SYMBOL_STR(MEMSET_DEFAULT)); + +#endif diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h new file mode 100644 index 0000000000..42c477b872 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/dl-symbol-redir-ifunc.h @@ -0,0 +1,24 @@ +/* Symbol rediretion for loader/static initialization code. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_IFUNC_GENERIC_H +#define _DL_IFUNC_GENERIC_H + +asm ("memset = __memset_ultra1"); + +#endif diff --git a/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h new file mode 100644 index 0000000000..42c477b872 --- /dev/null +++ b/sysdeps/sparc/sparc64/multiarch/dl-symbol-redir-ifunc.h @@ -0,0 +1,24 @@ +/* Symbol rediretion for loader/static initialization code. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_IFUNC_GENERIC_H +#define _DL_IFUNC_GENERIC_H + +asm ("memset = __memset_ultra1"); + +#endif diff --git a/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h b/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h new file mode 100644 index 0000000000..64f9996854 --- /dev/null +++ b/sysdeps/x86_64/multiarch/dl-symbol-redir-ifunc.h @@ -0,0 +1,34 @@ +/* Symbol rediretion for loader/static initialization code. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_IFUNC_GENERIC_H +#define _DL_IFUNC_GENERIC_H + +#include <isa-level.h> + +#if MINIMUM_X86_ISA_LEVEL >= 4 +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_evex_unaligned" +#elif MINIMUM_X86_ISA_LEVEL == 3 +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_avx2_unaligned" +#else +# define HAVE_MEMSET_IFUNC_GENERIC "__memset_sse2_unaligned" +#endif + +asm ("memset = " HAVE_MEMSET_IFUNC_GENERIC); + +#endif |