source: trunk/libs/newlib/src/newlib/libc/sys/linux/dl/dl-load.c @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 51.1 KB
Line 
1/* Map in a shared object's segments from the file.
2   Copyright (C) 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc.
3   This file is part of the GNU C Library.
4
5   The GNU C Library is free software; you can redistribute it and/or
6   modify it under the terms of the GNU Lesser General Public
7   License as published by the Free Software Foundation; either
8   version 2.1 of the License, or (at your option) any later version.
9
10   The GNU C Library is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   Lesser General Public License for more details.
14
15   You should have received a copy of the GNU Lesser General Public
16   License along with the GNU C Library; if not, write to the Free
17   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18   02111-1307 USA.  */
19
20#include <elf.h>
21#include <errno.h>
22#include <fcntl.h>
23#include <libintl.h>
24#include <stdlib.h>
25#include <stdio.h>
26#include <string.h>
27#include <unistd.h>
28#include <ldsodefs.h>
29#include <sys/mman.h>
30#include <sys/param.h>
31#include <sys/stat.h>
32#include <sys/types.h>
33#include "dynamic-link.h"
34#include <abi-tag.h>
35#include <dl-osinfo.h>
36
37#include <dl-dst.h>
38
39/* On some systems, no flag bits are given to specify file mapping.  */
40#ifndef MAP_FILE
41# define MAP_FILE       0
42#endif
43
44/* The right way to map in the shared library files is MAP_COPY, which
45   makes a virtual copy of the data at the time of the mmap call; this
46   guarantees the mapped pages will be consistent even if the file is
47   overwritten.  Some losing VM systems like Linux's lack MAP_COPY.  All we
48   get is MAP_PRIVATE, which copies each page when it is modified; this
49   means if the file is overwritten, we may at some point get some pages
50   from the new version after starting with pages from the old version.  */
51#ifndef MAP_COPY
52# define MAP_COPY       MAP_PRIVATE
53#endif
54
55/* Some systems link their relocatable objects for another base address
56   than 0.  We want to know the base address for these such that we can
57   subtract this address from the segment addresses during mapping.
58   This results in a more efficient address space usage.  Defaults to
59   zero for almost all systems.  */
60#ifndef MAP_BASE_ADDR
61# define MAP_BASE_ADDR(l)       0
62#endif
63
64
65#include <endian.h>
66#if BYTE_ORDER == BIG_ENDIAN
67# define byteorder ELFDATA2MSB
68#elif BYTE_ORDER == LITTLE_ENDIAN
69# define byteorder ELFDATA2LSB
70#else
71# error "Unknown BYTE_ORDER " BYTE_ORDER
72# define byteorder ELFDATANONE
73#endif
74
75#define STRING(x) __STRING (x)
76
77#ifdef MAP_ANON
78/* The fd is not examined when using MAP_ANON.  */
79# define ANONFD -1
80#else
81int _dl_zerofd = -1;
82# define ANONFD _dl_zerofd
83#endif
84
85/* Handle situations where we have a preferred location in memory for
86   the shared objects.  */
87#ifdef ELF_PREFERRED_ADDRESS_DATA
88ELF_PREFERRED_ADDRESS_DATA;
89#endif
90#ifndef ELF_PREFERRED_ADDRESS
91# define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) (mapstartpref)
92#endif
93#ifndef ELF_FIXED_ADDRESS
94# define ELF_FIXED_ADDRESS(loader, mapstart) ((void) 0)
95#endif
96
97/* Type for the buffer we put the ELF header and hopefully the program
98   header.  This buffer does not really have to be too large.  In most
99   cases the program header follows the ELF header directly.  If this
100   is not the case all bets are off and we can make the header arbitrarily
101   large and still won't get it read.  This means the only question is
102   how large are the ELF and program header combined.  The ELF header
103   in 64-bit files is 56 bytes long.  Each program header entry is again
104   56 bytes long.  I.e., even with a file which has 17 program header
105   entries we only have to read 1kB.  And 17 program header entries is
106   plenty, normal files have < 10.  If this heuristic should really fail
107   for some file the code in `_dl_map_object_from_fd' knows how to
108   recover.  */
109struct filebuf
110{
111  ssize_t len;
112  char buf[1024];
113};
114
115size_t _dl_pagesize;
116
117unsigned int _dl_osversion;
118
119int _dl_clktck;
120
121extern const char *_dl_platform;
122extern size_t _dl_platformlen;
123
124/* The object to be initialized first.  */
125struct link_map *_dl_initfirst;
126
127/* This is the decomposed LD_LIBRARY_PATH search path.  */
128static struct r_search_path_struct env_path_list;
129
130/* List of the hardware capabilities we might end up using.  */
131static const struct r_strlenpair *capstr;
132static size_t ncapstr;
133static size_t max_capstrlen;
134
135
136/* Get the generated information about the trusted directories.  */
137#include "trusted-dirs.h"
138
139static const char system_dirs[] = SYSTEM_DIRS;
140static const size_t system_dirs_len[] =
141{
142  SYSTEM_DIRS_LEN
143};
144#define nsystem_dirs_len \
145  (sizeof (system_dirs_len) / sizeof (system_dirs_len[0]))
146
147
148/* Local version of `strdup' function.  */
149static inline char *
150local_strdup (const char *s)
151{
152  size_t len = strlen (s) + 1;
153  void *new = malloc (len);
154
155  if (new == NULL)
156    return NULL;
157
158  return (char *) memcpy (new, s, len);
159}
160
161
162static size_t
163is_dst (const char *start, const char *name, const char *str, size_t cmplen,
164        int is_path, int secure)
165{
166  size_t len;
167
168  if (strncmp (name, str, cmplen) == 0)
169    len = cmplen + 1;
170  else if (strncmp (name, str + 1, cmplen - 2) == 0
171           && (name[cmplen - 2] == '\0' || name[cmplen - 2] == '/'
172               || (is_path && name[cmplen - 2] == ':')))
173    len = cmplen - 1;
174  else
175    return 0;
176
177  if (__builtin_expect (secure, 0)
178      && ((name[len - 1] != '\0' && (!is_path || name[len - 1] != ':'))
179          || (name != start + 1 && (!is_path || name[-2] != ':'))))
180    return 0;
181
182  return len;
183}
184
185
186size_t
187_dl_dst_count (const char *name, int is_path)
188{
189  const char *const start = name;
190  size_t cnt = 0;
191
192  do
193    {
194      size_t len = 1;
195
196      /* $ORIGIN is not expanded for SUID/GUID programs (except if it
197         is $ORIGIN alone) and it must always appear first in path.
198
199         Note that it is no bug that the string in the second and
200         fourth `strncmp' call is longer than the sequence which is
201         actually tested.  */
202      if ((len = is_dst (start, name + 1, "{ORIGIN}", 8, is_path,
203                         0)) != 0
204          || ((len = is_dst (start, name + 1, "{PLATFORM}", 10, is_path, 0))
205              != 0))
206        ++cnt;
207
208      name = strchr (name + len, '$');
209    }
210  while (name != NULL);
211
212  return cnt;
213}
214
215
216char *
217_dl_dst_substitute (struct link_map *l, const char *name, char *result,
218                    int is_path)
219{
220  const char *const start = name;
221  char *last_elem, *wp;
222
223  /* Now fill the result path.  While copying over the string we keep
224     track of the start of the last path element.  When we come accross
225     a DST we copy over the value or (if the value is not available)
226     leave the entire path element out.  */
227  last_elem = wp = result;
228
229  do
230    {
231      if (__builtin_expect (*name == '$', 0))
232        {
233          const char *repl = NULL;
234          size_t len = 1;
235
236          /* Note that it is no bug that the string in the second and
237             fourth `strncmp' call is longer than the sequence which
238             is actually tested.  */
239          if ((len = is_dst (start, name + 1, "{ORIGIN}", 8, is_path,
240                             0)) != 0)
241            repl = l->l_origin;
242          else if ((len = is_dst (start, name + 1, "{PLATFORM}", 10, is_path,
243                                  0)) != 0)
244            repl = _dl_platform;
245
246          if (repl != NULL && repl != (const char *) -1)
247            {
248              wp = strcpy (wp, repl);
249              wp += strlen (repl);
250              name += len;
251            }
252          else if (len > 1)
253            {
254              /* We cannot use this path element, the value of the
255                 replacement is unknown.  */
256              wp = last_elem;
257              name += len;
258              while (*name != '\0' && (!is_path || *name != ':'))
259                ++name;
260            }
261          else
262            /* No DST we recognize.  */
263            *wp++ = *name++;
264        }
265      else
266        {
267          *wp++ = *name++;
268          if (is_path && *name == ':')
269            last_elem = wp;
270        }
271    }
272  while (*name != '\0');
273
274  *wp = '\0';
275
276  return result;
277}
278
279
280/* Return copy of argument with all recognized dynamic string tokens
281   ($ORIGIN and $PLATFORM for now) replaced.  On some platforms it
282   might not be possible to determine the path from which the object
283   belonging to the map is loaded.  In this case the path element
284   containing $ORIGIN is left out.  */
285static char *
286expand_dynamic_string_token (struct link_map *l, const char *s)
287{
288  /* We make two runs over the string.  First we determine how large the
289     resulting string is and then we copy it over.  Since this is now
290     frequently executed operation we are looking here not for performance
291     but rather for code size.  */
292  size_t cnt;
293  size_t total;
294  char *result;
295
296  /* Determine the number of DST elements.  */
297  cnt = DL_DST_COUNT (s, 1);
298
299  /* If we do not have to replace anything simply copy the string.  */
300  if (__builtin_expect (cnt, 0) == 0)
301    return local_strdup (s);
302
303  /* Determine the length of the substituted string.  */
304  total = DL_DST_REQUIRED (l, s, strlen (s), cnt);
305
306  /* Allocate the necessary memory.  */
307  result = (char *) malloc (total + 1);
308  if (result == NULL)
309    return NULL;
310
311  return DL_DST_SUBSTITUTE (l, s, result, 1);
312}
313
314
315/* Add `name' to the list of names for a particular shared object.
316   `name' is expected to have been allocated with malloc and will
317   be freed if the shared object already has this name.
318   Returns false if the object already had this name.  */
319static void
320internal_function
321add_name_to_object (struct link_map *l, const char *name)
322{
323  struct libname_list *lnp, *lastp;
324  struct libname_list *newname;
325  size_t name_len;
326
327  lastp = NULL;
328  for (lnp = l->l_libname; lnp != NULL; lastp = lnp, lnp = lnp->next)
329    if (strcmp (name, lnp->name) == 0)
330      return;
331
332  name_len = strlen (name) + 1;
333  newname = (struct libname_list *) malloc (sizeof *newname + name_len);
334  if (newname == NULL)
335    {
336      /* No more memory.  */
337      _dl_signal_error (ENOMEM, name, NULL, N_("cannot allocate name record"));
338      return;
339    }
340  /* The object should have a libname set from _dl_new_object.  */
341  assert (lastp != NULL);
342
343  newname->name = memcpy (newname + 1, name, name_len);
344  newname->next = NULL;
345  newname->dont_free = 0;
346  lastp->next = newname;
347}
348
349/* All known directories in sorted order.  */
350struct r_search_path_elem *_dl_all_dirs;
351
352/* All directories after startup.  */
353struct r_search_path_elem *_dl_init_all_dirs;
354
355/* Standard search directories.  */
356static struct r_search_path_struct rtld_search_dirs;
357
358static size_t max_dirnamelen;
359
360static inline struct r_search_path_elem **
361fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep,
362              int check_trusted, const char *what, const char *where)
363{
364  char *cp;
365  size_t nelems = 0;
366
367  printf("In fillin_rpath\n");
368  while ((cp = strsep (&rpath, sep)) != NULL)
369    {
370      struct r_search_path_elem *dirp;
371      size_t len = strlen (cp);
372
373      /* `strsep' can pass an empty string.  This has to be
374         interpreted as `use the current directory'. */
375      if (len == 0)
376        {
377          static const char curwd[] = "./";
378          cp = (char *) curwd;
379        }
380
381      /* Remove trailing slashes (except for "/").  */
382      while (len > 1 && cp[len - 1] == '/')
383        --len;
384
385      /* Now add one if there is none so far.  */
386      if (len > 0 && cp[len - 1] != '/')
387        cp[len++] = '/';
388
389      /* Make sure we don't use untrusted directories if we run SUID.  */
390      if (__builtin_expect (check_trusted, 0))
391        {
392          const char *trun = system_dirs;
393          size_t idx;
394          int unsecure = 1;
395
396          /* All trusted directories must be complete names.  */
397          if (cp[0] == '/')
398            {
399              for (idx = 0; idx < nsystem_dirs_len; ++idx)
400                {
401                  if (len == system_dirs_len[idx]
402                      && memcmp (trun, cp, len) == 0)
403                    {
404                      /* Found it.  */
405                      unsecure = 0;
406                      break;
407                    }
408
409                  trun += system_dirs_len[idx] + 1;
410                }
411            }
412
413          if (unsecure)
414            /* Simply drop this directory.  */
415            continue;
416        }
417
418      /* See if this directory is already known.  */
419      for (dirp = _dl_all_dirs; dirp != NULL; dirp = dirp->next)
420        if (dirp->dirnamelen == len && memcmp (cp, dirp->dirname, len) == 0)
421          break;
422
423      if (dirp != NULL)
424        {
425          /* It is available, see whether it's on our own list.  */
426          size_t cnt;
427          for (cnt = 0; cnt < nelems; ++cnt)
428            if (result[cnt] == dirp)
429              break;
430
431          if (cnt == nelems)
432            result[nelems++] = dirp;
433        }
434      else
435        {
436          size_t cnt;
437          enum r_dir_status init_val;
438          size_t where_len = where ? strlen (where) + 1 : 0;
439
440          /* It's a new directory.  Create an entry and add it.  */
441          dirp = (struct r_search_path_elem *)
442            malloc (sizeof (*dirp) + ncapstr * sizeof (enum r_dir_status)
443                    + where_len + len + 1);
444          if (dirp == NULL)
445            _dl_signal_error (ENOMEM, NULL, NULL,
446                              N_("cannot create cache for search path"));
447
448          dirp->dirname = ((char *) dirp + sizeof (*dirp)
449                           + ncapstr * sizeof (enum r_dir_status));
450          *((char *) (memcpy ((char *) dirp->dirname, cp, len) + len)) = '\0';
451          dirp->dirnamelen = len;
452
453          if (len > max_dirnamelen)
454            max_dirnamelen = len;
455
456          /* We have to make sure all the relative directories are
457             never ignored.  The current directory might change and
458             all our saved information would be void.  */
459          init_val = cp[0] != '/' ? existing : unknown;
460          for (cnt = 0; cnt < ncapstr; ++cnt)
461            dirp->status[cnt] = init_val;
462
463          dirp->what = what;
464          if (__builtin_expect (where != NULL, 1))
465            dirp->where = memcpy ((char *) dirp + sizeof (*dirp) + len + 1
466                                  + ncapstr * sizeof (enum r_dir_status),
467                                  where, where_len);
468          else
469            dirp->where = NULL;
470
471          dirp->next = _dl_all_dirs;
472          _dl_all_dirs = dirp;
473
474          /* Put it in the result array.  */
475          result[nelems++] = dirp;
476        }
477    }
478
479  /* Terminate the array.  */
480  result[nelems] = NULL;
481
482  return result;
483}
484
485
486static void
487internal_function
488decompose_rpath (struct r_search_path_struct *sps,
489                 const char *rpath, struct link_map *l, const char *what)
490{
491  /* Make a copy we can work with.  */
492  const char *where = l->l_name;
493  char *copy;
494  char *cp;
495  struct r_search_path_elem **result;
496  size_t nelems;
497  /* Initialize to please the compiler.  */
498  const char *errstring = NULL;
499
500  /* First see whether we must forget the RUNPATH and RPATH from this
501     object.  */
502  if (__builtin_expect (_dl_inhibit_rpath != NULL, 0)) 
503    {
504      const char *found = strstr (_dl_inhibit_rpath, where);
505      if (found != NULL)
506        {
507          size_t len = strlen (where);
508          if ((found == _dl_inhibit_rpath || found[-1] == ':')
509              && (found[len] == '\0' || found[len] == ':'))
510            {
511              /* This object is on the list of objects for which the
512                 RUNPATH and RPATH must not be used.  */
513              result = (struct r_search_path_elem **)
514                malloc (sizeof (*result));
515              if (result == NULL)
516                {
517                signal_error_cache:
518                  errstring = N_("cannot create cache for search path");
519                signal_error:
520                  _dl_signal_error (ENOMEM, NULL, NULL, errstring);
521                }
522
523              result[0] = NULL;
524
525              sps->dirs = result;
526              sps->malloced = 1;
527
528              return;
529            }
530        }
531    }
532
533  /* Make a writable copy.  At the same time expand possible dynamic
534     string tokens.  */
535  copy = expand_dynamic_string_token (l, rpath);
536  if (copy == NULL)
537    {
538      errstring = N_("cannot create RUNPATH/RPATH copy");
539      goto signal_error;
540    }
541
542  /* Count the number of necessary elements in the result array.  */
543  nelems = 0;
544  for (cp = copy; *cp != '\0'; ++cp)
545    if (*cp == ':')
546      ++nelems;
547
548  /* Allocate room for the result.  NELEMS + 1 is an upper limit for the
549     number of necessary entries.  */
550  result = (struct r_search_path_elem **) malloc ((nelems + 1 + 1)
551                                                  * sizeof (*result));
552  if (result == NULL)
553    goto signal_error_cache;
554
555  fillin_rpath (copy, result, ":", 0, what, where);
556
557  /* Free the copied RPATH string.  `fillin_rpath' make own copies if
558     necessary.  */
559  free (copy);
560
561  sps->dirs = result;
562  /* The caller will change this value if we haven't used a real malloc.  */
563  sps->malloced = 1;
564}
565
566
567void
568internal_function
569_dl_init_paths (const char *llp)
570{
571  size_t idx;
572  const char *strp;
573  struct r_search_path_elem *pelem, **aelem;
574  size_t round_size;
575#ifdef SHARED
576  struct link_map *l;
577#endif
578  /* Initialize to please the compiler.  */
579  const char *errstring = NULL;
580
581  /* Fill in the information about the application's RPATH and the
582     directories addressed by the LD_LIBRARY_PATH environment variable.  */
583
584  /* Get the capabilities.  */
585  capstr = _dl_important_hwcaps (_dl_platform, _dl_platformlen,
586                                 &ncapstr, &max_capstrlen);
587
588  /* First set up the rest of the default search directory entries.  */
589  aelem = rtld_search_dirs.dirs = (struct r_search_path_elem **)
590    malloc ((nsystem_dirs_len + 1) * sizeof (struct r_search_path_elem *));
591  if (rtld_search_dirs.dirs == NULL)
592    {
593      errstring = N_("cannot create search path array");
594    signal_error:
595      _dl_signal_error (ENOMEM, NULL, NULL, errstring);
596    }
597
598  round_size = ((2 * sizeof (struct r_search_path_elem) - 1
599                 + ncapstr * sizeof (enum r_dir_status))
600                / sizeof (struct r_search_path_elem));
601
602  rtld_search_dirs.dirs[0] = (struct r_search_path_elem *)
603    malloc ((sizeof (system_dirs) / sizeof (system_dirs[0]))
604            * round_size * sizeof (struct r_search_path_elem));
605  if (rtld_search_dirs.dirs[0] == NULL)
606    {
607      errstring = N_("cannot create cache for search path");
608      goto signal_error;
609    }
610
611  rtld_search_dirs.malloced = 0;
612  pelem = _dl_all_dirs = rtld_search_dirs.dirs[0];
613  strp = system_dirs;
614  idx = 0;
615
616  do
617    {
618      size_t cnt;
619
620      *aelem++ = pelem;
621
622      pelem->what = "system search path";
623      pelem->where = NULL;
624
625      pelem->dirname = strp;
626      pelem->dirnamelen = system_dirs_len[idx];
627      strp += system_dirs_len[idx] + 1;
628
629      /* System paths must be absolute.  */
630      assert (pelem->dirname[0] == '/');
631      for (cnt = 0; cnt < ncapstr; ++cnt)
632        pelem->status[cnt] = unknown;
633
634      pelem->next = (++idx == nsystem_dirs_len ? NULL : (pelem + round_size));
635
636      pelem += round_size;
637    }
638  while (idx < nsystem_dirs_len);
639
640  max_dirnamelen = SYSTEM_DIRS_MAX_LEN;
641  *aelem = NULL;
642
643#ifdef SHARED
644  /* This points to the map of the main object.  */
645  l = _dl_loaded;
646  if (l != NULL)
647    {
648      assert (l->l_type != lt_loaded);
649
650      if (l->l_info[DT_RUNPATH])
651        {
652          /* Allocate room for the search path and fill in information
653             from RUNPATH.  */
654          decompose_rpath (&l->l_runpath_dirs,
655                           (const void *) (D_PTR (l, l_info[DT_STRTAB])
656                                           + l->l_info[DT_RUNPATH]->d_un.d_val),
657                           l, "RUNPATH");
658
659          /* The RPATH is ignored.  */
660          l->l_rpath_dirs.dirs = (void *) -1;
661        }
662      else
663        {
664          l->l_runpath_dirs.dirs = (void *) -1;
665
666          if (l->l_info[DT_RPATH])
667            {
668              /* Allocate room for the search path and fill in information
669                 from RPATH.  */
670              decompose_rpath (&l->l_rpath_dirs,
671                               (const void *) (D_PTR (l, l_info[DT_STRTAB])
672                                               + l->l_info[DT_RPATH]->d_un.d_val),
673                               l, "RPATH");
674              l->l_rpath_dirs.malloced = 0;
675            }
676          else
677            l->l_rpath_dirs.dirs = (void *) -1;
678        }
679    }
680#endif  /* SHARED */
681
682  if (llp != NULL && *llp != '\0')
683    {
684      size_t nllp;
685      const char *cp = llp;
686      const char *old = llp;
687      size_t len = strlen (old) + 1;
688      char *new = alloca(len);
689      char *llp_tmp;
690
691      llp_tmp = memcpy (new, old, len);
692
693      /* Decompose the LD_LIBRARY_PATH contents.  First determine how many
694         elements it has.  */
695      nllp = 1;
696      while (*cp)
697        {
698          if (*cp == ':' || *cp == ';')
699            ++nllp;
700          ++cp;
701        }
702
703      env_path_list.dirs = (struct r_search_path_elem **)
704        malloc ((nllp + 1) * sizeof (struct r_search_path_elem *));
705      if (env_path_list.dirs == NULL)
706        {
707          errstring = N_("cannot create cache for search path");
708          goto signal_error;
709        }
710
711      (void) fillin_rpath (llp_tmp, env_path_list.dirs, ":;",
712                           0, "LD_LIBRARY_PATH", NULL);
713
714      if (env_path_list.dirs[0] == NULL)
715        {
716          free (env_path_list.dirs);
717          env_path_list.dirs = (void *) -1;
718        }
719
720      env_path_list.malloced = 0;
721    }
722  else
723    env_path_list.dirs = (void *) -1;
724
725  /* Remember the last search directory added at startup.  */
726  _dl_init_all_dirs = _dl_all_dirs;
727}
728
729
730/* Think twice before changing anything in this function.  It is placed
731   here and prepared using the `alloca' magic to prevent it from being
732   inlined.  The function is only called in case of an error.  But then
733   performance does not count.  The function used to be "inlinable" and
734   the compiled did so all the time.  This increased the code size for
735   absolutely no good reason.  */
736static void
737__attribute__ ((noreturn))
738lose (int code, int fd, const char *name, char *realname, struct link_map *l,
739      const char *msg)
740{
741  /* The use of `alloca' here looks ridiculous but it helps.  The goal
742     is to avoid the function from being inlined.  There is no official
743     way to do this so we use this trick.  gcc never inlines functions
744     which use `alloca'.  */
745  int *a = (int *) alloca (sizeof (int));
746  a[0] = fd;
747  /* The file might already be closed.  */
748  if (a[0] != -1)
749    (void) close (a[0]);
750  if (l != NULL)
751    {
752      /* Remove the stillborn object from the list and free it.  */
753      assert (l->l_next == NULL);
754#ifndef SHARED
755      if (l->l_prev == NULL)
756        /* No other module loaded.  */
757        _dl_loaded = NULL;
758      else
759#endif
760        l->l_prev->l_next = NULL;
761      --_dl_nloaded;
762      free (l);
763    }
764  free (realname);
765  _dl_signal_error (code, name, NULL, msg);
766}
767
768
769/* Map in the shared object NAME, actually located in REALNAME, and already
770   opened on FD.  */
771
772#ifndef EXTERNAL_MAP_FROM_FD
773static
774#endif
775struct link_map *
776_dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
777                        char *realname, struct link_map *loader, int l_type,
778                        int mode)
779{
780  struct link_map *l = NULL;
781  const ElfW(Ehdr) *header;
782  const ElfW(Phdr) *phdr;
783  const ElfW(Phdr) *ph;
784  size_t maplength;
785  int type;
786  struct stat64 st;
787  /* Initialize to keep the compiler happy.  */
788  const char *errstring = NULL;
789  int errval = 0;
790
791  /* Get file information.  */
792  if (__builtin_expect (fstat64 (fd, &st) < 0, 0))
793    {
794      errstring = N_("cannot stat shared object");
795    call_lose_errno:
796      errval = errno;
797    call_lose:
798      fprintf (stderr, "%s\n", errstring);
799      lose (errval, fd, name, realname, l, errstring);
800    }
801
802  /* Look again to see if the real name matched another already loaded.  */
803  for (l = _dl_loaded; l; l = l->l_next)
804    if (l->l_ino == st.st_ino && l->l_dev == st.st_dev)
805      {
806        /* The object is already loaded.
807           Just bump its reference count and return it.  */
808        close (fd);
809
810        /* If the name is not in the list of names for this object add
811           it.  */
812        free (realname);
813        add_name_to_object (l, name);
814
815        return l;
816      }
817
818  if (mode & RTLD_NOLOAD)
819    /* We are not supposed to load the object unless it is already
820       loaded.  So return now.  */
821    return NULL;
822
823  /* Print debugging message.  */
824  if (__builtin_expect (_dl_debug_mask & DL_DEBUG_FILES, 0))
825    _dl_debug_printf ("file=%s;  generating link map\n", name);
826
827  /* This is the ELF header.  We read it in `open_verify'.  */
828  header = (void *) fbp->buf;
829
830#ifndef MAP_ANON
831# define MAP_ANON 0
832  if (_dl_zerofd == -1)
833    {
834      _dl_zerofd = _dl_sysdep_open_zero_fill ();
835      if (_dl_zerofd == -1)
836        {
837          close (fd);
838          _dl_signal_error (errno, NULL, NULL,
839                            N_("cannot open zero fill device"));
840        }
841    }
842#endif
843
844  /* Enter the new object in the list of loaded objects.  */
845  l = _dl_new_object (realname, name, l_type, loader);
846  if (__builtin_expect (! l, 0))
847    {
848      errstring = N_("cannot create shared object descriptor");
849      goto call_lose_errno;
850    }
851
852  /* Extract the remaining details we need from the ELF header
853     and then read in the program header table.  */
854  l->l_entry = header->e_entry;
855  type = header->e_type;
856  l->l_phnum = header->e_phnum;
857
858  maplength = header->e_phnum * sizeof (ElfW(Phdr));
859  if (header->e_phoff + maplength <= fbp->len)
860    phdr = (void *) (fbp->buf + header->e_phoff);
861  else
862    {
863      phdr = alloca (maplength);
864      lseek (fd, SEEK_SET, header->e_phoff);
865      if (__libc_read (fd, (void *) phdr, maplength) != maplength)
866        {
867          errstring = N_("cannot read file data");
868          goto call_lose_errno;
869        }
870    }
871
872  {
873    /* Scan the program header table, collecting its load commands.  */
874    struct loadcmd
875      {
876        ElfW(Addr) mapstart, mapend, dataend, allocend;
877        off_t mapoff;
878        int prot;
879      } loadcmds[l->l_phnum], *c;
880    size_t nloadcmds = 0;
881
882    /* The struct is initialized to zero so this is not necessary:
883    l->l_ld = 0;
884    l->l_phdr = 0;
885    l->l_addr = 0; */
886    for (ph = phdr; ph < &phdr[l->l_phnum]; ++ph)
887      switch (ph->p_type)
888        {
889          /* These entries tell us where to find things once the file's
890             segments are mapped in.  We record the addresses it says
891             verbatim, and later correct for the run-time load address.  */
892        case PT_DYNAMIC:
893          l->l_ld = (void *) ph->p_vaddr;
894          l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn));
895          break;
896
897        case PT_PHDR:
898          l->l_phdr = (void *) ph->p_vaddr;
899          break;
900
901        case PT_LOAD:
902          /* A load command tells us to map in part of the file.
903             We record the load commands and process them all later.  */
904          if ((ph->p_align & (_dl_pagesize - 1)) != 0)
905            {
906              errstring = N_("ELF load command alignment not page-aligned");
907              goto call_lose;
908            }
909          if (((ph->p_vaddr - ph->p_offset) & (ph->p_align - 1)) != 0)
910            {
911              errstring
912                = N_("ELF load command address/offset not properly aligned");
913              goto call_lose;
914            }
915
916          {
917            struct loadcmd *c = &loadcmds[nloadcmds++];
918            c->mapstart = ph->p_vaddr & ~(ph->p_align - 1);
919            c->mapend = ((ph->p_vaddr + ph->p_filesz + _dl_pagesize - 1)
920                         & ~(_dl_pagesize - 1));
921            c->dataend = ph->p_vaddr + ph->p_filesz;
922            c->allocend = ph->p_vaddr + ph->p_memsz;
923            c->mapoff = ph->p_offset & ~(ph->p_align - 1);
924
925            /* Optimize a common case.  */
926#if (PF_R | PF_W | PF_X) == 7 && (PROT_READ | PROT_WRITE | PROT_EXEC) == 7
927            c->prot = (PF_TO_PROT
928                       >> ((ph->p_flags & (PF_R | PF_W | PF_X)) * 4)) & 0xf;
929#else
930            c->prot = 0;
931            if (ph->p_flags & PF_R)
932              c->prot |= PROT_READ;
933            if (ph->p_flags & PF_W)
934              c->prot |= PROT_WRITE;
935            if (ph->p_flags & PF_X)
936              c->prot |= PROT_EXEC;
937#endif
938          }
939          break;
940        }
941
942    /* Now process the load commands and map segments into memory.  */
943    c = loadcmds;
944
945    /* Length of the sections to be loaded.  */
946    maplength = loadcmds[nloadcmds - 1].allocend - c->mapstart;
947
948    if (__builtin_expect (type, ET_DYN) == ET_DYN)
949      {
950        /* This is a position-independent shared object.  We can let the
951           kernel map it anywhere it likes, but we must have space for all
952           the segments in their specified positions relative to the first.
953           So we map the first segment without MAP_FIXED, but with its
954           extent increased to cover all the segments.  Then we remove
955           access from excess portion, and there is known sufficient space
956           there to remap from the later segments.
957
958           As a refinement, sometimes we have an address that we would
959           prefer to map such objects at; but this is only a preference,
960           the OS can do whatever it likes. */
961        ElfW(Addr) mappref;
962        mappref = (ELF_PREFERRED_ADDRESS (loader, maplength, c->mapstart)
963                   - MAP_BASE_ADDR (l));
964
965        /* Remember which part of the address space this object uses.  */
966        l->l_map_start = (ElfW(Addr)) mmap ((void *) mappref, maplength,
967                                              c->prot, MAP_COPY | MAP_FILE,
968                                              fd, c->mapoff);
969        if ((void *) l->l_map_start == MAP_FAILED)
970          {
971          map_error:
972            errstring = N_("failed to map segment from shared object");
973            goto call_lose_errno;
974          }
975
976        l->l_map_end = l->l_map_start + maplength;
977        l->l_addr = l->l_map_start - c->mapstart;
978
979        /* Change protection on the excess portion to disallow all access;
980           the portions we do not remap later will be inaccessible as if
981           unallocated.  Then jump into the normal segment-mapping loop to
982           handle the portion of the segment past the end of the file
983           mapping.  */
984        mprotect ((caddr_t) (l->l_addr + c->mapend),
985                    loadcmds[nloadcmds - 1].allocend - c->mapend,
986                    PROT_NONE);
987
988        goto postmap;
989      }
990    else
991      {
992        /* This object is loaded at a fixed address.  This must never
993           happen for objects loaded with dlopen().  */
994        if (__builtin_expect (mode & __RTLD_DLOPEN, 0))
995          {
996            errstring = N_("cannot dynamically load executable");
997            goto call_lose;
998          }
999
1000        /* Notify ELF_PREFERRED_ADDRESS that we have to load this one
1001           fixed.  */
1002        ELF_FIXED_ADDRESS (loader, c->mapstart);
1003      }
1004
1005    /* Remember which part of the address space this object uses.  */
1006    l->l_map_start = c->mapstart + l->l_addr;
1007    l->l_map_end = l->l_map_start + maplength;
1008
1009    while (c < &loadcmds[nloadcmds])
1010      {
1011        if (c->mapend > c->mapstart
1012            /* Map the segment contents from the file.  */
1013            && (mmap ((void *) (l->l_addr + c->mapstart),
1014                        c->mapend - c->mapstart, c->prot,
1015                        MAP_FIXED | MAP_COPY | MAP_FILE, fd, c->mapoff)
1016                == MAP_FAILED))
1017          goto map_error;
1018
1019      postmap:
1020        if (l->l_phdr == 0
1021            && c->mapoff <= header->e_phoff
1022            && (c->mapend - c->mapstart + c->mapoff
1023                >= header->e_phoff + header->e_phnum * sizeof (ElfW(Phdr))))
1024          /* Found the program header in this segment.  */
1025          l->l_phdr = (void *) (c->mapstart + header->e_phoff - c->mapoff);
1026
1027        if (c->allocend > c->dataend)
1028          {
1029            /* Extra zero pages should appear at the end of this segment,
1030               after the data mapped from the file.   */
1031            ElfW(Addr) zero, zeroend, zeropage;
1032
1033            zero = l->l_addr + c->dataend;
1034            zeroend = l->l_addr + c->allocend;
1035            zeropage = (zero + _dl_pagesize - 1) & ~(_dl_pagesize - 1);
1036
1037            if (zeroend < zeropage)
1038              /* All the extra data is in the last page of the segment.
1039                 We can just zero it.  */
1040              zeropage = zeroend;
1041
1042            if (zeropage > zero)
1043              {
1044                /* Zero the final part of the last page of the segment.  */
1045                if ((c->prot & PROT_WRITE) == 0)
1046                  {
1047                    /* Dag nab it.  */
1048                    if (mprotect ((caddr_t) (zero & ~(_dl_pagesize - 1)),
1049                                    _dl_pagesize, c->prot|PROT_WRITE) < 0)
1050                      {
1051                        errstring = N_("cannot change memory protections");
1052                        goto call_lose_errno;
1053                      }
1054                  }
1055                memset ((void *) zero, '\0', zeropage - zero);
1056                if ((c->prot & PROT_WRITE) == 0)
1057                  mprotect ((caddr_t) (zero & ~(_dl_pagesize - 1)),
1058                              _dl_pagesize, c->prot);
1059              }
1060
1061            if (zeroend > zeropage)
1062              {
1063                /* Map the remaining zero pages in from the zero fill FD.  */
1064                caddr_t mapat;
1065                mapat = mmap ((caddr_t) zeropage, zeroend - zeropage,
1066                                c->prot, MAP_ANON|MAP_PRIVATE|MAP_FIXED,
1067                                ANONFD, 0);
1068                if (mapat == MAP_FAILED)
1069                  {
1070                    errstring = N_("cannot map zero-fill pages");
1071                    goto call_lose_errno;
1072                  }
1073              }
1074          }
1075
1076        ++c;
1077      }
1078
1079    if (l->l_phdr == NULL)
1080      {
1081        /* The program header is not contained in any of the segments.
1082           We have to allocate memory ourself and copy it over from
1083           out temporary place.  */
1084        ElfW(Phdr) *newp = (ElfW(Phdr) *) malloc (header->e_phnum
1085                                                  * sizeof (ElfW(Phdr)));
1086        if (newp == NULL)
1087          {
1088            errstring = N_("cannot allocate memory for program header");
1089            goto call_lose_errno;
1090          }
1091
1092        l->l_phdr = memcpy (newp, phdr,
1093                            (header->e_phnum * sizeof (ElfW(Phdr))));
1094        l->l_phdr_allocated = 1;
1095      }
1096    else
1097      /* Adjust the PT_PHDR value by the runtime load address.  */
1098      l->l_phdr = (ElfW(Addr)) l->l_phdr + l->l_addr;
1099  }
1100
1101  /* We are done mapping in the file.  We no longer need the descriptor.  */
1102  close (fd);
1103  /* Signal that we closed the file.  */
1104  fd = -1;
1105
1106  if (l->l_type == lt_library && type == ET_EXEC)
1107    l->l_type = lt_executable;
1108
1109  if (l->l_ld == 0)
1110    {
1111      if (type == ET_DYN)
1112        {
1113          errstring = N_("object file has no dynamic section");
1114          goto call_lose;
1115        }
1116    }
1117  else
1118    l->l_ld = (ElfW(Addr)) l->l_ld + l->l_addr;
1119
1120  l->l_entry += l->l_addr;
1121
1122  if (__builtin_expect (_dl_debug_mask & DL_DEBUG_FILES, 0))
1123    _dl_debug_printf ("  dynamic: 0x%0*lx  base: 0x%0*lx   size: 0x%0*Zx\n"
1124                      "    entry: 0x%0*lx  phdr: 0x%0*lx  phnum:   %*u\n\n",
1125                      (int) sizeof (void *) * 2, (unsigned long int) l->l_ld,
1126                      (int) sizeof (void *) * 2, (unsigned long int) l->l_addr,
1127                      (int) sizeof (void *) * 2, maplength,
1128                      (int) sizeof (void *) * 2, (unsigned long int) l->l_entry,
1129                      (int) sizeof (void *) * 2, (unsigned long int) l->l_phdr,
1130                      (int) sizeof (void *) * 2, l->l_phnum);
1131
1132  elf_get_dynamic_info (l);
1133
1134  /* Make sure we are dlopen()ing an object which has the DF_1_NOOPEN
1135     flag set.  */
1136  if (__builtin_expect (l->l_flags_1 & DF_1_NOOPEN, 0)
1137      && (mode & __RTLD_DLOPEN))
1138    {
1139      /* We are not supposed to load this object.  Free all resources.  */
1140      munmap ((void *) l->l_map_start, l->l_map_end - l->l_map_start);
1141
1142      if (!l->l_libname->dont_free)
1143        free (l->l_libname);
1144
1145      if (l->l_phdr_allocated)
1146        free ((void *) l->l_phdr);
1147
1148      errstring = N_("shared object cannot be dlopen()ed");
1149      goto call_lose;
1150    }
1151
1152  if (l->l_info[DT_HASH])
1153    _dl_setup_hash (l);
1154
1155  /* If this object has DT_SYMBOLIC set modify now its scope.  We don't
1156     have to do this for the main map.  */
1157  if (__builtin_expect (l->l_info[DT_SYMBOLIC] != NULL, 0)
1158      && &l->l_searchlist != l->l_scope[0])
1159    {
1160      /* Create an appropriate searchlist.  It contains only this map.
1161
1162         XXX This is the definition of DT_SYMBOLIC in SysVr4.  The old
1163         GNU ld.so implementation had a different interpretation which
1164         is more reasonable.  We are prepared to add this possibility
1165         back as part of a GNU extension of the ELF format.  */
1166      l->l_symbolic_searchlist.r_list =
1167        (struct link_map **) malloc (sizeof (struct link_map *));
1168
1169      if (l->l_symbolic_searchlist.r_list == NULL)
1170        {
1171          errstring = N_("cannot create searchlist");
1172          goto call_lose_errno;
1173        }
1174
1175      l->l_symbolic_searchlist.r_list[0] = l;
1176      l->l_symbolic_searchlist.r_nlist = 1;
1177
1178      /* Now move the existing entries one back.  */
1179      memmove (&l->l_scope[1], &l->l_scope[0],
1180               (l->l_scope_max - 1) * sizeof (l->l_scope[0]));
1181
1182      /* Now add the new entry.  */
1183      l->l_scope[0] = &l->l_symbolic_searchlist;
1184    }
1185
1186  /* Remember whether this object must be initialized first.  */
1187  if (l->l_flags_1 & DF_1_INITFIRST)
1188    _dl_initfirst = l;
1189
1190  /* Finally the file information.  */
1191  l->l_dev = st.st_dev;
1192  l->l_ino = st.st_ino;
1193
1194  return l;
1195}
1196
1197/* Print search path.  */
1198static void
1199print_search_path (struct r_search_path_elem **list,
1200                   const char *what, const char *name)
1201{
1202  char buf[max_dirnamelen + max_capstrlen];
1203  int first = 1;
1204
1205  _dl_debug_printf (" search path=");
1206
1207  while (*list != NULL && (*list)->what == what) /* Yes, ==.  */
1208    {
1209      char *endp = memcpy (buf, (*list)->dirname, (*list)->dirnamelen);
1210      size_t cnt;
1211      endp += (*list)->dirnamelen;
1212
1213
1214      for (cnt = 0; cnt < ncapstr; ++cnt)
1215        if ((*list)->status[cnt] != nonexisting)
1216          {
1217            char *cp = memcpy (endp, capstr[cnt].str, capstr[cnt].len);
1218            cp += capstr[cnt].len;
1219
1220            if (cp == buf || (cp == buf + 1 && buf[0] == '/'))
1221              cp[0] = '\0';
1222            else
1223              cp[-1] = '\0';
1224
1225            _dl_debug_printf_c (first ? "%s" : ":%s", buf);
1226            first = 0;
1227          }
1228
1229      ++list;
1230    }
1231
1232  if (name != NULL)
1233    _dl_debug_printf_c ("\t\t(%s from file %s)\n", what,
1234                        name[0] ? name : _dl_argv[0]);
1235  else
1236    _dl_debug_printf_c ("\t\t(%s)\n", what);
1237}
1238
1239/* Open a file and verify it is an ELF file for this architecture.  We
1240   ignore only ELF files for other architectures.  Non-ELF files and
1241   ELF files with different header information cause fatal errors since
1242   this could mean there is something wrong in the installation and the
1243   user might want to know about this.  */
1244static int
1245open_verify (const char *name, struct filebuf *fbp)
1246{
1247  /* This is the expected ELF header.  */
1248#define ELF32_CLASS ELFCLASS32
1249#define ELF64_CLASS ELFCLASS64
1250#ifndef VALID_ELF_HEADER
1251# define VALID_ELF_HEADER(hdr,exp,size) (memcmp (hdr, exp, size) == 0)
1252# define VALID_ELF_OSABI(osabi)         (osabi == ELFOSABI_SYSV)
1253# define VALID_ELF_ABIVERSION(ver)      (ver == 0)
1254#endif
1255  static const unsigned char expected[EI_PAD] =
1256  {
1257    [EI_MAG0] = ELFMAG0,
1258    [EI_MAG1] = ELFMAG1,
1259    [EI_MAG2] = ELFMAG2,
1260    [EI_MAG3] = ELFMAG3,
1261    [EI_CLASS] = ELFW(CLASS),
1262    [EI_DATA] = byteorder,
1263    [EI_VERSION] = EV_CURRENT,
1264    [EI_OSABI] = ELFOSABI_SYSV,
1265    [EI_ABIVERSION] = 0
1266  };
1267  static const struct
1268  {
1269    ElfW(Word) vendorlen;
1270    ElfW(Word) datalen;
1271    ElfW(Word) type;
1272    char vendor[4];
1273  } expected_note = { 4, 16, 1, "GNU" };
1274  int fd;
1275  /* Initialize it to make the compiler happy.  */
1276  const char *errstring = NULL;
1277  int errval = 0;
1278
1279  /* Open the file.  We always open files read-only.  */
1280  fd = open (name, O_RDONLY);
1281  if (fd != -1)
1282    {
1283      ElfW(Ehdr) *ehdr;
1284      ElfW(Phdr) *phdr, *ph;
1285      ElfW(Word) *abi_note, abi_note_buf[8];
1286      unsigned int osversion;
1287      size_t maplength;
1288
1289      /* We successfully openened the file.  Now verify it is a file
1290         we can use.  */
1291      __set_errno (0);
1292      fbp->len = __libc_read (fd, fbp->buf, sizeof (fbp->buf));
1293
1294      /* This is where the ELF header is loaded.  */
1295      assert (sizeof (fbp->buf) > sizeof (ElfW(Ehdr)));
1296      ehdr = (ElfW(Ehdr) *) fbp->buf;
1297
1298      /* Now run the tests.  */
1299      if (__builtin_expect (fbp->len < (ssize_t) sizeof (ElfW(Ehdr)), 0))
1300        {
1301          errval = errno;
1302          errstring = (errval == 0
1303                       ? N_("file too short") : N_("cannot read file data"));
1304        call_lose:
1305          lose (errval, fd, name, NULL, NULL, errstring);
1306        }
1307
1308      /* See whether the ELF header is what we expect.  */
1309      if (__builtin_expect (! VALID_ELF_HEADER (ehdr->e_ident, expected,
1310                                                EI_PAD), 0))
1311        {
1312          /* Something is wrong.  */
1313          if (*(Elf32_Word *) &ehdr->e_ident !=
1314#if BYTE_ORDER == LITTLE_ENDIAN
1315              ((ELFMAG0 << (EI_MAG0 * 8)) |
1316               (ELFMAG1 << (EI_MAG1 * 8)) |
1317               (ELFMAG2 << (EI_MAG2 * 8)) |
1318               (ELFMAG3 << (EI_MAG3 * 8)))
1319#else
1320              ((ELFMAG0 << (EI_MAG3 * 8)) |
1321               (ELFMAG1 << (EI_MAG2 * 8)) |
1322               (ELFMAG2 << (EI_MAG1 * 8)) |
1323               (ELFMAG3 << (EI_MAG0 * 8)))
1324#endif
1325              )
1326            errstring = N_("invalid ELF header");
1327          else if (ehdr->e_ident[EI_CLASS] != ELFW(CLASS))
1328            /* This is not a fatal error.  On architectures where
1329               32-bit and 64-bit binaries can be run this might
1330               happen.  */
1331            goto close_and_out;
1332          else if (ehdr->e_ident[EI_DATA] != byteorder)
1333            {
1334              if (BYTE_ORDER == BIG_ENDIAN)
1335                errstring = N_("ELF file data encoding not big-endian");
1336              else
1337                errstring = N_("ELF file data encoding not little-endian");
1338            }
1339          else if (ehdr->e_ident[EI_VERSION] != EV_CURRENT)
1340            errstring
1341              = N_("ELF file version ident does not match current one");
1342          /* XXX We should be able so set system specific versions which are
1343             allowed here.  */
1344          else if (!VALID_ELF_OSABI (ehdr->e_ident[EI_OSABI]))
1345            errstring = N_("ELF file OS ABI invalid");
1346          else if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_ABIVERSION]))
1347            errstring = N_("ELF file ABI version invalid");
1348          else
1349            /* Otherwise we don't know what went wrong.  */
1350            errstring = N_("internal error");
1351
1352          goto call_lose;
1353        }
1354
1355      if (__builtin_expect (ehdr->e_version, EV_CURRENT) != EV_CURRENT)
1356        {
1357          errstring = N_("ELF file version does not match current one");
1358          goto call_lose;
1359        }
1360      if (! __builtin_expect (elf_machine_matches_host (ehdr), 1))
1361        goto close_and_out;
1362      else if (__builtin_expect (ehdr->e_phentsize, sizeof (ElfW(Phdr)))
1363               != sizeof (ElfW(Phdr)))
1364        {
1365          errstring = N_("ELF file's phentsize not the expected size");
1366          goto call_lose;
1367        }
1368      else if (__builtin_expect (ehdr->e_type, ET_DYN) != ET_DYN
1369               && __builtin_expect (ehdr->e_type, ET_EXEC) != ET_EXEC)
1370        {
1371          errstring = N_("only ET_DYN and ET_EXEC can be loaded");
1372          goto call_lose;
1373        }
1374
1375      maplength = ehdr->e_phnum * sizeof (ElfW(Phdr));
1376      if (ehdr->e_phoff + maplength <= fbp->len)
1377        phdr = (void *) (fbp->buf + ehdr->e_phoff);
1378      else
1379        {
1380          phdr = alloca (maplength);
1381          lseek (fd, SEEK_SET, ehdr->e_phoff);
1382          if (__libc_read (fd, (void *) phdr, maplength) != maplength)
1383            {
1384            read_error:
1385              errval = errno;
1386              errstring = N_("cannot read file data");
1387              goto call_lose;
1388            }
1389        }
1390
1391      /* Check .note.ABI-tag if present.  */
1392      for (ph = phdr; ph < &phdr[ehdr->e_phnum]; ++ph)
1393        if (ph->p_type == PT_NOTE && ph->p_filesz == 32 && ph->p_align >= 4)
1394          {
1395            if (ph->p_offset + 32 <= fbp->len)
1396              abi_note = (void *) (fbp->buf + ph->p_offset);
1397            else
1398              {
1399                lseek (fd, SEEK_SET, ph->p_offset);
1400                if (__libc_read (fd, (void *) abi_note_buf, 32) != 32)
1401                  goto read_error;
1402
1403                abi_note = abi_note_buf;
1404              }
1405
1406            if (memcmp (abi_note, &expected_note, sizeof (expected_note)))
1407              continue;
1408
1409            osversion = (abi_note[5] & 0xff) * 65536
1410                        + (abi_note[6] & 0xff) * 256
1411                        + (abi_note[7] & 0xff);
1412            if (abi_note[4] != __ABI_TAG_OS
1413                || (_dl_osversion && _dl_osversion < osversion))
1414              {
1415              close_and_out:
1416                close (fd);
1417                __set_errno (ENOENT);
1418                fd = -1;
1419              }
1420
1421            break;
1422          }
1423    }
1424
1425  return fd;
1426}
1427
1428/* Try to open NAME in one of the directories in *DIRSP.
1429   Return the fd, or -1.  If successful, fill in *REALNAME
1430   with the malloc'd full directory name.  If it turns out
1431   that none of the directories in *DIRSP exists, *DIRSP is
1432   replaced with (void *) -1, and the old value is free()d
1433   if MAY_FREE_DIRS is true.  */
1434
1435static int
1436open_path (const char *name, size_t namelen, int preloaded,
1437           struct r_search_path_struct *sps, char **realname,
1438           struct filebuf *fbp)
1439{
1440  struct r_search_path_elem **dirs = sps->dirs;
1441  char *buf;
1442  int fd = -1;
1443  const char *current_what = NULL;
1444  int any = 0;
1445
1446  buf = alloca (max_dirnamelen + max_capstrlen + namelen);
1447  do
1448    {
1449      struct r_search_path_elem *this_dir = *dirs;
1450      size_t buflen = 0;
1451      size_t cnt;
1452      char *edp;
1453      int here_any = 0;
1454      int err;
1455
1456      /* If we are debugging the search for libraries print the path
1457         now if it hasn't happened now.  */
1458      if (__builtin_expect (_dl_debug_mask & DL_DEBUG_LIBS, 0)
1459          && current_what != this_dir->what)
1460        {
1461          current_what = this_dir->what;
1462          print_search_path (dirs, current_what, this_dir->where);
1463        }
1464
1465      edp = (char *) (memcpy (buf, this_dir->dirname, this_dir->dirnamelen) + this_dir->dirnamelen);
1466      for (cnt = 0; fd == -1 && cnt < ncapstr; ++cnt)
1467        {
1468          char *tmp;
1469          /* Skip this directory if we know it does not exist.  */
1470          if (this_dir->status[cnt] == nonexisting)
1471            continue;
1472
1473          tmp = memcpy (edp, capstr[cnt].str, capstr[cnt].len);
1474          tmp += capstr[cnt].len;
1475
1476          tmp = memcpy (tmp, name, namelen);
1477          tmp += namelen;
1478          buflen = ((char *) (tmp - buf));
1479
1480          /* Print name we try if this is wanted.  */
1481          if (__builtin_expect (_dl_debug_mask & DL_DEBUG_LIBS, 0))
1482            _dl_debug_printf ("  trying file=%s\n", buf);
1483
1484          fd = open_verify (buf, fbp);
1485          if (this_dir->status[cnt] == unknown)
1486            {
1487              if (fd != -1)
1488                this_dir->status[cnt] = existing;
1489              else
1490                {
1491                  /* We failed to open machine dependent library.  Let's
1492                     test whether there is any directory at all.  */
1493                  struct stat64 st;
1494
1495                  buf[buflen - namelen - 1] = '\0';
1496
1497                  if (stat64 (buf, &st) != 0
1498                      || ! S_ISDIR (st.st_mode))
1499                    /* The directory does not exist or it is no directory.  */
1500                    this_dir->status[cnt] = nonexisting;
1501                  else
1502                    this_dir->status[cnt] = existing;
1503                }
1504            }
1505
1506          /* Remember whether we found any existing directory.  */
1507          here_any |= this_dir->status[cnt] == existing;
1508
1509          if (fd != -1 && __builtin_expect (preloaded, 0)
1510              && 0)
1511            {
1512              /* This is an extra security effort to make sure nobody can
1513                 preload broken shared objects which are in the trusted
1514                 directories and so exploit the bugs.  */
1515              struct stat64 st;
1516
1517              if (fstat64 (fd, &st) != 0
1518                  || (st.st_mode & S_ISUID) == 0)
1519                {
1520                  /* The shared object cannot be tested for being SUID
1521                     or this bit is not set.  In this case we must not
1522                     use this object.  */
1523                  close (fd);
1524                  fd = -1;
1525                  /* We simply ignore the file, signal this by setting
1526                     the error value which would have been set by `open'.  */
1527                  errno = ENOENT;
1528                }
1529            }
1530        }
1531
1532      if (fd != -1)
1533        {
1534          *realname = (char *) malloc (buflen);
1535          if (*realname != NULL)
1536            {
1537              memcpy (*realname, buf, buflen);
1538              return fd;
1539            }
1540          else
1541            {
1542              /* No memory for the name, we certainly won't be able
1543                 to load and link it.  */
1544              close (fd);
1545              return -1;
1546            }
1547        }
1548      if (here_any && (err = errno) != ENOENT && err != EACCES)
1549        /* The file exists and is readable, but something went wrong.  */
1550        return -1;
1551
1552      /* Remember whether we found anything.  */
1553      any |= here_any;
1554    }
1555  while (*++dirs != NULL);
1556
1557  /* Remove the whole path if none of the directories exists.  */
1558  if (__builtin_expect (! any, 0))
1559    {
1560      /* Paths which were allocated using the minimal malloc() in ld.so
1561         must not be freed using the general free() in libc.  */
1562      if (sps->malloced)
1563        free (sps->dirs);
1564      sps->dirs = (void *) -1;
1565    }
1566
1567  return -1;
1568}
1569
1570/* Map in the shared object file NAME.  */
1571
1572struct link_map *
1573internal_function
1574_dl_map_object (struct link_map *loader, const char *name, int preloaded,
1575                int type, int trace_mode, int mode)
1576{
1577  int fd;
1578  char *realname;
1579  char *name_copy;
1580  struct link_map *l;
1581  struct filebuf fb;
1582
1583  /* Look for this name among those already loaded.  */
1584  for (l = _dl_loaded; l; l = l->l_next)
1585    {
1586      /* If the requested name matches the soname of a loaded object,
1587         use that object.  Elide this check for names that have not
1588         yet been opened.  */
1589      if (__builtin_expect (l->l_faked, 0) != 0)
1590        continue;
1591      if (!_dl_name_match_p (name, l))
1592        {
1593          const char *soname;
1594
1595          if (__builtin_expect (l->l_soname_added, 1)
1596              || l->l_info[DT_SONAME] == NULL)
1597            continue;
1598
1599          soname = ((const char *) D_PTR (l, l_info[DT_STRTAB])
1600                    + l->l_info[DT_SONAME]->d_un.d_val);
1601          if (strcmp (name, soname) != 0)
1602            continue;
1603
1604          /* We have a match on a new name -- cache it.  */
1605          add_name_to_object (l, soname);
1606          l->l_soname_added = 1;
1607        }
1608
1609      /* We have a match.  */
1610      return l;
1611    }
1612
1613  /* Display information if we are debugging.  */
1614  if (__builtin_expect (_dl_debug_mask & DL_DEBUG_FILES, 0) && loader != NULL)
1615    _dl_debug_printf ("\nfile=%s;  needed by %s\n", name,
1616                      loader->l_name[0] ? loader->l_name : _dl_argv[0]);
1617
1618  if (strchr (name, '/') == NULL)
1619    {
1620      /* Search for NAME in several places.  */
1621
1622      size_t namelen = strlen (name) + 1;
1623
1624      if (__builtin_expect (_dl_debug_mask & DL_DEBUG_LIBS, 0))
1625        _dl_debug_printf ("find library=%s; searching\n", name);
1626
1627      fd = -1;
1628
1629      /* When the object has the RUNPATH information we don't use any
1630         RPATHs.  */
1631      if (loader == NULL || loader->l_info[DT_RUNPATH] == NULL)
1632        {
1633          /* First try the DT_RPATH of the dependent object that caused NAME
1634             to be loaded.  Then that object's dependent, and on up.  */
1635          for (l = loader; fd == -1 && l; l = l->l_loader)
1636            {
1637              if (l->l_rpath_dirs.dirs == NULL)
1638                {
1639                  if (l->l_info[DT_RPATH] == NULL)
1640                    {
1641                      /* There is no path.  */
1642                      l->l_rpath_dirs.dirs = (void *) -1;
1643                      continue;
1644                    }
1645                  else
1646                    {
1647                      /* Make sure the cache information is available.  */
1648                      size_t ptrval = (D_PTR (l, l_info[DT_STRTAB])
1649                                       + l->l_info[DT_RPATH]->d_un.d_val);
1650                      decompose_rpath (&l->l_rpath_dirs,
1651                                       (const char *) ptrval, l, "RPATH");
1652                    }
1653                }
1654
1655              if (l->l_rpath_dirs.dirs != (void *) -1)
1656                fd = open_path (name, namelen, preloaded, &l->l_rpath_dirs,
1657                                &realname, &fb);
1658            }
1659
1660          /* If dynamically linked, try the DT_RPATH of the executable
1661             itself.  */
1662          l = _dl_loaded;
1663          if (fd == -1 && l && l->l_type != lt_loaded && l != loader
1664              && l->l_rpath_dirs.dirs != (void *) -1)
1665            fd = open_path (name, namelen, preloaded, &l->l_rpath_dirs,
1666                            &realname, &fb);
1667        }
1668
1669      /* Try the LD_LIBRARY_PATH environment variable.  */
1670      if (fd == -1 && env_path_list.dirs != (void *) -1)
1671        fd = open_path (name, namelen, preloaded, &env_path_list,
1672                        &realname, &fb);
1673
1674      /* Look at the RUNPATH information for this binary.
1675
1676         Note that this is no real loop.  'while' is used only to enable
1677         us to use 'break' instead of a 'goto' to jump to the end.  The
1678         loop is always left after the first round.  */
1679      while (fd == -1 && loader != NULL
1680             && loader->l_runpath_dirs.dirs != (void *) -1)
1681        {
1682          if (loader->l_runpath_dirs.dirs == NULL)
1683            {
1684              if (loader->l_info[DT_RUNPATH] == NULL)
1685                {
1686                  /* No RUNPATH.  */
1687                  loader->l_runpath_dirs.dirs = (void *) -1;
1688                  break;
1689                }
1690              else
1691                {
1692                  /* Make sure the cache information is available.  */
1693                  size_t ptrval = (D_PTR (loader, l_info[DT_STRTAB])
1694                                   + loader->l_info[DT_RUNPATH]->d_un.d_val);
1695                  decompose_rpath (&loader->l_runpath_dirs,
1696                                   (const char *) ptrval, loader, "RUNPATH");
1697                }
1698            }
1699
1700          if (loader->l_runpath_dirs.dirs != (void *) -1)
1701            fd = open_path (name, namelen, preloaded,
1702                            &loader->l_runpath_dirs, &realname, &fb);
1703          break;
1704        }
1705
1706      if (fd == -1
1707          && (__builtin_expect (! preloaded, 1) || ! 0))
1708        {
1709          /* Check the list of libraries in the file /etc/ld.so.cache,
1710             for compatibility with Linux's ldconfig program.  */
1711          const char *cached = _dl_load_cache_lookup (name);
1712
1713          if (cached != NULL)
1714            {
1715#ifdef SHARED
1716              l = loader ?: _dl_loaded;
1717#else
1718              l = loader;
1719#endif
1720
1721              /* If the loader has the DF_1_NODEFLIB flag set we must not
1722                 use a cache entry from any of these directories.  */
1723              if (
1724#ifndef SHARED
1725                  /* 'l' is always != NULL for dynamically linked objects.  */
1726                  l != NULL &&
1727#endif
1728                  __builtin_expect (l->l_flags_1 & DF_1_NODEFLIB, 0))
1729                {
1730                  const char *dirp = system_dirs;
1731                  unsigned int cnt = 0;
1732
1733                  do
1734                    {
1735                      if (memcmp (cached, dirp, system_dirs_len[cnt]) == 0)
1736                        {
1737                          /* The prefix matches.  Don't use the entry.  */
1738                          cached = NULL;
1739                          break;
1740                        }
1741
1742                      dirp += system_dirs_len[cnt] + 1;
1743                      ++cnt;
1744                    }
1745                  while (cnt < nsystem_dirs_len);
1746                }
1747
1748              if (cached != NULL)
1749                {
1750                  fd = open_verify (cached, &fb);
1751                  if (__builtin_expect (fd != -1, 1))
1752                    {
1753                      realname = local_strdup (cached);
1754                      if (realname == NULL)
1755                        {
1756                          close (fd);
1757                          fd = -1;
1758                        }
1759                    }
1760                }
1761            }
1762        }
1763
1764      /* Finally, try the default path.  */
1765      if (fd == -1
1766          && ((l = loader ?: _dl_loaded)
1767              /* 'l' is always != NULL for dynamically linked objects.  */
1768#ifdef SHARED
1769              ,
1770#else
1771              == NULL ||
1772#endif
1773              __builtin_expect (!(l->l_flags_1 & DF_1_NODEFLIB), 1))
1774          && rtld_search_dirs.dirs != (void *) -1)
1775        fd = open_path (name, namelen, preloaded, &rtld_search_dirs,
1776                        &realname, &fb);
1777
1778      /* Add another newline when we a tracing the library loading.  */
1779      if (__builtin_expect (_dl_debug_mask & DL_DEBUG_LIBS, 0))
1780        _dl_debug_printf ("\n");
1781    }
1782  else
1783    {
1784      /* The path may contain dynamic string tokens.  */
1785      realname = (loader
1786                  ? expand_dynamic_string_token (loader, name)
1787                  : local_strdup (name));
1788      if (realname == NULL)
1789        fd = -1;
1790      else
1791        {
1792          fd = open_verify (realname, &fb);
1793          if (__builtin_expect (fd, 0) == -1)
1794            free (realname);
1795        }
1796    }
1797
1798  if (__builtin_expect (fd, 0) == -1)
1799    {
1800      if (trace_mode)
1801        {
1802          /* We haven't found an appropriate library.  But since we
1803             are only interested in the list of libraries this isn't
1804             so severe.  Fake an entry with all the information we
1805             have.  */
1806          static const Elf_Symndx dummy_bucket = STN_UNDEF;
1807
1808          /* Enter the new object in the list of loaded objects.  */
1809          if ((name_copy = local_strdup (name)) == NULL
1810              || (l = _dl_new_object (name_copy, name, type, loader)) == NULL)
1811            _dl_signal_error (ENOMEM, name, NULL,
1812                              N_("cannot create shared object descriptor"));
1813          /* Signal that this is a faked entry.  */
1814          l->l_faked = 1;
1815          /* Since the descriptor is initialized with zero we do not
1816             have do this here.
1817          l->l_reserved = 0; */
1818          l->l_buckets = &dummy_bucket;
1819          l->l_nbuckets = 1;
1820          l->l_relocated = 1;
1821
1822          return l;
1823        }
1824      else
1825        _dl_signal_error (errno, name, NULL,
1826                          N_("cannot open shared object file"));
1827    }
1828
1829  return _dl_map_object_from_fd (name, fd, &fb, realname, loader, type, mode);
1830}
Note: See TracBrowser for help on using the repository browser.