From 4243cbea6d30ce32b58abd8f1103156f8df617fa Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 4 Nov 2014 17:39:39 +0000 Subject: Don't use INTDEF/INTUSE with _dl_argv (bug 14132). Continuing the removal of the obsolete INTDEF / INTUSE mechanism, this patch replaces its use for _dl_argv with rtld_hidden_data_def and rtld_hidden_proto. Some places in .S files that previously used _dl_argv_internal or INTUSE(_dl_argv) now use __GI__dl_argv directly (there are plenty of existing examples of such direct use of __GI_*). A single place in rtld.c previously used _dl_argv without INTUSE, apparently accidentally, while the rtld_hidden_proto mechanism avoids such accidential omissions. As a consequence, this patch *does* change the contents of stripped ld.so. However, the installed stripped shared libraries are identical to those you get if instead of this patch you change that single _dl_argv use to use INTUSE, without any other changes. Tested for x86_64 (testsuite as well as comparison of installed stripped shared libraries as described above). [BZ #14132] * sysdeps/generic/ldsodefs.h (_dl_argv): Use rtld_hidden_proto. [IS_IN_rtld] (_dl_argv_internal): Do not declare. (rtld_progname): Make macro definition unconditional. * elf/rtld.c (_dl_argv): Use rtld_hidden_data_def instead of INTDEF. (dlmopen_doit): Do not use INTUSE with _dl_argv. (dl_main): Likewise. * elf/dl-sysdep.c (_dl_sysdep_start): Likewise. * sysdeps/alpha/dl-machine.h (RTLD_START): Use __GI__dl_argv instead of _dl_argv_internal. * sysdeps/powerpc/powerpc32/dl-start.S (_dl_start_user): Use __GI__dl_argv instead of INTUSE(_dl_argv). * sysdeps/powerpc/powerpc64/dl-machine.h (RTLD_START): Use __GI__dl_argv instead of _dl_argv_internal. --- ChangeLog | 16 ++++++++++++++ elf/dl-sysdep.c | 2 +- elf/rtld.c | 40 +++++++++++++++++----------------- sysdeps/alpha/dl-machine.h | 6 ++--- sysdeps/generic/ldsodefs.h | 10 ++------- sysdeps/powerpc/powerpc32/dl-start.S | 2 +- sysdeps/powerpc/powerpc64/dl-machine.h | 2 +- 7 files changed, 44 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 380aa866c6..3fa753b682 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,21 @@ 2014-11-04 Joseph Myers + [BZ #14132] + * sysdeps/generic/ldsodefs.h (_dl_argv): Use rtld_hidden_proto. + [IS_IN_rtld] (_dl_argv_internal): Do not declare. + (rtld_progname): Make macro definition unconditional. + * elf/rtld.c (_dl_argv): Use rtld_hidden_data_def instead of + INTDEF. + (dlmopen_doit): Do not use INTUSE with _dl_argv. + (dl_main): Likewise. + * elf/dl-sysdep.c (_dl_sysdep_start): Likewise. + * sysdeps/alpha/dl-machine.h (RTLD_START): Use __GI__dl_argv + instead of _dl_argv_internal. + * sysdeps/powerpc/powerpc32/dl-start.S (_dl_start_user): Use + __GI__dl_argv instead of INTUSE(_dl_argv). + * sysdeps/powerpc/powerpc64/dl-machine.h (RTLD_START): Use + __GI__dl_argv instead of _dl_argv_internal. + * soft-fp/op-common.h (_FP_TO_INT_ROUND): New macro. * soft-fp/double.h [_FP_W_TYPE_SIZE < 64] (FP_TO_INT_ROUND_D): New macro. diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c index d1a2bd290d..ae24d5dc8d 100644 --- a/elf/dl-sysdep.c +++ b/elf/dl-sysdep.c @@ -108,7 +108,7 @@ _dl_sysdep_start (void **start_argptr, #endif __libc_stack_end = DL_STACK_END (start_argptr); - DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, INTUSE(_dl_argv), _environ, + DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, _dl_argv, _environ, GLRO(dl_auxv)); user_entry = (ElfW(Addr)) ENTRY_POINT; diff --git a/elf/rtld.c b/elf/rtld.c index d5e007f9d6..537fc43744 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -83,7 +83,7 @@ int _dl_argc attribute_relro attribute_hidden; char **_dl_argv attribute_relro = NULL; unsigned int _dl_skip_args attribute_relro attribute_hidden; #endif -INTDEF(_dl_argv) +rtld_hidden_data_def (_dl_argv) #ifndef THREAD_SET_STACK_GUARD /* Only exported for architectures that don't store the stack guard canary @@ -492,7 +492,7 @@ dlmopen_doit (void *a) args->map = _dl_open (args->fname, (RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT | __RTLD_SECURE), - dl_main, LM_ID_NEWLM, _dl_argc, INTUSE(_dl_argv), + dl_main, LM_ID_NEWLM, _dl_argc, _dl_argv, __environ); } @@ -804,55 +804,55 @@ dl_main (const ElfW(Phdr) *phdr, GL(dl_rtld_map).l_name = rtld_progname; while (_dl_argc > 1) - if (! strcmp (INTUSE(_dl_argv)[1], "--list")) + if (! strcmp (_dl_argv[1], "--list")) { mode = list; GLRO(dl_lazy) = -1; /* This means do no dependency analysis. */ ++_dl_skip_args; --_dl_argc; - ++INTUSE(_dl_argv); + ++_dl_argv; } - else if (! strcmp (INTUSE(_dl_argv)[1], "--verify")) + else if (! strcmp (_dl_argv[1], "--verify")) { mode = verify; ++_dl_skip_args; --_dl_argc; - ++INTUSE(_dl_argv); + ++_dl_argv; } - else if (! strcmp (INTUSE(_dl_argv)[1], "--inhibit-cache")) + else if (! strcmp (_dl_argv[1], "--inhibit-cache")) { GLRO(dl_inhibit_cache) = 1; ++_dl_skip_args; --_dl_argc; - ++INTUSE(_dl_argv); + ++_dl_argv; } - else if (! strcmp (INTUSE(_dl_argv)[1], "--library-path") + else if (! strcmp (_dl_argv[1], "--library-path") && _dl_argc > 2) { - library_path = INTUSE(_dl_argv)[2]; + library_path = _dl_argv[2]; _dl_skip_args += 2; _dl_argc -= 2; - INTUSE(_dl_argv) += 2; + _dl_argv += 2; } - else if (! strcmp (INTUSE(_dl_argv)[1], "--inhibit-rpath") + else if (! strcmp (_dl_argv[1], "--inhibit-rpath") && _dl_argc > 2) { - GLRO(dl_inhibit_rpath) = INTUSE(_dl_argv)[2]; + GLRO(dl_inhibit_rpath) = _dl_argv[2]; _dl_skip_args += 2; _dl_argc -= 2; - INTUSE(_dl_argv) += 2; + _dl_argv += 2; } - else if (! strcmp (INTUSE(_dl_argv)[1], "--audit") && _dl_argc > 2) + else if (! strcmp (_dl_argv[1], "--audit") && _dl_argc > 2) { - process_dl_audit (INTUSE(_dl_argv)[2]); + process_dl_audit (_dl_argv[2]); _dl_skip_args += 2; _dl_argc -= 2; - INTUSE(_dl_argv) += 2; + _dl_argv += 2; } else break; @@ -886,7 +886,7 @@ of this helper program; chances are you did not intend to run this program.\n\ ++_dl_skip_args; --_dl_argc; - ++INTUSE(_dl_argv); + ++_dl_argv; /* The initialization of _dl_stack_flags done below assumes the executable's PT_GNU_STACK may have been honored by the kernel, and @@ -1800,7 +1800,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", ElfW(Addr) loadbase; lookup_t result; - result = _dl_lookup_symbol_x (INTUSE(_dl_argv)[i], main_map, + result = _dl_lookup_symbol_x (_dl_argv[i], main_map, &ref, main_map->l_scope, NULL, ELF_RTYPE_CLASS_PLT, DL_LOOKUP_ADD_DEPENDENCY, NULL); @@ -1808,7 +1808,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", loadbase = LOOKUP_VALUE_ADDRESS (result); _dl_printf ("%s found at 0x%0*Zd in object at 0x%0*Zd\n", - INTUSE(_dl_argv)[i], + _dl_argv[i], (int) sizeof ref->st_value * 2, (size_t) ref->st_value, (int) sizeof loadbase * 2, (size_t) loadbase); diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h index e6537dd6e5..64385ad68a 100644 --- a/sysdeps/alpha/dl-machine.h +++ b/sysdeps/alpha/dl-machine.h @@ -184,16 +184,16 @@ $fixup_stack: \n\ /* Adjust the stack pointer to skip _dl_skip_args words.\n\ This involves copying everything down, since the \n\ stack pointer must always be 16-byte aligned. */ \n\ - ldah $7, _dl_argv_internal($gp) !gprelhigh \n\ + ldah $7, __GI__dl_argv($gp) !gprelhigh \n\ ldq $2, 0($sp) \n\ - ldq $5, _dl_argv_internal($7) !gprellow \n\ + ldq $5, __GI__dl_argv($7) !gprellow \n\ subq $31, $1, $6 \n\ subq $2, $1, $2 \n\ s8addq $6, $5, $5 \n\ mov $sp, $4 \n\ s8addq $1, $sp, $3 \n\ stq $2, 0($sp) \n\ - stq $5, _dl_argv_internal($7) !gprellow \n\ + stq $5, __GI__dl_argv($7) !gprellow \n\ /* Copy down argv. */ \n\ 0: ldq $5, 8($3) \n\ addq $4, 8, $4 \n\ diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index e01df84a99..d1c8e2cb9d 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -641,6 +641,7 @@ extern char **_dl_argv attribute_relro #endif ; +rtld_hidden_proto (_dl_argv) #ifdef IS_IN_rtld extern unsigned int _dl_skip_args attribute_hidden # ifndef DL_ARGV_NOT_RELRO @@ -652,15 +653,8 @@ extern unsigned int _dl_skip_args_internal attribute_hidden attribute_relro # endif ; -extern char **_dl_argv_internal attribute_hidden -# ifndef DL_ARGV_NOT_RELRO - attribute_relro -# endif - ; -# define rtld_progname (INTUSE(_dl_argv)[0]) -#else -# define rtld_progname _dl_argv[0] #endif +#define rtld_progname _dl_argv[0] /* Flag set at startup and cleared when the last initializer has run. */ extern int _dl_starting_up; diff --git a/sysdeps/powerpc/powerpc32/dl-start.S b/sysdeps/powerpc/powerpc32/dl-start.S index b2078d4225..be8ce441ac 100644 --- a/sysdeps/powerpc/powerpc32/dl-start.S +++ b/sysdeps/powerpc/powerpc32/dl-start.S @@ -54,7 +54,7 @@ _dl_start_user: /* &_dl_argc in 29, &_dl_argv in 27, and _dl_loaded in 28. */ lwz r28,_rtld_local@got(r31) lwz r29,_dl_argc@got(r31) - lwz r27,INTUSE(_dl_argv)@got(r31) + lwz r27,__GI__dl_argv@got(r31) /* Call _dl_init (_dl_loaded, _dl_argc, _dl_argv, _dl_argv+_dl_argc+1). */ lwz r3,0(r28) diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 735a549f54..3007e80f90 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -169,7 +169,7 @@ DL_STARTING_UP_DEF \ ".LC__dl_argc:\n" \ " .tc _dl_argc[TC],_dl_argc\n" \ ".LC__dl_argv:\n" \ -" .tc _dl_argv_internal[TC],_dl_argv_internal\n" \ +" .tc __GI__dl_argv[TC],__GI__dl_argv\n" \ ".LC__dl_fini:\n" \ " .tc _dl_fini[TC],_dl_fini\n" \ " .popsection\n" \ -- cgit 1.4.1