about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-close.c4
-rw-r--r--elf/dl-conflict.c4
-rw-r--r--elf/dl-deps.c10
-rw-r--r--elf/dl-dst.h4
-rw-r--r--elf/dl-error.c4
-rw-r--r--elf/dl-fini.c4
-rw-r--r--elf/dl-init.c6
-rw-r--r--elf/dl-load.c49
-rw-r--r--elf/dl-lookup.c24
-rw-r--r--elf/dl-minimal.c8
-rw-r--r--elf/dl-open.c11
-rw-r--r--elf/dl-profile.c24
-rw-r--r--elf/dl-reloc.c15
-rw-r--r--elf/dl-runtime.c4
-rw-r--r--elf/dl-support.c6
-rw-r--r--elf/dl-version.c4
-rw-r--r--elf/do-lookup.h6
-rw-r--r--elf/rtld.c110
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,
 			&current_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,
 			&current_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,
 			&current_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,
 			&current_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;