diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-03-05 10:29:47 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-03-05 10:29:47 +0000 |
commit | afdca0f2a3a18fb0dcfc334c205e0fb96e90e839 (patch) | |
tree | 59ba9a29d6174ebbbbe09258ea52e9f956e33c2e /elf | |
parent | 20c37dfde1a836a139f6269e8617260f2b90bf52 (diff) | |
download | glibc-afdca0f2a3a18fb0dcfc334c205e0fb96e90e839.tar.gz glibc-afdca0f2a3a18fb0dcfc334c205e0fb96e90e839.tar.xz glibc-afdca0f2a3a18fb0dcfc334c205e0fb96e90e839.zip |
Update.
* sysdeps/sparc/sparc64/dl-machine.h: Likewise. * sysdeps/sparc/sparc32/dl-machine.h: Likewise. * sysdeps/s390/s390-64/dl-machine.h: Likewise. * sysdeps/s390/s390-32/dl-machine.h: Likewise. * sysdeps/powerpc/powerpc64/dl-machine.h: Likewise. * sysdeps/powerpc/powerpc32/dl-machine.c: Likewise. * sysdeps/m68k/dl-machine.h: Likewise. * sysdeps/ia64/dl-machine.h: Likewise. * sysdeps/arm/dl-machine.h: Likewise. * sysdeps/alpha/dl-machine.h: Likewise.
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-close.c | 4 | ||||
-rw-r--r-- | elf/dl-conflict.c | 4 | ||||
-rw-r--r-- | elf/dl-deps.c | 10 | ||||
-rw-r--r-- | elf/dl-dst.h | 4 | ||||
-rw-r--r-- | elf/dl-error.c | 4 | ||||
-rw-r--r-- | elf/dl-fini.c | 4 | ||||
-rw-r--r-- | elf/dl-init.c | 6 | ||||
-rw-r--r-- | elf/dl-load.c | 49 | ||||
-rw-r--r-- | elf/dl-lookup.c | 24 | ||||
-rw-r--r-- | elf/dl-minimal.c | 8 | ||||
-rw-r--r-- | elf/dl-open.c | 11 | ||||
-rw-r--r-- | elf/dl-profile.c | 24 | ||||
-rw-r--r-- | elf/dl-reloc.c | 15 | ||||
-rw-r--r-- | elf/dl-runtime.c | 4 | ||||
-rw-r--r-- | elf/dl-support.c | 6 | ||||
-rw-r--r-- | elf/dl-version.c | 4 | ||||
-rw-r--r-- | elf/do-lookup.h | 6 | ||||
-rw-r--r-- | elf/rtld.c | 110 |
18 files changed, 158 insertions, 139 deletions
diff --git a/elf/dl-close.c b/elf/dl-close.c index c7424c5ffb..c63dabbfe1 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -134,7 +134,7 @@ _dl_close (void *_map) if (map->l_opencount > 1 || map->l_type != lt_loaded) { /* There are still references to this object. Do nothing more. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)) _dl_debug_printf ("\nclosing file=%s; opencount == %u\n", map->l_name, map->l_opencount); @@ -224,7 +224,7 @@ _dl_close (void *_map) && (imap->l_flags_1 & DF_1_NODELETE) == 0) { /* When debugging print a message first. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) _dl_debug_printf ("\ncalling fini: %s\n\n", imap->l_name); /* Call its termination function. Do not do it for diff --git a/elf/dl-conflict.c b/elf/dl-conflict.c index 0068cd885a..8546d365c9 100644 --- a/elf/dl-conflict.c +++ b/elf/dl-conflict.c @@ -1,5 +1,5 @@ /* Resolve conflicts against already prelinked libraries. - Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2001. @@ -33,7 +33,7 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict, ElfW(Rela) *conflictend) { #if ! ELF_MACHINE_NO_RELA - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0)) _dl_printf ("\nconflict processing: %s\n", l->l_name[0] ? l->l_name : rtld_progname); diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 0a9183faee..b2e6ec612b 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -1,5 +1,5 @@ /* Load the dependencies of a mapped object. - Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1996-2003, 2004 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 @@ -126,7 +126,7 @@ empty dynamics string token substitution")); \ else \ { \ /* This is for DT_AUXILIARY. */ \ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0)) \ + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))\ INTUSE(_dl_debug_printf) (N_("\ cannot load auxiliary `%s' because of empty dynamic string token " \ "substitution\n"), __str); \ @@ -291,7 +291,7 @@ _dl_map_object_deps (struct link_map *map, int err; /* Say that we are about to load an auxiliary library. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)) INTUSE(_dl_debug_printf) ("load auxiliary object=%s" " requested by file=%s\n", @@ -319,7 +319,7 @@ _dl_map_object_deps (struct link_map *map, int err; /* Say that we are about to load an auxiliary library. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)) INTUSE(_dl_debug_printf) ("load filtered object=%s" " requested by file=%s\n", @@ -510,7 +510,7 @@ _dl_map_object_deps (struct link_map *map, runp->map->l_reserved = 0; } - if (__builtin_expect(GL(dl_debug_mask) & DL_DEBUG_PRELINK, 0) != 0 + if (__builtin_expect(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK, 0) != 0 && map == GL(dl_loaded)) { /* If we are to compute conflicts, we have to build local scope diff --git a/elf/dl-dst.h b/elf/dl-dst.h index 4f0669d92b..b50d6735e3 100644 --- a/elf/dl-dst.h +++ b/elf/dl-dst.h @@ -1,5 +1,5 @@ /* Handling of dynamic sring tokens. - Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1999, 2001, 2002, 2003, 2004 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 @@ -62,7 +62,7 @@ extern size_t _dl_dst_count_internal (const char *name, int is_path); origin_len = (l)->l_origin == (char *) -1 \ ? 0 : strlen ((l)->l_origin); \ \ - __len += __cnt * (MAX (origin_len, GL(dl_platformlen)) - 7); \ + __len += __cnt * (MAX (origin_len, GLRO(dl_platformlen)) - 7); \ } \ \ __len; }) diff --git a/elf/dl-error.c b/elf/dl-error.c index df91088843..f234026701 100644 --- a/elf/dl-error.c +++ b/elf/dl-error.c @@ -1,5 +1,5 @@ /* Error handling for runtime dynamic linker. - Copyright (C) 1995,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1995-2002,2004 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 @@ -121,7 +121,7 @@ internal_function _dl_signal_cerror (int errcode, const char *objname, const char *occation, const char *errstring) { - if (__builtin_expect (GL(dl_debug_mask) + if (__builtin_expect (GLRO(dl_debug_mask) & ~(DL_DEBUG_STATISTICS|DL_DEBUG_PRELINK), 0)) INTUSE(_dl_debug_printf) ("%s: error: %s: %s (%s)\n", objname, occation, errstring, receiver ? "continued" : "fatal"); diff --git a/elf/dl-fini.c b/elf/dl-fini.c index 7115efb85a..3dc1db16c9 100644 --- a/elf/dl-fini.c +++ b/elf/dl-fini.c @@ -146,7 +146,7 @@ _dl_fini (void) continue; /* When debugging print a message first. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) INTUSE(_dl_debug_printf) ("\ncalling fini: %s\n\n", l->l_name[0] ? l->l_name : rtld_progname); @@ -174,7 +174,7 @@ _dl_fini (void) __rtld_lock_unlock_recursive (GL(dl_load_lock)); - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_STATISTICS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS, 0)) { INTUSE(_dl_debug_printf) ("\nruntime linker statistics:\n"); INTUSE(_dl_debug_printf) ("\ diff --git a/elf/dl-init.c b/elf/dl-init.c index 0fb9328ef9..37d5045d03 100644 --- a/elf/dl-init.c +++ b/elf/dl-init.c @@ -1,5 +1,5 @@ /* Return the next shared object initializer function not yet run. - Copyright (C) 1995, 1996, 1998-2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1998-2002, 2004 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 @@ -51,7 +51,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env) return; /* Print a debug message if wanted. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) INTUSE(_dl_debug_printf) ("\ncalling init: %s\n\n", l->l_name[0] ? l->l_name : rtld_progname); @@ -108,7 +108,7 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env) ElfW(Addr) *addrs; unsigned int cnt; - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) INTUSE(_dl_debug_printf) ("\ncalling preinit: %s\n\n", main_map->l_name[0] ? main_map->l_name : rtld_progname); diff --git a/elf/dl-load.c b/elf/dl-load.c index cba75f62fa..f7449bce9c 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -248,7 +248,7 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result, INTUSE(__libc_enable_secure))) != 0) repl = l->l_origin; else if ((len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0) - repl = GL(dl_platform); + repl = GLRO(dl_platform); else if ((len = is_dst (start, name, "LIB", is_path, 0)) != 0) repl = DL_DST_LIB; @@ -502,10 +502,10 @@ decompose_rpath (struct r_search_path_struct *sps, /* First see whether we must forget the RUNPATH and RPATH from this object. */ - if (__builtin_expect (GL(dl_inhibit_rpath) != NULL, 0) + if (__builtin_expect (GLRO(dl_inhibit_rpath) != NULL, 0) && !INTUSE(__libc_enable_secure)) { - const char *inhp = GL(dl_inhibit_rpath); + const char *inhp = GLRO(dl_inhibit_rpath); do { @@ -623,7 +623,7 @@ _dl_init_paths (const char *llp) directories addressed by the LD_LIBRARY_PATH environment variable. */ /* Get the capabilities. */ - capstr = _dl_important_hwcaps (GL(dl_platform), GL(dl_platformlen), + capstr = _dl_important_hwcaps (GLRO(dl_platform), GLRO(dl_platformlen), &ncapstr, &max_capstrlen); /* First set up the rest of the default search directory entries. */ @@ -844,7 +844,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, return NULL; /* Print debugging message. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)) INTUSE(_dl_debug_printf) ("file=%s; generating link map\n", name); /* This is the ELF header. We read it in `open_verify'. */ @@ -928,7 +928,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, case PT_LOAD: /* A load command tells us to map in part of the file. We record the load commands and process them all later. */ - if (__builtin_expect ((ph->p_align & (GL(dl_pagesize) - 1)) != 0, + if (__builtin_expect ((ph->p_align & (GLRO(dl_pagesize) - 1)) != 0, 0)) { errstring = N_("ELF load command alignment not page-aligned"); @@ -944,8 +944,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, c = &loadcmds[nloadcmds++]; c->mapstart = ph->p_vaddr & ~(ph->p_align - 1); - c->mapend = ((ph->p_vaddr + ph->p_filesz + GL(dl_pagesize) - 1) - & ~(GL(dl_pagesize) - 1)); + c->mapend = ((ph->p_vaddr + ph->p_filesz + GLRO(dl_pagesize) - 1) + & ~(GLRO(dl_pagesize) - 1)); c->dataend = ph->p_vaddr + ph->p_filesz; c->allocend = ph->p_vaddr + ph->p_memsz; c->mapoff = ph->p_offset & ~(ph->p_align - 1); @@ -1090,7 +1090,7 @@ cannot allocate TLS data structures for initial thread"); the OS can do whatever it likes. */ ElfW(Addr) mappref; mappref = (ELF_PREFERRED_ADDRESS (loader, maplength, - c->mapstart & GL(dl_use_load_bias)) + c->mapstart & GLRO(dl_use_load_bias)) - MAP_BASE_ADDR (l)); /* Remember which part of the address space this object uses. */ @@ -1164,8 +1164,8 @@ cannot allocate TLS data structures for initial thread"); zero = l->l_addr + c->dataend; zeroend = l->l_addr + c->allocend; - zeropage = ((zero + GL(dl_pagesize) - 1) - & ~(GL(dl_pagesize) - 1)); + zeropage = ((zero + GLRO(dl_pagesize) - 1) + & ~(GLRO(dl_pagesize) - 1)); if (zeroend < zeropage) /* All the extra data is in the last page of the segment. @@ -1178,8 +1178,9 @@ cannot allocate TLS data structures for initial thread"); if (__builtin_expect ((c->prot & PROT_WRITE) == 0, 0)) { /* Dag nab it. */ - if (__mprotect ((caddr_t) (zero & ~(GL(dl_pagesize) - 1)), - GL(dl_pagesize), c->prot|PROT_WRITE) < 0) + if (__mprotect ((caddr_t) (zero + & ~(GLRO(dl_pagesize) - 1)), + GLRO(dl_pagesize), c->prot|PROT_WRITE) < 0) { errstring = N_("cannot change memory protections"); goto call_lose_errno; @@ -1187,8 +1188,8 @@ cannot allocate TLS data structures for initial thread"); } memset ((void *) zero, '\0', zeropage - zero); if (__builtin_expect ((c->prot & PROT_WRITE) == 0, 0)) - __mprotect ((caddr_t) (zero & ~(GL(dl_pagesize) - 1)), - GL(dl_pagesize), c->prot); + __mprotect ((caddr_t) (zero & ~(GLRO(dl_pagesize) - 1)), + GLRO(dl_pagesize), c->prot); } if (zeroend > zeropage) @@ -1258,7 +1259,7 @@ cannot allocate TLS data structures for initial thread"); l->l_entry += l->l_addr; - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)) INTUSE(_dl_debug_printf) ("\ dynamic: 0x%0*lx base: 0x%0*lx size: 0x%0*Zx\n\ entry: 0x%0*lx phdr: 0x%0*lx phnum: %*u\n\n", @@ -1350,7 +1351,7 @@ cannot enable executable stack as shared object requires"); /* When we profile the SONAME might be needed for something else but loading. Add it right away. */ - if (__builtin_expect (GL(dl_profile) != NULL, 0) + if (__builtin_expect (GLRO(dl_profile) != NULL, 0) && l->l_info[DT_SONAME] != NULL) add_name_to_object (l, ((const char *) D_PTR (l, l_info[DT_STRTAB]) + l->l_info[DT_SONAME]->d_un.d_val)); @@ -1570,7 +1571,7 @@ open_verify (const char *name, struct filebuf *fbp) + (abi_note[6] & 0xff) * 256 + (abi_note[7] & 0xff); if (abi_note[4] != __ABI_TAG_OS - || (GL(dl_osversion) && GL(dl_osversion) < osversion)) + || (GLRO(dl_osversion) && GLRO(dl_osversion) < osversion)) { close_and_out: __close (fd); @@ -1615,7 +1616,7 @@ open_path (const char *name, size_t namelen, int preloaded, /* If we are debugging the search for libraries print the path now if it hasn't happened now. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0) && current_what != this_dir->what) { current_what = this_dir->what; @@ -1636,7 +1637,7 @@ open_path (const char *name, size_t namelen, int preloaded, - buf); /* Print name we try if this is wanted. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)) INTUSE(_dl_debug_printf) (" trying file=%s\n", buf); fd = open_verify (buf, fbp); @@ -1769,7 +1770,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded, } /* Display information if we are debugging. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0) && loader != NULL) INTUSE(_dl_debug_printf) ("\nfile=%s; needed by %s\n", name, loader->l_name[0] @@ -1781,7 +1782,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded, size_t namelen = strlen (name) + 1; - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)) INTUSE(_dl_debug_printf) ("find library=%s; searching\n", name); fd = -1; @@ -1886,7 +1887,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded, &realname, &fb); /* Add another newline when we are tracing the library loading. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)) INTUSE(_dl_debug_printf) ("\n"); } else @@ -1908,7 +1909,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded, if (__builtin_expect (fd, 0) == -1) { if (trace_mode - && __builtin_expect (GL(dl_debug_mask) & DL_DEBUG_PRELINK, 0) == 0) + && __builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK, 0) == 0) { /* We haven't found an appropriate library. But since we are only interested in the list of libraries this isn't diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index 9d9a12efbf..f4ebd93fc3 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -1,5 +1,5 @@ /* Look up a symbol in the loaded objects. - Copyright (C) 1995-2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1995-2002, 2003, 2004 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 @@ -190,7 +190,7 @@ add_dependency (struct link_map *undef_map, struct link_map *map) ++(*list)->l_opencount; /* Display information if we are debugging. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)) INTUSE(_dl_debug_printf) ("\ \nfile=%s; needed by %s (relocation dependency)\n\n", map->l_name[0] ? map->l_name : rtld_progname, @@ -315,7 +315,7 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map, return INTUSE(_dl_lookup_symbol) (undef_name, undef_map, ref, symbol_scope, type_class, flags); - if (__builtin_expect (GL(dl_debug_mask) + if (__builtin_expect (GLRO(dl_debug_mask) & (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0)) _dl_debug_bindings (undef_name, undef_map, ref, symbol_scope, ¤t_value, NULL, type_class, protected); @@ -389,7 +389,7 @@ _dl_lookup_symbol_skip (const char *undef_name, } } - if (__builtin_expect (GL(dl_debug_mask) + if (__builtin_expect (GLRO(dl_debug_mask) & (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0)) _dl_debug_bindings (undef_name, undef_map, ref, symbol_scope, ¤t_value, NULL, 0, protected); @@ -522,7 +522,7 @@ _dl_lookup_versioned_symbol (const char *undef_name, ref, symbol_scope, version, type_class, flags); - if (__builtin_expect (GL(dl_debug_mask) + if (__builtin_expect (GLRO(dl_debug_mask) & (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0)) _dl_debug_bindings (undef_name, undef_map, ref, symbol_scope, ¤t_value, version, type_class, protected); @@ -609,7 +609,7 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name, } } - if (__builtin_expect (GL(dl_debug_mask) + if (__builtin_expect (GLRO(dl_debug_mask) & (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0)) _dl_debug_bindings (undef_name, undef_map, ref, symbol_scope, ¤t_value, version, 0, protected); @@ -650,7 +650,7 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, { const char *reference_name = undef_map->l_name; - if (GL(dl_debug_mask) & DL_DEBUG_BINDINGS) + if (GLRO(dl_debug_mask) & DL_DEBUG_BINDINGS) { INTUSE(_dl_debug_printf) ("binding file %s to %s: %s symbol `%s'", (reference_name[0] @@ -666,13 +666,13 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, _dl_debug_printf_c ("\n"); } #ifdef SHARED - if (GL(dl_debug_mask) & DL_DEBUG_PRELINK) + if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) { int conflict = 0; struct sym_val val = { NULL, NULL }; - if ((GL(dl_trace_prelink_map) == NULL - || GL(dl_trace_prelink_map) == GL(dl_loaded)) + if ((GLRO(dl_trace_prelink_map) == NULL + || GLRO(dl_trace_prelink_map) == GL(dl_loaded)) && undef_map != GL(dl_loaded)) { const unsigned long int hash = _dl_elf_hash (undef_name); @@ -698,8 +698,8 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, #endif if (conflict - || GL(dl_trace_prelink_map) == undef_map - || GL(dl_trace_prelink_map) == NULL + || GLRO(dl_trace_prelink_map) == undef_map + || GLRO(dl_trace_prelink_map) == NULL || type_class == 4) { _dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ", diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c index 3a51df30fb..4ec2ebcbb4 100644 --- a/elf/dl-minimal.c +++ b/elf/dl-minimal.c @@ -1,5 +1,5 @@ /* Minimal replacements for basic facilities used in the dynamic linker. - Copyright (C) 1995,96,97,98,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1995-1998,2000-2002,2004 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 @@ -66,8 +66,8 @@ __libc_memalign (size_t align, size_t n) extern int _end attribute_hidden; alloc_ptr = &_end; alloc_end = (void *) 0 + (((alloc_ptr - (void *) 0) - + GL(dl_pagesize) - 1) - & ~(GL(dl_pagesize) - 1)); + + GLRO(dl_pagesize) - 1) + & ~(GLRO(dl_pagesize) - 1)); } /* Make sure the allocation pointer is ideally aligned. */ @@ -78,7 +78,7 @@ __libc_memalign (size_t align, size_t n) { /* Insufficient space left; allocate another page. */ caddr_t page; - size_t nup = (n + GL(dl_pagesize) - 1) & ~(GL(dl_pagesize) - 1); + size_t nup = (n + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1); page = __mmap (0, nup, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, _dl_zerofd, 0); assert (page != MAP_FAILED); diff --git a/elf/dl-open.c b/elf/dl-open.c index 9befbc41cf..09687d8940 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -308,7 +308,7 @@ dl_open_worker (void *a) if (new->l_searchlist.r_list != NULL) { /* Let the user know about the opencount. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)) _dl_debug_printf ("opening file=%s; opencount == %u\n\n", new->l_name, new->l_opencount); @@ -336,7 +336,7 @@ dl_open_worker (void *a) #endif /* Only do lazy relocation if `LD_BIND_NOW' is not set. */ - lazy = (mode & RTLD_BINDING_MASK) == RTLD_LAZY && GL(dl_lazy); + lazy = (mode & RTLD_BINDING_MASK) == RTLD_LAZY && GLRO(dl_lazy); /* Relocate the objects loaded. We do this in reverse order so that copy relocs of earlier objects overwrite the data written by later objects. */ @@ -349,7 +349,7 @@ dl_open_worker (void *a) if (! l->l_relocated) { #ifdef SHARED - if (GL(dl_profile) != NULL) + if (GLRO(dl_profile) != NULL) { /* If this here is the shared object which we want to profile make sure the profile is started. We can find out whether @@ -362,7 +362,8 @@ dl_open_worker (void *a) if (old_profile_map == NULL && GL(dl_profile_map) != NULL) /* We must prepare the profiling. */ - _dl_start_profile (GL(dl_profile_map), GL(dl_profile_output)); + _dl_start_profile (GL(dl_profile_map), + GLRO(dl_profile_output)); } else #endif @@ -548,7 +549,7 @@ dl_open_worker (void *a) #endif /* Let the user know about the opencount. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)) _dl_debug_printf ("opening file=%s; opencount == %u\n\n", new->l_name, new->l_opencount); } diff --git a/elf/dl-profile.c b/elf/dl-profile.c index be706cefbf..164ae98f99 100644 --- a/elf/dl-profile.c +++ b/elf/dl-profile.c @@ -1,5 +1,5 @@ /* Profiling of shared libraries. - Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1997-2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Based on the BSD mcount implementation. @@ -198,9 +198,9 @@ _dl_start_profile (struct link_map *map, const char *output_dir) for (ph = map->l_phdr; ph < &map->l_phdr[map->l_phnum]; ++ph) if (ph->p_type == PT_LOAD && (ph->p_flags & PF_X)) { - ElfW(Addr) start = (ph->p_vaddr & ~(GL(dl_pagesize) - 1)); - ElfW(Addr) end = ((ph->p_vaddr + ph->p_memsz + GL(dl_pagesize) - 1) - & ~(GL(dl_pagesize) - 1)); + ElfW(Addr) start = (ph->p_vaddr & ~(GLRO(dl_pagesize) - 1)); + ElfW(Addr) end = ((ph->p_vaddr + ph->p_memsz + GLRO(dl_pagesize) - 1) + & ~(GLRO(dl_pagesize) - 1)); if (start < mapstart) mapstart = start; @@ -273,11 +273,11 @@ _dl_start_profile (struct link_map *map, const char *output_dir) /* First determine the output name. We write in the directory OUTPUT_DIR and the name is composed from the shared objects soname (or the file name) and the ending ".profile". */ - filename = (char *) alloca (strlen (output_dir) + 1 + strlen (GL(dl_profile)) - + sizeof ".profile"); + filename = (char *) alloca (strlen (output_dir) + 1 + + strlen (GLRO(dl_profile)) + sizeof ".profile"); cp = __stpcpy (filename, output_dir); *cp++ = '/'; - __stpcpy (__stpcpy (cp, GL(dl_profile)), ".profile"); + __stpcpy (__stpcpy (cp, GLRO(dl_profile)), ".profile"); #ifdef O_NOFOLLOW # define EXTRA_FLAGS | O_NOFOLLOW @@ -310,11 +310,11 @@ _dl_start_profile (struct link_map *map, const char *output_dir) if (st.st_size == 0) { /* We have to create the file. */ - char buf[GL(dl_pagesize)]; + char buf[GLRO(dl_pagesize)]; - memset (buf, '\0', GL(dl_pagesize)); + memset (buf, '\0', GLRO(dl_pagesize)); - if (__lseek (fd, expected_size & ~(GL(dl_pagesize) - 1), SEEK_SET) == -1) + if (__lseek (fd, expected_size & ~(GLRO(dl_pagesize) - 1), SEEK_SET) == -1) { char buf[400]; int errnum; @@ -327,7 +327,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir) } if (TEMP_FAILURE_RETRY (__libc_write (fd, buf, (expected_size - & (GL(dl_pagesize) + & (GLRO(dl_pagesize) - 1)))) < 0) goto cannot_create; @@ -341,7 +341,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir) __munmap ((void *) addr, expected_size); _dl_error_printf ("%s: file is no correct profile data file for `%s'\n", - filename, GL(dl_profile)); + filename, GLRO(dl_profile)); return; } diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c index 0fda3de3a7..dab5dea13b 100644 --- a/elf/dl-reloc.c +++ b/elf/dl-reloc.c @@ -146,7 +146,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], && __builtin_expect (l->l_info[DT_BIND_NOW] != NULL, 0)) lazy = 0; - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0)) INTUSE(_dl_debug_printf) ("\nrelocation processing: %s%s\n", l->l_name[0] ? l->l_name : rtld_progname, lazy ? " (lazy)" : ""); @@ -165,10 +165,10 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], struct textrels *newp; newp = (struct textrels *) alloca (sizeof (*newp)); - newp->len = (((ph->p_vaddr + ph->p_memsz + GL(dl_pagesize) - 1) - & ~(GL(dl_pagesize) - 1)) - - (ph->p_vaddr & ~(GL(dl_pagesize) - 1))); - newp->start = ((ph->p_vaddr & ~(GL(dl_pagesize) - 1)) + newp->len = (((ph->p_vaddr + ph->p_memsz + GLRO(dl_pagesize) - 1) + & ~(GLRO(dl_pagesize) - 1)) + - (ph->p_vaddr & ~(GLRO(dl_pagesize) - 1))); + newp->start = ((ph->p_vaddr & ~(GLRO(dl_pagesize) - 1)) + (caddr_t) l->l_addr); if (__mprotect (newp->start, newp->len, PROT_READ|PROT_WRITE) < 0) @@ -318,9 +318,10 @@ INTDEF (_dl_relocate_object) void internal_function _dl_protect_relro (struct link_map *l) { - ElfW(Addr) start = ((l->l_addr + l->l_relro_addr) & ~(GL(dl_pagesize) - 1)); + ElfW(Addr) start = ((l->l_addr + l->l_relro_addr) + & ~(GLRO(dl_pagesize) - 1)); ElfW(Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size) - & ~(GL(dl_pagesize) - 1)); + & ~(GLRO(dl_pagesize) - 1)); if (start != end && __mprotect ((void *) start, end - start, PROT_READ) < 0) diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index 2992f652c6..b71dee5e75 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -118,7 +118,7 @@ fixup ( value = elf_machine_plt_value (l, reloc, value); /* Finally, fix up the plt itself. */ - if (__builtin_expect (GL(dl_bind_not), 0)) + if (__builtin_expect (GLRO(dl_bind_not), 0)) return value; return elf_machine_fixup_plt (l, result, reloc, rel_addr, value); @@ -209,7 +209,7 @@ profile_fixup ( value = elf_machine_plt_value (l, reloc, value); /* Store the result for later runs. */ - if (__builtin_expect (! GL(dl_bind_not), 1)) + if (__builtin_expect (! GLRO(dl_bind_not), 1)) *resultp = value; } diff --git a/elf/dl-support.c b/elf/dl-support.c index aeebf3c5e2..44335e8a8e 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -175,10 +175,10 @@ _dl_aux_init (ElfW(auxv_t) *av) switch (av->a_type) { case AT_PAGESZ: - GL(dl_pagesize) = av->a_un.a_val; + GLRO(dl_pagesize) = av->a_un.a_val; break; case AT_CLKTCK: - GL(dl_clktck) = av->a_un.a_val; + GLRO(dl_clktck) = av->a_un.a_val; break; case AT_PHDR: GL(dl_phdr) = av->a_un.a_ptr; @@ -187,7 +187,7 @@ _dl_aux_init (ElfW(auxv_t) *av) GL(dl_phnum) = av->a_un.a_val; break; case AT_HWCAP: - GL(dl_hwcap) = av->a_un.a_val; + GLRO(dl_hwcap) = av->a_un.a_val; break; #ifdef NEED_DL_SYSINFO case AT_SYSINFO: diff --git a/elf/dl-version.c b/elf/dl-version.c index 3daea87848..83d63f30de 100644 --- a/elf/dl-version.c +++ b/elf/dl-version.c @@ -1,5 +1,5 @@ /* Handle symbol and library versioning. - Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1997-2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -87,7 +87,7 @@ match_symbol (const char *name, ElfW(Word) hash, const char *string, int result = 0; /* Display information about what we are doing while debugging. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_VERSIONS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_VERSIONS, 0)) INTUSE(_dl_debug_printf) ("\ checking for version `%s' in file %s required by file %s\n", string, map->l_name[0] diff --git a/elf/do-lookup.h b/elf/do-lookup.h index 8ba07253e3..15900cdf99 100644 --- a/elf/do-lookup.h +++ b/elf/do-lookup.h @@ -1,5 +1,5 @@ /* Look up a symbol in the loaded objects. - Copyright (C) 1995-2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1995-2002, 2003, 2004 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 @@ -60,7 +60,7 @@ FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref, continue; /* Print some debugging info if wanted. */ - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0)) INTUSE(_dl_debug_printf) ("symbol=%s; lookup in file=%s\n", undef_name, (map->l_name[0] ? map->l_name : rtld_progname)); @@ -183,7 +183,7 @@ FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref, { case STB_WEAK: /* Weak definition. Use this value if we don't find another. */ - if (__builtin_expect (GL(dl_dynamic_weak), 0)) + if (__builtin_expect (GLRO(dl_dynamic_weak), 0)) { if (! result->s) { diff --git a/elf/rtld.c b/elf/rtld.c index 87a86bed32..943901f56b 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -95,14 +95,6 @@ struct rtld_global _rtld_global = /* Get architecture specific initializer. */ #include <dl-procinfo.c> ._dl_debug_fd = STDERR_FILENO, -#ifdef NEED_DL_SYSINFO - ._dl_sysinfo = DL_SYSINFO_DEFAULT, -#endif - ._dl_lazy = 1, - ._dl_use_load_bias = -2, - ._dl_fpu_control = _FPU_DEFAULT, - ._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID, - ._dl_hwcap_mask = HWCAP_IMPORTANT, /* Default presumption without further information is executable stack. */ ._dl_stack_flags = PF_R|PF_W|PF_X, #ifdef _LIBC_REENTRANT @@ -116,6 +108,28 @@ struct rtld_global _rtld_global = extern struct rtld_global _rtld_local __attribute__ ((alias ("_rtld_global"), visibility ("hidden"))); + +/* This variable is similar to _rtld_local, but all values are + read-only after relocation. */ +struct rtld_global_ro _rtld_global_ro attribute_relro = + { +#ifdef NEED_DL_SYSINFO + ._dl_sysinfo = DL_SYSINFO_DEFAULT, +#endif + ._dl_use_load_bias = -2, + ._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID, + ._dl_hwcap_mask = HWCAP_IMPORTANT, + ._dl_lazy = 1, + ._dl_fpu_control = _FPU_DEFAULT, + }; +/* If we would use strong_alias here the compiler would see a + non-hidden definition. This would undo the effect of the previous + declaration. So spell out was strong_alias does plus add the + visibility attribute. */ +extern struct rtld_global_ro _rtld_local_ro + __attribute__ ((alias ("_rtld_global_ro"), visibility ("hidden"))); + + static void dl_main (const ElfW(Phdr) *phdr, ElfW(Word) phnum, ElfW(Addr) *user_entry); @@ -280,7 +294,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) } #endif - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_STATISTICS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS, 0)) { #ifndef HP_TIMING_NONAVAIL print_statistics (&rtld_total_time); @@ -712,7 +726,7 @@ dl_main (const ElfW(Phdr) *phdr, if (! strcmp (INTUSE(_dl_argv)[1], "--list")) { mode = list; - GL(dl_lazy) = -1; /* This means do no dependency analysis. */ + GLRO(dl_lazy) = -1; /* This means do no dependency analysis. */ ++_dl_skip_args; --_dl_argc; @@ -738,7 +752,7 @@ dl_main (const ElfW(Phdr) *phdr, else if (! strcmp (INTUSE(_dl_argv)[1], "--inhibit-rpath") && _dl_argc > 2) { - GL(dl_inhibit_rpath) = INTUSE(_dl_argv)[2]; + GLRO(dl_inhibit_rpath) = INTUSE(_dl_argv)[2]; _dl_skip_args += 2; _dl_argc -= 2; @@ -1035,8 +1049,8 @@ of this helper program; chances are you did not intend to run this program.\n\ /* If LD_USE_LOAD_BIAS env variable has not been seen, default to not using bias for non-prelinked PIEs and libraries and using it for executables or prelinked PIEs or libraries. */ - if (GL(dl_use_load_bias) == (ElfW(Addr)) -2) - GL(dl_use_load_bias) = (GL(dl_loaded)->l_addr == 0) ? -1 : 0; + if (GLRO(dl_use_load_bias) == (ElfW(Addr)) -2) + GLRO(dl_use_load_bias) = (GL(dl_loaded)->l_addr == 0) ? -1 : 0; /* Set up the program header information for the dynamic linker itself. It is needed in the dl_iterate_phdr() callbacks. */ @@ -1212,7 +1226,7 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n", #ifdef NEED_DL_SYSINFO struct link_map *sysinfo_map = NULL; - if (GL(dl_sysinfo_dso) != NULL) + if (GLRO(dl_sysinfo_dso) != NULL) { /* Do an abridged version of the work _dl_map_object_from_fd would do to map in the object. It's already mapped and prelinked (and @@ -1224,9 +1238,9 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n", { static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT]; - l->l_phdr = ((const void *) GL(dl_sysinfo_dso) - + GL(dl_sysinfo_dso)->e_phoff); - l->l_phnum = GL(dl_sysinfo_dso)->e_phnum; + l->l_phdr = ((const void *) GLRO(dl_sysinfo_dso) + + GLRO(dl_sysinfo_dso)->e_phoff); + l->l_phnum = GLRO(dl_sysinfo_dso)->e_phnum; for (uint_fast16_t i = 0; i < l->l_phnum; ++i) { const ElfW(Phdr) *const ph = &l->l_phdr[i]; @@ -1243,7 +1257,7 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n", l->l_map_end = ph->p_vaddr + ph->p_memsz; } } - l->l_map_start = (ElfW(Addr)) GL(dl_sysinfo_dso); + l->l_map_start = (ElfW(Addr)) GLRO(dl_sysinfo_dso); l->l_addr = l->l_map_start - l->l_addr; l->l_map_end += l->l_addr; l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr); @@ -1269,8 +1283,8 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n", } /* We have a prelinked DSO preloaded by the system. */ - if (GL(dl_sysinfo) == DL_SYSINFO_DEFAULT) - GL(dl_sysinfo) = GL(dl_sysinfo_dso)->e_entry + l->l_addr; + if (GLRO(dl_sysinfo) == DL_SYSINFO_DEFAULT) + GLRO(dl_sysinfo) = GLRO(dl_sysinfo_dso)->e_entry + l->l_addr; sysinfo_map = l; } } @@ -1437,7 +1451,7 @@ cannot allocate TLS data structures for initial thread"); after relocation. */ struct link_map *l; - if (GL(dl_debug_mask) & DL_DEBUG_PRELINK) + if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) { struct r_scope_elem *scope = &GL(dl_loaded)->l_searchlist; @@ -1449,8 +1463,8 @@ cannot allocate TLS data structures for initial thread"); _dl_printf ("\t%s => not found\n", l->l_libname->name); continue; } - if (_dl_name_match_p (GL(dl_trace_prelink), l)) - GL(dl_trace_prelink_map) = l; + if (_dl_name_match_p (GLRO(dl_trace_prelink), l)) + GLRO(dl_trace_prelink_map) = l; _dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)", l->l_libname->name[0] ? l->l_libname->name : rtld_progname ?: "<main program>", @@ -1507,13 +1521,13 @@ cannot allocate TLS data structures for initial thread"); else { /* If LD_WARN is set warn about undefined symbols. */ - if (GL(dl_lazy) >= 0 && GL(dl_verbose)) + if (GLRO(dl_lazy) >= 0 && GLRO(dl_verbose)) { /* We have to do symbol dependency testing. */ struct relocate_args args; struct link_map *l; - args.lazy = GL(dl_lazy); + args.lazy = GLRO(dl_lazy); l = GL(dl_loaded); while (l->l_next) @@ -1529,7 +1543,7 @@ cannot allocate TLS data structures for initial thread"); l = l->l_prev; } while (l); - if ((GL(dl_debug_mask) & DL_DEBUG_PRELINK) + if ((GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) && GL(dl_rtld_map).l_opencount > 1) INTUSE(_dl_relocate_object) (&GL(dl_rtld_map), GL(dl_loaded)->l_scope, 0, 0); @@ -1612,7 +1626,7 @@ cannot allocate TLS data structures for initial thread"); } if (GL(dl_loaded)->l_info [ADDRIDX (DT_GNU_LIBLIST)] - && ! __builtin_expect (GL(dl_profile) != NULL, 0)) + && ! __builtin_expect (GLRO(dl_profile) != NULL, 0)) { ElfW(Lib) *liblist, *liblistend; struct link_map **r_list, **r_listend, *l; @@ -1660,7 +1674,7 @@ cannot allocate TLS data structures for initial thread"); if (r_list == r_listend && liblist == liblistend) prelinked = true; - if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0)) + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)) _dl_printf ("\nprelink checking: %s\n", prelinked ? "ok" : "failed"); } @@ -1740,7 +1754,7 @@ cannot allocate TLS data structures for initial thread"); know that because it is self-contained). */ struct link_map *l; - int consider_profiling = GL(dl_profile) != NULL; + int consider_profiling = GLRO(dl_profile) != NULL; #ifndef HP_TIMING_NONAVAIL hp_timing_t start; hp_timing_t stop; @@ -1748,7 +1762,7 @@ cannot allocate TLS data structures for initial thread"); #endif /* If we are profiling we also must do lazy reloaction. */ - GL(dl_lazy) |= consider_profiling; + GLRO(dl_lazy) |= consider_profiling; l = GL(dl_loaded); while (l->l_next) @@ -1769,7 +1783,7 @@ cannot allocate TLS data structures for initial thread"); } if (l != &GL(dl_rtld_map)) - INTUSE(_dl_relocate_object) (l, l->l_scope, GL(dl_lazy), + INTUSE(_dl_relocate_object) (l, l->l_scope, GLRO(dl_lazy), consider_profiling); l = l->l_prev; @@ -1792,7 +1806,8 @@ cannot allocate TLS data structures for initial thread"); needs to have _dl_profile_map set up by the relocator. */ if (__builtin_expect (GL(dl_profile_map) != NULL, 0)) /* We must prepare the profiling. */ - INTUSE(_dl_start_profile) (GL(dl_profile_map), GL(dl_profile_output)); + INTUSE(_dl_start_profile) (GL(dl_profile_map), + GLRO(dl_profile_output)); if (GL(dl_rtld_map).l_opencount > 1) { @@ -1928,7 +1943,7 @@ process_dl_debug (const char *dl_debug) if (debopts[cnt].len == len && memcmp (dl_debug, debopts[cnt].name, len) == 0) { - GL(dl_debug_mask) |= debopts[cnt].mask; + GLRO(dl_debug_mask) |= debopts[cnt].mask; any_debug = 1; break; } @@ -1949,7 +1964,7 @@ warning: debug option `%s' unknown; try LD_DEBUG=help\n", copy); ++dl_debug; } - if (GL(dl_debug_mask) & DL_DEBUG_HELP) + if (GLRO(dl_debug_mask) & DL_DEBUG_HELP) { size_t cnt; @@ -1983,7 +1998,7 @@ process_envvars (enum mode *modep) char *debug_output = NULL; /* This is the default place for profiling data file. */ - GL(dl_profile_output) + GLRO(dl_profile_output) = &"/var/tmp\0/var/profile"[INTUSE(__libc_enable_secure) ? 9 : 0]; while ((envline = _dl_next_ld_env_entry (&runp)) != NULL) @@ -2004,7 +2019,7 @@ process_envvars (enum mode *modep) case 4: /* Warning level, verbose or not. */ if (memcmp (envline, "WARN", 4) == 0) - GL(dl_verbose) = envline[5] != '\0'; + GLRO(dl_verbose) = envline[5] != '\0'; break; case 5: @@ -2030,18 +2045,18 @@ process_envvars (enum mode *modep) /* Which shared object shall be profiled. */ if (memcmp (envline, "PROFILE", 7) == 0 && envline[8] != '\0') - GL(dl_profile) = &envline[8]; + GLRO(dl_profile) = &envline[8]; break; case 8: /* Do we bind early? */ if (memcmp (envline, "BIND_NOW", 8) == 0) { - GL(dl_lazy) = envline[9] == '\0'; + GLRO(dl_lazy) = envline[9] == '\0'; break; } if (memcmp (envline, "BIND_NOT", 8) == 0) - GL(dl_bind_not) = envline[9] != '\0'; + GLRO(dl_bind_not) = envline[9] != '\0'; break; case 9: @@ -2054,14 +2069,15 @@ process_envvars (enum mode *modep) case 10: /* Mask for the important hardware capabilities. */ if (memcmp (envline, "HWCAP_MASK", 10) == 0) - GL(dl_hwcap_mask) = __strtoul_internal (&envline[11], NULL, 0, 0); + GLRO(dl_hwcap_mask) = __strtoul_internal (&envline[11], NULL, + 0, 0); break; case 11: /* Path where the binary is found. */ if (!INTUSE(__libc_enable_secure) && memcmp (envline, "ORIGIN_PATH", 11) == 0) - GL(dl_origin_path) = &envline[12]; + GLRO(dl_origin_path) = &envline[12]; break; case 12: @@ -2080,7 +2096,7 @@ process_envvars (enum mode *modep) } if (memcmp (envline, "DYNAMIC_WEAK", 12) == 0) - GL(dl_dynamic_weak) = 1; + GLRO(dl_dynamic_weak) = 1; break; case 13: @@ -2091,7 +2107,7 @@ process_envvars (enum mode *modep) #endif if (!INTUSE(__libc_enable_secure) && memcmp (envline, "USE_LOAD_BIAS", 13) == 0) - GL(dl_use_load_bias) = envline[14] == '1' ? -1 : 0; + GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0; break; case 14: @@ -2099,7 +2115,7 @@ process_envvars (enum mode *modep) if (!INTUSE(__libc_enable_secure) && memcmp (envline, "PROFILE_OUTPUT", 14) == 0 && envline[15] != '\0') - GL(dl_profile_output) = &envline[15]; + GLRO(dl_profile_output) = &envline[15]; break; case 16: @@ -2107,9 +2123,9 @@ process_envvars (enum mode *modep) if (memcmp (envline, "TRACE_PRELINKING", 16) == 0) { mode = trace; - GL(dl_verbose) = 1; - GL(dl_debug_mask) |= DL_DEBUG_PRELINK; - GL(dl_trace_prelink) = &envline[17]; + GLRO(dl_verbose) = 1; + GLRO(dl_debug_mask) |= DL_DEBUG_PRELINK; + GLRO(dl_trace_prelink) = &envline[17]; } break; |