Message ID | 20240723004722.2337170-2-hjl.tools@gmail.com |
---|---|
State | New |
Headers | show |
Series | x32/cet: Support shadow stack during startup for Linux 6.10 | expand |
On Tue, Jul 23, 2024 at 8:47 AM H.J. Lu <hjl.tools@gmail.com> wrote: > > Remove sysdeps/x86_64/x32/dl-machine.h by folding x32 ARCH_LA_PLTENTER, > ARCH_LA_PLTEXIT and RTLD_START into sysdeps/x86_64/dl-machine.h. There > are no regressions on x86-64 nor x32. There are no changes in x86-64 > _dl_start_user. On x32, _dl_start_user changes are > > <_dl_start_user>: > mov %eax,%r12d > + mov %esp,%r13d > mov (%rsp),%edx > mov %edx,%esi > - mov %esp,%r13d > and $0xfffffff0,%esp > mov 0x0(%rip),%edi # <_dl_start_user+0x14> > lea 0x8(%r13,%rdx,4),%ecx > > Signed-off-by: H.J. Lu <hjl.tools@gmail.com> > --- > sysdeps/x86_64/dl-machine.h | 27 +++++++----- > sysdeps/x86_64/x32/dl-machine.h | 76 --------------------------------- > 2 files changed, 16 insertions(+), 87 deletions(-) > delete mode 100644 sysdeps/x86_64/x32/dl-machine.h > > diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h > index a6de3793e4..4f12955875 100644 > --- a/sysdeps/x86_64/dl-machine.h > +++ b/sysdeps/x86_64/dl-machine.h > @@ -139,37 +139,37 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[], > .globl _start\n\ > .globl _dl_start_user\n\ > _start:\n\ > - movq %rsp, %rdi\n\ > + mov %" RSP_LP ", %" RDI_LP "\n\ > call _dl_start\n\ > _dl_start_user:\n\ > # Save the user entry point address in %r12.\n\ > - movq %rax, %r12\n\ > + mov %" RAX_LP ", %" R12_LP "\n\ > # Save %rsp value in %r13.\n\ > - movq %rsp, %r13\n\ > + mov %" RSP_LP ", % " R13_LP "\n\ > "\ > RTLD_START_ENABLE_X86_FEATURES \ > "\ > # Read the original argument count.\n\ > - movq (%rsp), %rdx\n\ > + mov (%rsp), %" RDX_LP "\n\ > # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\ > # argc -> rsi\n\ > - movq %rdx, %rsi\n\ > + mov %" RDX_LP ", %" RSI_LP "\n\ > # And align stack for the _dl_init call. \n\ > - andq $-16, %rsp\n\ > + and $-16, %" RSP_LP "\n\ > # _dl_loaded -> rdi\n\ > - movq _rtld_local(%rip), %rdi\n\ > + mov _rtld_local(%rip), %" RDI_LP "\n\ > # env -> rcx\n\ > - leaq 16(%r13,%rdx,8), %rcx\n\ > + lea 2*" LP_SIZE "(%r13,%rdx," LP_SIZE "), %" RCX_LP "\n\ > # argv -> rdx\n\ > - leaq 8(%r13), %rdx\n\ > + lea " LP_SIZE "(%r13), %" RDX_LP "\n\ > # Clear %rbp to mark outermost frame obviously even for constructors.\n\ > xorl %ebp, %ebp\n\ > # Call the function to run the initializers.\n\ > call _dl_init\n\ > # Pass our finalizer function to the user in %rdx, as per ELF ABI.\n\ > - leaq _dl_fini(%rip), %rdx\n\ > + lea _dl_fini(%rip), %" RDX_LP "\n\ > # And make sure %rsp points to argc stored on the stack.\n\ > - movq %r13, %rsp\n\ > + mov %" R13_LP ", %" RSP_LP "\n\ > # Jump to the user's entry point.\n\ > jmp *%r12\n\ > .previous\n\ > @@ -234,8 +234,13 @@ elf_machine_plt_value (struct link_map *map, const ElfW(Rela) *reloc, > > > /* Names of the architecture-specific auditing callback functions. */ > +#ifdef __LP64__ > #define ARCH_LA_PLTENTER x86_64_gnu_pltenter > #define ARCH_LA_PLTEXIT x86_64_gnu_pltexit > +#else > +#define ARCH_LA_PLTENTER x32_gnu_pltenter > +#define ARCH_LA_PLTEXIT x32_gnu_pltexit > +#endif > > #endif /* !dl_machine_h */ > > diff --git a/sysdeps/x86_64/x32/dl-machine.h b/sysdeps/x86_64/x32/dl-machine.h > deleted file mode 100644 > index c35cee9261..0000000000 > --- a/sysdeps/x86_64/x32/dl-machine.h > +++ /dev/null > @@ -1,76 +0,0 @@ > -/* Machine-dependent ELF dynamic relocation inline functions. x32 version. > - Copyright (C) 2012-2024 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/>. */ > - > -/* Must allow <sysdeps/x86_64/dl-machine.h> to be included more than once. > - See #ifdef RESOLVE_MAP in sysdeps/x86_64/dl-machine.h. */ > -#include <sysdeps/x86_64/dl-machine.h> > - > -#ifndef _X32_DL_MACHINE_H > -#define _X32_DL_MACHINE_H > - > -#undef ARCH_LA_PLTENTER > -#undef ARCH_LA_PLTEXIT > -#undef RTLD_START > - > -/* Names of the architecture-specific auditing callback functions. */ > -#define ARCH_LA_PLTENTER x32_gnu_pltenter > -#define ARCH_LA_PLTEXIT x32_gnu_pltexit > - > -/* Initial entry point code for the dynamic linker. > - The C function `_dl_start' is the real entry point; > - its return value is the user program's entry point. */ > -#define RTLD_START asm ("\n\ > -.text\n\ > - .p2align 4\n\ > -.globl _start\n\ > -.globl _dl_start_user\n\ > -_start:\n\ > - movl %esp, %edi\n\ > - call _dl_start\n\ > -_dl_start_user:\n\ > - # Save the user entry point address in %r12.\n\ > - movl %eax, %r12d\n\ > - # Read the original argument count.\n\ > - movl (%rsp), %edx\n\ > - # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\ > - # argc -> rsi\n\ > - movl %edx, %esi\n\ > - # Save %rsp value in %r13.\n\ > - movl %esp, %r13d\n\ > - # And align stack for the _dl_init call.\n\ > - and $-16, %esp\n\ > - # _dl_loaded -> rdi\n\ > - movl _rtld_local(%rip), %edi\n\ > - # env -> rcx\n\ > - lea 8(%r13,%rdx,4), %ecx\n\ > - # argv -> rdx\n\ > - lea 4(%r13), %edx\n\ > - # Clear %rbp to mark outermost frame obviously even for constructors.\n\ > - xorl %ebp, %ebp\n\ > - # Call the function to run the initializers.\n\ > - call _dl_init\n\ > - # Pass our finalizer function to the user in %rdx, as per ELF ABI.\n\ > - lea _dl_fini(%rip), %edx\n\ > - # And make sure %rsp points to argc stored on the stack.\n\ > - movl %r13d, %esp\n\ > - # Jump to the user's entry point.\n\ > - jmp *%r12\n\ > -.previous\n\ > -"); > - > -#endif /* !_X32_DL_MACHINE_H */ > -- > 2.45.2 > LGTM Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h index a6de3793e4..4f12955875 100644 --- a/sysdeps/x86_64/dl-machine.h +++ b/sysdeps/x86_64/dl-machine.h @@ -139,37 +139,37 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[], .globl _start\n\ .globl _dl_start_user\n\ _start:\n\ - movq %rsp, %rdi\n\ + mov %" RSP_LP ", %" RDI_LP "\n\ call _dl_start\n\ _dl_start_user:\n\ # Save the user entry point address in %r12.\n\ - movq %rax, %r12\n\ + mov %" RAX_LP ", %" R12_LP "\n\ # Save %rsp value in %r13.\n\ - movq %rsp, %r13\n\ + mov %" RSP_LP ", % " R13_LP "\n\ "\ RTLD_START_ENABLE_X86_FEATURES \ "\ # Read the original argument count.\n\ - movq (%rsp), %rdx\n\ + mov (%rsp), %" RDX_LP "\n\ # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\ # argc -> rsi\n\ - movq %rdx, %rsi\n\ + mov %" RDX_LP ", %" RSI_LP "\n\ # And align stack for the _dl_init call. \n\ - andq $-16, %rsp\n\ + and $-16, %" RSP_LP "\n\ # _dl_loaded -> rdi\n\ - movq _rtld_local(%rip), %rdi\n\ + mov _rtld_local(%rip), %" RDI_LP "\n\ # env -> rcx\n\ - leaq 16(%r13,%rdx,8), %rcx\n\ + lea 2*" LP_SIZE "(%r13,%rdx," LP_SIZE "), %" RCX_LP "\n\ # argv -> rdx\n\ - leaq 8(%r13), %rdx\n\ + lea " LP_SIZE "(%r13), %" RDX_LP "\n\ # Clear %rbp to mark outermost frame obviously even for constructors.\n\ xorl %ebp, %ebp\n\ # Call the function to run the initializers.\n\ call _dl_init\n\ # Pass our finalizer function to the user in %rdx, as per ELF ABI.\n\ - leaq _dl_fini(%rip), %rdx\n\ + lea _dl_fini(%rip), %" RDX_LP "\n\ # And make sure %rsp points to argc stored on the stack.\n\ - movq %r13, %rsp\n\ + mov %" R13_LP ", %" RSP_LP "\n\ # Jump to the user's entry point.\n\ jmp *%r12\n\ .previous\n\ @@ -234,8 +234,13 @@ elf_machine_plt_value (struct link_map *map, const ElfW(Rela) *reloc, /* Names of the architecture-specific auditing callback functions. */ +#ifdef __LP64__ #define ARCH_LA_PLTENTER x86_64_gnu_pltenter #define ARCH_LA_PLTEXIT x86_64_gnu_pltexit +#else +#define ARCH_LA_PLTENTER x32_gnu_pltenter +#define ARCH_LA_PLTEXIT x32_gnu_pltexit +#endif #endif /* !dl_machine_h */ diff --git a/sysdeps/x86_64/x32/dl-machine.h b/sysdeps/x86_64/x32/dl-machine.h deleted file mode 100644 index c35cee9261..0000000000 --- a/sysdeps/x86_64/x32/dl-machine.h +++ /dev/null @@ -1,76 +0,0 @@ -/* Machine-dependent ELF dynamic relocation inline functions. x32 version. - Copyright (C) 2012-2024 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/>. */ - -/* Must allow <sysdeps/x86_64/dl-machine.h> to be included more than once. - See #ifdef RESOLVE_MAP in sysdeps/x86_64/dl-machine.h. */ -#include <sysdeps/x86_64/dl-machine.h> - -#ifndef _X32_DL_MACHINE_H -#define _X32_DL_MACHINE_H - -#undef ARCH_LA_PLTENTER -#undef ARCH_LA_PLTEXIT -#undef RTLD_START - -/* Names of the architecture-specific auditing callback functions. */ -#define ARCH_LA_PLTENTER x32_gnu_pltenter -#define ARCH_LA_PLTEXIT x32_gnu_pltexit - -/* Initial entry point code for the dynamic linker. - The C function `_dl_start' is the real entry point; - its return value is the user program's entry point. */ -#define RTLD_START asm ("\n\ -.text\n\ - .p2align 4\n\ -.globl _start\n\ -.globl _dl_start_user\n\ -_start:\n\ - movl %esp, %edi\n\ - call _dl_start\n\ -_dl_start_user:\n\ - # Save the user entry point address in %r12.\n\ - movl %eax, %r12d\n\ - # Read the original argument count.\n\ - movl (%rsp), %edx\n\ - # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\ - # argc -> rsi\n\ - movl %edx, %esi\n\ - # Save %rsp value in %r13.\n\ - movl %esp, %r13d\n\ - # And align stack for the _dl_init call.\n\ - and $-16, %esp\n\ - # _dl_loaded -> rdi\n\ - movl _rtld_local(%rip), %edi\n\ - # env -> rcx\n\ - lea 8(%r13,%rdx,4), %ecx\n\ - # argv -> rdx\n\ - lea 4(%r13), %edx\n\ - # Clear %rbp to mark outermost frame obviously even for constructors.\n\ - xorl %ebp, %ebp\n\ - # Call the function to run the initializers.\n\ - call _dl_init\n\ - # Pass our finalizer function to the user in %rdx, as per ELF ABI.\n\ - lea _dl_fini(%rip), %edx\n\ - # And make sure %rsp points to argc stored on the stack.\n\ - movl %r13d, %esp\n\ - # Jump to the user's entry point.\n\ - jmp *%r12\n\ -.previous\n\ -"); - -#endif /* !_X32_DL_MACHINE_H */
Remove sysdeps/x86_64/x32/dl-machine.h by folding x32 ARCH_LA_PLTENTER, ARCH_LA_PLTEXIT and RTLD_START into sysdeps/x86_64/dl-machine.h. There are no regressions on x86-64 nor x32. There are no changes in x86-64 _dl_start_user. On x32, _dl_start_user changes are <_dl_start_user>: mov %eax,%r12d + mov %esp,%r13d mov (%rsp),%edx mov %edx,%esi - mov %esp,%r13d and $0xfffffff0,%esp mov 0x0(%rip),%edi # <_dl_start_user+0x14> lea 0x8(%r13,%rdx,4),%ecx Signed-off-by: H.J. Lu <hjl.tools@gmail.com> --- sysdeps/x86_64/dl-machine.h | 27 +++++++----- sysdeps/x86_64/x32/dl-machine.h | 76 --------------------------------- 2 files changed, 16 insertions(+), 87 deletions(-) delete mode 100644 sysdeps/x86_64/x32/dl-machine.h