Message ID | 94c82dda28369de49a68e25ac606b828a2e4fd02.1651757640.git.szabolcs.nagy@arm.com |
---|---|
State | New |
Headers | show |
Series | Args adjustment with ./ld.so exe [BZ #23293] | expand |
On 05/05/2022 10:58, Szabolcs Nagy via Libc-alpha wrote: > _dl_skip_args is always 0, so the target specific code that modifies > argv after relro protection is applied is no longer used. > > After the patch relro protection is applied to _dl_argv consistently > on all targets. > > --- > v6: > - const _dl_skip_args. > v4: > - New patch. > Reviewed-by: Florian Weimer <fweimer@redhat.com> > Tested-by: Florian Weimer <fweimer@redhat.com> LGTM to me as well. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > --- > elf/rtld.c | 10 ++-------- > sysdeps/aarch64/dl-sysdep.h | 4 ---- > sysdeps/alpha/dl-sysdep.h | 23 ----------------------- > sysdeps/arc/dl-sysdep.h | 4 ---- > sysdeps/arm/dl-sysdep.h | 4 ---- > sysdeps/csky/dl-sysdep.h | 23 ----------------------- > sysdeps/generic/ldsodefs.h | 13 +++---------- > sysdeps/ia64/dl-sysdep.h | 23 ----------------------- > sysdeps/nios2/dl-sysdep.h | 4 ---- > sysdeps/s390/s390-32/dl-sysdep.h | 23 ----------------------- > sysdeps/sparc/dl-sysdep.h | 23 ----------------------- > sysdeps/unix/sysv/linux/ia64/dl-sysdep.h | 4 ---- > 12 files changed, 5 insertions(+), 153 deletions(-) > delete mode 100644 sysdeps/alpha/dl-sysdep.h > delete mode 100644 sysdeps/csky/dl-sysdep.h > delete mode 100644 sysdeps/ia64/dl-sysdep.h > delete mode 100644 sysdeps/s390/s390-32/dl-sysdep.h > delete mode 100644 sysdeps/sparc/dl-sysdep.h > > diff --git a/elf/rtld.c b/elf/rtld.c > index b5070d453f..71f7095def 100644 > --- a/elf/rtld.c > +++ b/elf/rtld.c > @@ -157,16 +157,10 @@ static void dl_main_state_init (struct dl_main_state *state); > extern char **_environ attribute_hidden; > static void process_envvars (struct dl_main_state *state); > > -#ifdef DL_ARGV_NOT_RELRO > -int _dl_argc attribute_hidden; > -char **_dl_argv = NULL; > -/* Nonzero if we were run directly. */ > -unsigned int _dl_skip_args attribute_hidden; > -#else > int _dl_argc attribute_relro attribute_hidden; > char **_dl_argv attribute_relro = NULL; > -unsigned int _dl_skip_args attribute_relro attribute_hidden; > -#endif > +/* Always 0, only kept for not-yet-updated target start code. */ > +const unsigned int _dl_skip_args attribute_hidden; > rtld_hidden_data_def (_dl_argv) > > #ifndef THREAD_SET_STACK_GUARD > diff --git a/sysdeps/aarch64/dl-sysdep.h b/sysdeps/aarch64/dl-sysdep.h > index 667786671c..1516dd7d3f 100644 > --- a/sysdeps/aarch64/dl-sysdep.h > +++ b/sysdeps/aarch64/dl-sysdep.h > @@ -18,8 +18,4 @@ > > #include_next <dl-sysdep.h> > > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > - > #define DL_EXTERN_PROTECTED_DATA > diff --git a/sysdeps/alpha/dl-sysdep.h b/sysdeps/alpha/dl-sysdep.h > deleted file mode 100644 > index 3099ee419f..0000000000 > --- a/sysdeps/alpha/dl-sysdep.h > +++ /dev/null > @@ -1,23 +0,0 @@ > -/* System-specific settings for dynamic linker code. Alpha version. > - Copyright (C) 2002-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/>. */ > - > -#include_next <dl-sysdep.h> > - > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > diff --git a/sysdeps/arc/dl-sysdep.h b/sysdeps/arc/dl-sysdep.h > index da060ceeee..cf4d160a73 100644 > --- a/sysdeps/arc/dl-sysdep.h > +++ b/sysdeps/arc/dl-sysdep.h > @@ -18,8 +18,4 @@ > > #include_next <dl-sysdep.h> > > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > - > #define DL_EXTERN_PROTECTED_DATA > diff --git a/sysdeps/arm/dl-sysdep.h b/sysdeps/arm/dl-sysdep.h > index ce7a84a7de..7a99107436 100644 > --- a/sysdeps/arm/dl-sysdep.h > +++ b/sysdeps/arm/dl-sysdep.h > @@ -18,8 +18,4 @@ > > #include_next <dl-sysdep.h> > > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > - > #define DL_EXTERN_PROTECTED_DATA > diff --git a/sysdeps/csky/dl-sysdep.h b/sysdeps/csky/dl-sysdep.h > deleted file mode 100644 > index fc8a58b94c..0000000000 > --- a/sysdeps/csky/dl-sysdep.h > +++ /dev/null > @@ -1,23 +0,0 @@ > -/* System-specific settings for dynamic linker code. C-SKY version. > - Copyright (C) 2018-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/>. */ > - > -#include_next <dl-sysdep.h> > - > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h > index 4a5e698db2..f3d3c78927 100644 > --- a/sysdeps/generic/ldsodefs.h > +++ b/sysdeps/generic/ldsodefs.h > @@ -762,18 +762,11 @@ rtld_hidden_proto (__libc_stack_end) > > /* Parameters passed to the dynamic linker. */ > extern int _dl_argc attribute_hidden attribute_relro; > -extern char **_dl_argv > -#ifndef DL_ARGV_NOT_RELRO > - attribute_relro > -#endif > - ; > +extern char **_dl_argv attribute_relro; > rtld_hidden_proto (_dl_argv) > #if IS_IN (rtld) > -extern unsigned int _dl_skip_args attribute_hidden > -# ifndef DL_ARGV_NOT_RELRO > - attribute_relro > -# endif > - ; > +/* Always 0, only kept for not-yet-updated target start code. */ > +extern const unsigned int _dl_skip_args attribute_hidden; > #endif > #define rtld_progname _dl_argv[0] > > diff --git a/sysdeps/ia64/dl-sysdep.h b/sysdeps/ia64/dl-sysdep.h > deleted file mode 100644 > index e3a58bec24..0000000000 > --- a/sysdeps/ia64/dl-sysdep.h > +++ /dev/null > @@ -1,23 +0,0 @@ > -/* System-specific settings for dynamic linker code. IA-64 version. > - Copyright (C) 2002-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/>. */ > - > -#include_next <dl-sysdep.h> > - > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > diff --git a/sysdeps/nios2/dl-sysdep.h b/sysdeps/nios2/dl-sysdep.h > index 0354650042..257b37c258 100644 > --- a/sysdeps/nios2/dl-sysdep.h > +++ b/sysdeps/nios2/dl-sysdep.h > @@ -18,8 +18,4 @@ > > #include_next <dl-sysdep.h> > > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > - > #define DL_EXTERN_PROTECTED_DATA > diff --git a/sysdeps/s390/s390-32/dl-sysdep.h b/sysdeps/s390/s390-32/dl-sysdep.h > deleted file mode 100644 > index 699b50f156..0000000000 > --- a/sysdeps/s390/s390-32/dl-sysdep.h > +++ /dev/null > @@ -1,23 +0,0 @@ > -/* System-specific settings for dynamic linker code. S/390 version. > - Copyright (C) 2014-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/>. */ > - > -#include_next <dl-sysdep.h> > - > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > diff --git a/sysdeps/sparc/dl-sysdep.h b/sysdeps/sparc/dl-sysdep.h > deleted file mode 100644 > index f32f16a107..0000000000 > --- a/sysdeps/sparc/dl-sysdep.h > +++ /dev/null > @@ -1,23 +0,0 @@ > -/* System-specific settings for dynamic linker code. SPARC version. > - Copyright (C) 2002-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/>. */ > - > -#include_next <dl-sysdep.h> > - > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > diff --git a/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h b/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h > index 0d2a1d093a..aa1de6b361 100644 > --- a/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h > +++ b/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h > @@ -48,8 +48,4 @@ extern int _dl_sysinfo_break attribute_hidden; > ".previous"); > #endif > > -/* _dl_argv cannot be attribute_relro, because _dl_start_user > - might write into it after _dl_start returns. */ > -#define DL_ARGV_NOT_RELRO 1 > - > #endif /* dl-sysdep.h */
diff --git a/elf/rtld.c b/elf/rtld.c index b5070d453f..71f7095def 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -157,16 +157,10 @@ static void dl_main_state_init (struct dl_main_state *state); extern char **_environ attribute_hidden; static void process_envvars (struct dl_main_state *state); -#ifdef DL_ARGV_NOT_RELRO -int _dl_argc attribute_hidden; -char **_dl_argv = NULL; -/* Nonzero if we were run directly. */ -unsigned int _dl_skip_args attribute_hidden; -#else int _dl_argc attribute_relro attribute_hidden; char **_dl_argv attribute_relro = NULL; -unsigned int _dl_skip_args attribute_relro attribute_hidden; -#endif +/* Always 0, only kept for not-yet-updated target start code. */ +const unsigned int _dl_skip_args attribute_hidden; rtld_hidden_data_def (_dl_argv) #ifndef THREAD_SET_STACK_GUARD diff --git a/sysdeps/aarch64/dl-sysdep.h b/sysdeps/aarch64/dl-sysdep.h index 667786671c..1516dd7d3f 100644 --- a/sysdeps/aarch64/dl-sysdep.h +++ b/sysdeps/aarch64/dl-sysdep.h @@ -18,8 +18,4 @@ #include_next <dl-sysdep.h> -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 - #define DL_EXTERN_PROTECTED_DATA diff --git a/sysdeps/alpha/dl-sysdep.h b/sysdeps/alpha/dl-sysdep.h deleted file mode 100644 index 3099ee419f..0000000000 --- a/sysdeps/alpha/dl-sysdep.h +++ /dev/null @@ -1,23 +0,0 @@ -/* System-specific settings for dynamic linker code. Alpha version. - Copyright (C) 2002-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/>. */ - -#include_next <dl-sysdep.h> - -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 diff --git a/sysdeps/arc/dl-sysdep.h b/sysdeps/arc/dl-sysdep.h index da060ceeee..cf4d160a73 100644 --- a/sysdeps/arc/dl-sysdep.h +++ b/sysdeps/arc/dl-sysdep.h @@ -18,8 +18,4 @@ #include_next <dl-sysdep.h> -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 - #define DL_EXTERN_PROTECTED_DATA diff --git a/sysdeps/arm/dl-sysdep.h b/sysdeps/arm/dl-sysdep.h index ce7a84a7de..7a99107436 100644 --- a/sysdeps/arm/dl-sysdep.h +++ b/sysdeps/arm/dl-sysdep.h @@ -18,8 +18,4 @@ #include_next <dl-sysdep.h> -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 - #define DL_EXTERN_PROTECTED_DATA diff --git a/sysdeps/csky/dl-sysdep.h b/sysdeps/csky/dl-sysdep.h deleted file mode 100644 index fc8a58b94c..0000000000 --- a/sysdeps/csky/dl-sysdep.h +++ /dev/null @@ -1,23 +0,0 @@ -/* System-specific settings for dynamic linker code. C-SKY version. - Copyright (C) 2018-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/>. */ - -#include_next <dl-sysdep.h> - -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 4a5e698db2..f3d3c78927 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -762,18 +762,11 @@ rtld_hidden_proto (__libc_stack_end) /* Parameters passed to the dynamic linker. */ extern int _dl_argc attribute_hidden attribute_relro; -extern char **_dl_argv -#ifndef DL_ARGV_NOT_RELRO - attribute_relro -#endif - ; +extern char **_dl_argv attribute_relro; rtld_hidden_proto (_dl_argv) #if IS_IN (rtld) -extern unsigned int _dl_skip_args attribute_hidden -# ifndef DL_ARGV_NOT_RELRO - attribute_relro -# endif - ; +/* Always 0, only kept for not-yet-updated target start code. */ +extern const unsigned int _dl_skip_args attribute_hidden; #endif #define rtld_progname _dl_argv[0] diff --git a/sysdeps/ia64/dl-sysdep.h b/sysdeps/ia64/dl-sysdep.h deleted file mode 100644 index e3a58bec24..0000000000 --- a/sysdeps/ia64/dl-sysdep.h +++ /dev/null @@ -1,23 +0,0 @@ -/* System-specific settings for dynamic linker code. IA-64 version. - Copyright (C) 2002-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/>. */ - -#include_next <dl-sysdep.h> - -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 diff --git a/sysdeps/nios2/dl-sysdep.h b/sysdeps/nios2/dl-sysdep.h index 0354650042..257b37c258 100644 --- a/sysdeps/nios2/dl-sysdep.h +++ b/sysdeps/nios2/dl-sysdep.h @@ -18,8 +18,4 @@ #include_next <dl-sysdep.h> -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 - #define DL_EXTERN_PROTECTED_DATA diff --git a/sysdeps/s390/s390-32/dl-sysdep.h b/sysdeps/s390/s390-32/dl-sysdep.h deleted file mode 100644 index 699b50f156..0000000000 --- a/sysdeps/s390/s390-32/dl-sysdep.h +++ /dev/null @@ -1,23 +0,0 @@ -/* System-specific settings for dynamic linker code. S/390 version. - Copyright (C) 2014-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/>. */ - -#include_next <dl-sysdep.h> - -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 diff --git a/sysdeps/sparc/dl-sysdep.h b/sysdeps/sparc/dl-sysdep.h deleted file mode 100644 index f32f16a107..0000000000 --- a/sysdeps/sparc/dl-sysdep.h +++ /dev/null @@ -1,23 +0,0 @@ -/* System-specific settings for dynamic linker code. SPARC version. - Copyright (C) 2002-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/>. */ - -#include_next <dl-sysdep.h> - -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 diff --git a/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h b/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h index 0d2a1d093a..aa1de6b361 100644 --- a/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h +++ b/sysdeps/unix/sysv/linux/ia64/dl-sysdep.h @@ -48,8 +48,4 @@ extern int _dl_sysinfo_break attribute_hidden; ".previous"); #endif -/* _dl_argv cannot be attribute_relro, because _dl_start_user - might write into it after _dl_start returns. */ -#define DL_ARGV_NOT_RELRO 1 - #endif /* dl-sysdep.h */