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