aboutsummaryrefslogtreecommitdiff
path: root/elf/dl-load.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/dl-load.c')
-rw-r--r--elf/dl-load.c98
1 files changed, 41 insertions, 57 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c
index b66e7fee1d..cd568d2261 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -111,18 +111,6 @@ struct filebuf
char buf[1024];
};
-size_t _dl_pagesize;
-
-unsigned int _dl_osversion;
-
-int _dl_clktck;
-
-extern const char *_dl_platform;
-extern size_t _dl_platformlen;
-
-/* The object to be initialized first. */
-struct link_map *_dl_initfirst;
-
/* This is the decomposed LD_LIBRARY_PATH search path. */
static struct r_search_path_struct env_path_list;
@@ -240,7 +228,7 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result,
repl = l->l_origin;
else if ((len = is_dst (start, name + 1, "{PLATFORM}", 10, is_path,
0)) != 0)
- repl = _dl_platform;
+ repl = GL(dl_platform);
if (repl != NULL && repl != (const char *) -1)
{
@@ -344,12 +332,6 @@ add_name_to_object (struct link_map *l, const char *name)
lastp->next = newname;
}
-/* All known directories in sorted order. */
-struct r_search_path_elem *_dl_all_dirs;
-
-/* All directories after startup. */
-struct r_search_path_elem *_dl_init_all_dirs;
-
/* Standard search directories. */
static struct r_search_path_struct rtld_search_dirs;
@@ -413,7 +395,7 @@ fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep,
}
/* See if this directory is already known. */
- for (dirp = _dl_all_dirs; dirp != NULL; dirp = dirp->next)
+ for (dirp = GL(dl_all_dirs); dirp != NULL; dirp = dirp->next)
if (dirp->dirnamelen == len && memcmp (cp, dirp->dirname, len) == 0)
break;
@@ -460,13 +442,13 @@ fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep,
dirp->what = what;
if (__builtin_expect (where != NULL, 1))
dirp->where = memcpy ((char *) dirp + sizeof (*dirp) + len + 1
- + ncapstr * sizeof (enum r_dir_status),
+ + (ncapstr * sizeof (enum r_dir_status)),
where, where_len);
else
dirp->where = NULL;
- dirp->next = _dl_all_dirs;
- _dl_all_dirs = dirp;
+ dirp->next = GL(dl_all_dirs);
+ GL(dl_all_dirs) = dirp;
/* Put it in the result array. */
result[nelems++] = dirp;
@@ -496,13 +478,14 @@ decompose_rpath (struct r_search_path_struct *sps,
/* First see whether we must forget the RUNPATH and RPATH from this
object. */
- if (__builtin_expect (_dl_inhibit_rpath != NULL, 0) && !__libc_enable_secure)
+ if (__builtin_expect (GL(dl_inhibit_rpath) != NULL, 0)
+ && !__libc_enable_secure)
{
- const char *found = strstr (_dl_inhibit_rpath, where);
+ const char *found = strstr (GL(dl_inhibit_rpath), where);
if (found != NULL)
{
size_t len = strlen (where);
- if ((found == _dl_inhibit_rpath || found[-1] == ':')
+ if ((found == GL(dl_inhibit_rpath) || found[-1] == ':')
&& (found[len] == '\0' || found[len] == ':'))
{
/* This object is on the list of objects for which the
@@ -579,7 +562,7 @@ _dl_init_paths (const char *llp)
directories addressed by the LD_LIBRARY_PATH environment variable. */
/* Get the capabilities. */
- capstr = _dl_important_hwcaps (_dl_platform, _dl_platformlen,
+ capstr = _dl_important_hwcaps (GL(dl_platform), GL(dl_platformlen),
&ncapstr, &max_capstrlen);
/* First set up the rest of the default search directory entries. */
@@ -606,7 +589,7 @@ _dl_init_paths (const char *llp)
}
rtld_search_dirs.malloced = 0;
- pelem = _dl_all_dirs = rtld_search_dirs.dirs[0];
+ pelem = GL(dl_all_dirs) = rtld_search_dirs.dirs[0];
strp = system_dirs;
idx = 0;
@@ -639,7 +622,7 @@ _dl_init_paths (const char *llp)
#ifdef SHARED
/* This points to the map of the main object. */
- l = _dl_loaded;
+ l = GL(dl_loaded);
if (l != NULL)
{
assert (l->l_type != lt_loaded);
@@ -715,7 +698,7 @@ _dl_init_paths (const char *llp)
env_path_list.dirs = (void *) -1;
/* Remember the last search directory added at startup. */
- _dl_init_all_dirs = _dl_all_dirs;
+ GL(dl_init_all_dirs) = GL(dl_all_dirs);
}
@@ -746,11 +729,11 @@ lose (int code, int fd, const char *name, char *realname, struct link_map *l,
#ifndef SHARED
if (l->l_prev == NULL)
/* No other module loaded. */
- _dl_loaded = NULL;
+ GL(dl_loaded) = NULL;
else
#endif
l->l_prev->l_next = NULL;
- --_dl_nloaded;
+ --GL(dl_nloaded);
free (l);
}
free (realname);
@@ -791,7 +774,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
}
/* Look again to see if the real name matched another already loaded. */
- for (l = _dl_loaded; l; l = l->l_next)
+ for (l = GL(dl_loaded); l; l = l->l_next)
if (l->l_ino == st.st_ino && l->l_dev == st.st_dev)
{
/* The object is already loaded.
@@ -812,7 +795,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
return NULL;
/* Print debugging message. */
- if (__builtin_expect (_dl_debug_mask & DL_DEBUG_FILES, 0))
+ if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
_dl_debug_printf ("file=%s; generating link map\n", name);
/* This is the ELF header. We read it in `open_verify'. */
@@ -892,7 +875,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 ((ph->p_align & (_dl_pagesize - 1)) != 0)
+ if ((ph->p_align & (GL(dl_pagesize) - 1)) != 0)
{
errstring = N_("ELF load command alignment not page-aligned");
goto call_lose;
@@ -907,8 +890,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
{
struct loadcmd *c = &loadcmds[nloadcmds++];
c->mapstart = ph->p_vaddr & ~(ph->p_align - 1);
- c->mapend = ((ph->p_vaddr + ph->p_filesz + _dl_pagesize - 1)
- & ~(_dl_pagesize - 1));
+ c->mapend = ((ph->p_vaddr + ph->p_filesz + GL(dl_pagesize) - 1)
+ & ~(GL(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);
@@ -1023,7 +1006,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
zero = l->l_addr + c->dataend;
zeroend = l->l_addr + c->allocend;
- zeropage = (zero + _dl_pagesize - 1) & ~(_dl_pagesize - 1);
+ zeropage = ((zero + GL(dl_pagesize) - 1)
+ & ~(GL(dl_pagesize) - 1));
if (zeroend < zeropage)
/* All the extra data is in the last page of the segment.
@@ -1036,8 +1020,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
if ((c->prot & PROT_WRITE) == 0)
{
/* Dag nab it. */
- if (__mprotect ((caddr_t) (zero & ~(_dl_pagesize - 1)),
- _dl_pagesize, c->prot|PROT_WRITE) < 0)
+ if (__mprotect ((caddr_t) (zero & ~(GL(dl_pagesize) - 1)),
+ GL(dl_pagesize), c->prot|PROT_WRITE) < 0)
{
errstring = N_("cannot change memory protections");
goto call_lose_errno;
@@ -1045,8 +1029,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
}
memset ((void *) zero, '\0', zeropage - zero);
if ((c->prot & PROT_WRITE) == 0)
- __mprotect ((caddr_t) (zero & ~(_dl_pagesize - 1)),
- _dl_pagesize, c->prot);
+ __mprotect ((caddr_t) (zero & ~(GL(dl_pagesize) - 1)),
+ GL(dl_pagesize), c->prot);
}
if (zeroend > zeropage)
@@ -1110,7 +1094,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
l->l_entry += l->l_addr;
- if (__builtin_expect (_dl_debug_mask & DL_DEBUG_FILES, 0))
+ if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
_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",
(int) sizeof (void *) * 2, (unsigned long int) l->l_ld,
@@ -1176,7 +1160,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
/* Remember whether this object must be initialized first. */
if (l->l_flags_1 & DF_1_INITFIRST)
- _dl_initfirst = l;
+ GL(dl_initfirst) = l;
/* Finally the file information. */
l->l_dev = st.st_dev;
@@ -1397,7 +1381,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
- || (_dl_osversion && _dl_osversion < osversion))
+ || (GL(dl_osversion) && GL(dl_osversion) < osversion))
{
close_and_out:
__close (fd);
@@ -1442,7 +1426,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 (_dl_debug_mask & DL_DEBUG_LIBS, 0)
+ if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0)
&& current_what != this_dir->what)
{
current_what = this_dir->what;
@@ -1457,13 +1441,13 @@ open_path (const char *name, size_t namelen, int preloaded,
continue;
buflen =
- ((char *) __mempcpy (__mempcpy (edp,
- capstr[cnt].str, capstr[cnt].len),
+ ((char *) __mempcpy (__mempcpy (edp, capstr[cnt].str,
+ capstr[cnt].len),
name, namelen)
- buf);
/* Print name we try if this is wanted. */
- if (__builtin_expect (_dl_debug_mask & DL_DEBUG_LIBS, 0))
+ if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0))
_dl_debug_printf (" trying file=%s\n", buf);
fd = open_verify (buf, fbp);
@@ -1566,7 +1550,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
struct filebuf fb;
/* Look for this name among those already loaded. */
- for (l = _dl_loaded; l; l = l->l_next)
+ for (l = GL(dl_loaded); l; l = l->l_next)
{
/* If the requested name matches the soname of a loaded object,
use that object. Elide this check for names that have not
@@ -1596,7 +1580,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
}
/* Display information if we are debugging. */
- if (__builtin_expect (_dl_debug_mask & DL_DEBUG_FILES, 0) && loader != NULL)
+ if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0) && loader != NULL)
_dl_debug_printf ("\nfile=%s; needed by %s\n", name,
loader->l_name[0] ? loader->l_name : _dl_argv[0]);
@@ -1606,7 +1590,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
size_t namelen = strlen (name) + 1;
- if (__builtin_expect (_dl_debug_mask & DL_DEBUG_LIBS, 0))
+ if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0))
_dl_debug_printf ("find library=%s; searching\n", name);
fd = -1;
@@ -1644,7 +1628,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
/* If dynamically linked, try the DT_RPATH of the executable
itself. */
- l = _dl_loaded;
+ l = GL(dl_loaded);
if (fd == -1 && l && l->l_type != lt_loaded && l != loader
&& l->l_rpath_dirs.dirs != (void *) -1)
fd = open_path (name, namelen, preloaded, &l->l_rpath_dirs,
@@ -1698,7 +1682,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
if (cached != NULL)
{
#ifdef SHARED
- l = loader ?: _dl_loaded;
+ l = loader ?: GL(dl_loaded);
#else
l = loader;
#endif
@@ -1748,14 +1732,14 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
/* Finally, try the default path. */
if (fd == -1
- && ((l = loader ?: _dl_loaded) == NULL
+ && ((l = loader ?: GL(dl_loaded)) == NULL
|| __builtin_expect (!(l->l_flags_1 & DF_1_NODEFLIB), 1))
&& rtld_search_dirs.dirs != (void *) -1)
fd = open_path (name, namelen, preloaded, &rtld_search_dirs,
&realname, &fb);
/* Add another newline when we a tracing the library loading. */
- if (__builtin_expect (_dl_debug_mask & DL_DEBUG_LIBS, 0))
+ if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0))
_dl_debug_printf ("\n");
}
else
@@ -1777,7 +1761,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
if (__builtin_expect (fd, 0) == -1)
{
if (trace_mode
- && __builtin_expect (_dl_debug_mask & DL_DEBUG_PRELINK, 0) == 0)
+ && __builtin_expect (GL(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