From e6caf4e12ebb89254977a74b882757e371c5cc16 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 1 Mar 2002 09:44:29 +0000 Subject: Update. 2002-03-01 Ulrich Drepper * elf/Makefile (dl-routines): Add dl-origin. (elide-routines.os): Add dl-origin. * elf/Versions [ld] (GLIBC_PRIVATE): Add _dl_get_origin. * elf/dl-debug.c (_dl_debug_initialize): Add missing INTUSE around _dl_debug_state. * include/libc-symbols.c: Define attribute_hidden depending on HAVE_VISIBILITY_ATTRIBUTE. Add definition of INTVARDEF. * elf/dl-deps.c: Use INTUSE with __libc_enable_secure. * elf/dl-load.c: Likewise. * elf/rtld.c: Likewise. * include/unistd.h: Declare __libc_enable_secure_internal. * sysdeps/generic/dl-sysdep.c: Use INTVARDEF with __libc_enable_secure. Use INTUSE with __libc_enable_secure. * sysdeps/mach/hurd/dl-sysdep.c: Likewise. * elf/dl-deps.c: Use INTUSE with _dl_out_of_memory. * elf/dl-error.c: Likewise, * sysdeps/generic/ldsodefs.h: Declare _dl_out_of_memory_internal. * elf/dl-dst.h [_RTLD_GLOBAL]: Define _dl_get_origin to use INTUSE. * sysdeps/generic/dl-origin.c: Undefine _dl_get_origin macro before function definition. Use INTDEF with _dl_get_origin. * sysdeps/unix/sysv/linux/dl-origin.c: Likewise. * elf/dl-init.c: Use INTUSE with _dl_starting_up. * elf/rtld.c: Likewise. Use INTVARDEF for _dl_starting_up. * elf/dl-profile.c: Use INTDEF for _dl_mcount. * elf/dl-runtime.c: Use INTUSE with _dl_mcount. * sysdeps/generic/ldsodefs.h: Declare _dl_mcount_internal. * elf/dl-conflict.c: Use rtld_progrname instead of _dl_argv[0]. * elf/dl-deps.c: Likewise. * elf/dl-error.c: Likewise. * elf/dl-fini.c: Likewise. * elf/dl-init.c: Likewise. * elf/dl-load.c: Likewise. * elf/dl-lookup.c: Likewise. * elf/dl-reloc.c: Likewise. * elf/dl-version.c: Likewise. * elf/do-lookup.h: Likewise. * sysdeps/arm/dl-machine.h: Likewise. * sysdeps/cris/dl-machine.h: Likewise. * sysdeps/hppa/dl-machine.h: Likewise. * sysdeps/i386/dl-machine.h: Likewise. * sysdeps/m68k/dl-machine.h: Likewise. * sysdeps/powerpc/dl-machine.h: Likewise. * sysdeps/s390/s390-32/dl-machine.h: Likewise. * sysdeps/s390/s390-64/dl-machine.h: Likewise. * sysdeps/sh/dl-machine.h: Likewise. * sysdeps/sparc/sparc-32/dl-machine.h: Likewise. * sysdeps/sparc/sparc-64/dl-machine.h: Likewise. * sysdeps/x86_64/dl-machine.h: Likewise. * elf/rtld.c: Use INTDEF for _dl_argv. Use rtld_progrname instead of _dl_argv[0]. Use INTUSE with _dl_argv. * sysdeps/generic/dl-sysdep.c: Use INTUSE with _dl_argv. * sysdeps/generic/ldsodefs.h: Define rtld_progname macro. --- elf/rtld.c | 73 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 35 deletions(-) (limited to 'elf/rtld.c') diff --git a/elf/rtld.c b/elf/rtld.c index 12b3cc557b..97acf20b60 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -59,7 +59,8 @@ enum mode { normal, list, verify, trace }; static void process_envvars (enum mode *modep); int _dl_argc; -char **_dl_argv; +char **_dl_argv = NULL; +INTDEF(_dl_argv) unsigned int _dl_skip_args; /* Nonzero if we were run directly. */ /* Set nonzero during loading and initialization of executable and @@ -69,7 +70,8 @@ unsigned int _dl_skip_args; /* Nonzero if we were run directly. */ definition seen by libc.so's initializer; that value must be zero, and will be since that dynamic linker's _dl_start and dl_main will never be called. */ -int _dl_starting_up; +int _dl_starting_up = 0; +INTVARDEF(_dl_starting_up) /* This is the structure which defines all variables global to ld.so (except those which cannot be added for some reason). */ @@ -489,7 +491,7 @@ dl_main (const ElfW(Phdr) *phdr, process_envvars (&mode); /* Set up a flag which tells we are just starting. */ - _dl_starting_up = 1; + INTUSE(_dl_starting_up) = 1; if (*user_entry == (ElfW(Addr)) ENTRY_POINT) { @@ -511,41 +513,43 @@ dl_main (const ElfW(Phdr) *phdr, rtld_is_main = true; /* Note the place where the dynamic linker actually came from. */ - GL(dl_rtld_map).l_name = _dl_argv[0]; + GL(dl_rtld_map).l_name = rtld_progname; while (_dl_argc > 1) - if (! strcmp (_dl_argv[1], "--list")) + if (! strcmp (INTUSE(_dl_argv)[1], "--list")) { mode = list; GL(dl_lazy) = -1; /* This means do no dependency analysis. */ ++_dl_skip_args; --_dl_argc; - ++_dl_argv; + ++INTUSE(_dl_argv); } - else if (! strcmp (_dl_argv[1], "--verify")) + else if (! strcmp (INTUSE(_dl_argv)[1], "--verify")) { mode = verify; ++_dl_skip_args; --_dl_argc; - ++_dl_argv; + ++INTUSE(_dl_argv); } - else if (! strcmp (_dl_argv[1], "--library-path") && _dl_argc > 2) + else if (! strcmp (INTUSE(_dl_argv)[1], "--library-path") + && _dl_argc > 2) { - library_path = _dl_argv[2]; + library_path = INTUSE(_dl_argv)[2]; _dl_skip_args += 2; _dl_argc -= 2; - _dl_argv += 2; + INTUSE(_dl_argv) += 2; } - else if (! strcmp (_dl_argv[1], "--inhibit-rpath") && _dl_argc > 2) + else if (! strcmp (INTUSE(_dl_argv)[1], "--inhibit-rpath") + && _dl_argc > 2) { - GL(dl_inhibit_rpath) = _dl_argv[2]; + GL(dl_inhibit_rpath) = INTUSE(_dl_argv)[2]; _dl_skip_args += 2; _dl_argc -= 2; - _dl_argv += 2; + INTUSE(_dl_argv) += 2; } else break; @@ -577,7 +581,7 @@ of this helper program; chances are you did not intend to run this program.\n\ ++_dl_skip_args; --_dl_argc; - ++_dl_argv; + ++INTUSE(_dl_argv); /* Initialize the data structures for the search paths for shared objects. */ @@ -589,19 +593,17 @@ of this helper program; chances are you did not intend to run this program.\n\ const char *err_str = NULL; struct map_args args; - args.str = _dl_argv[0]; + args.str = rtld_progname; (void) INTUSE(_dl_catch_error) (&objname, &err_str, map_doit, &args); if (__builtin_expect (err_str != NULL, 0)) - { - if (err_str != _dl_out_of_memory) - free ((char *) err_str); - _exit (EXIT_FAILURE); - } + /* We don't free the returned string, the programs stops + anyway. */ + _exit (EXIT_FAILURE); } else { HP_TIMING_NOW (start); - INTUSE(_dl_map_object) (NULL, _dl_argv[0], 0, lt_library, 0, 0); + INTUSE(_dl_map_object) (NULL, rtld_progname, 0, lt_library, 0, 0); HP_TIMING_NOW (stop); HP_TIMING_DIFF (load_time, start, stop); @@ -814,7 +816,7 @@ of this helper program; chances are you did not intend to run this program.\n\ /* Prevent optimizing strsep. Speed is not important here. */ while ((p = (strsep) (&list, " :")) != NULL) if (p[0] != '\0' - && (__builtin_expect (! __libc_enable_secure, 1) + && (__builtin_expect (! INTUSE(__libc_enable_secure), 1) || strchr (p, '/') == NULL)) { struct link_map *new_map = INTUSE(_dl_map_object) (GL(dl_loaded), @@ -1029,9 +1031,9 @@ of this helper program; chances are you did not intend to run this program.\n\ GL(dl_trace_prelink_map) = l; _dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)\n", l->l_libname->name[0] ? l->l_libname->name - : _dl_argv[0] ?: "
", + : rtld_progname ?: "
", l->l_name[0] ? l->l_name - : _dl_argv[0] ?: "
", + : rtld_progname ?: "
", (int) sizeof l->l_map_start * 2, l->l_map_start, (int) sizeof l->l_addr * 2, @@ -1058,14 +1060,15 @@ of this helper program; chances are you did not intend to run this program.\n\ ElfW(Addr) loadbase; lookup_t result; - result = INTUSE(_dl_lookup_symbol) (_dl_argv[i], GL(dl_loaded), + result = INTUSE(_dl_lookup_symbol) (INTUSE(_dl_argv)[i], + GL(dl_loaded), &ref, GL(dl_loaded)->l_scope, ELF_RTYPE_CLASS_PLT, 1); loadbase = LOOKUP_VALUE_ADDRESS (result); _dl_printf ("%s found at 0x%0*Zd in object at 0x%0*Zd\n", - _dl_argv[i], + INTUSE(_dl_argv)[i], (int) sizeof ref->st_value * 2, ref->st_value, (int) sizeof loadbase * 2, loadbase); } @@ -1127,7 +1130,7 @@ of this helper program; chances are you did not intend to run this program.\n\ } _dl_printf ("\t%s:\n", - map->l_name[0] ? map->l_name : _dl_argv[0]); + map->l_name[0] ? map->l_name : rtld_progname); while (1) { @@ -1459,7 +1462,7 @@ print_unresolved (int errcode __attribute__ ((unused)), const char *objname, const char *errstring) { if (objname[0] == '\0') - objname = _dl_argv[0] ?: "
"; + objname = rtld_progname ?: "
"; _dl_error_printf ("%s (%s)\n", errstring, objname); } @@ -1469,7 +1472,7 @@ static void print_missing_version (int errcode __attribute__ ((unused)), const char *objname, const char *errstring) { - _dl_error_printf ("%s: %s: %s\n", _dl_argv[0] ?: "", + _dl_error_printf ("%s: %s: %s\n", rtld_progname ?: "", objname, errstring); } @@ -1585,8 +1588,8 @@ process_envvars (enum mode *modep) char *debug_output = NULL; /* This is the default place for profiling data file. */ - GL(dl_profile_output) = &"/var/tmp\0/var/profile"[__libc_enable_secure - ? 9 : 0]; + GL(dl_profile_output) + = &"/var/tmp\0/var/profile"[INTUSE(__libc_enable_secure) ? 9 : 0]; while ((envline = _dl_next_ld_env_entry (&runp)) != NULL) { @@ -1661,7 +1664,7 @@ process_envvars (enum mode *modep) case 11: /* Path where the binary is found. */ - if (!__libc_enable_secure + if (!INTUSE(__libc_enable_secure) && memcmp (envline, "ORIGIN_PATH", 11) == 0) GL(dl_origin_path) = &envline[12]; break; @@ -1687,7 +1690,7 @@ process_envvars (enum mode *modep) case 14: /* Where to place the profiling data file. */ - if (!__libc_enable_secure + if (!INTUSE(__libc_enable_secure) && memcmp (envline, "PROFILE_OUTPUT", 14) == 0 && envline[15] != '\0') GL(dl_profile_output) = &envline[15]; @@ -1725,7 +1728,7 @@ process_envvars (enum mode *modep) /* Extra security for SUID binaries. Remove all dangerous environment variables. */ - if (__builtin_expect (__libc_enable_secure, 0)) + if (__builtin_expect (INTUSE(__libc_enable_secure), 0)) { static const char unsecure_envvars[] = #ifdef EXTRA_UNSECURE_ENVVARS -- cgit 1.4.1