]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - elf/dl-dst.h
test-container: Fix "unused code" warnings on HURD
[thirdparty/glibc.git] / elf / dl-dst.h
index 2ebd4d96362a8e8174084a70e542dca60caa05d1..f7f7158ab0176b4c11384aa7b44e70b2ce3dfa73 100644 (file)
@@ -1,5 +1,5 @@
 /* Handling of dynamic sring tokens.
-   Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+   Copyright (C) 1999-2022 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-/* Determine the number of DST elements in the name.  Only if IS_PATH is
-   nonzero paths are recognized (i.e., multiple, ':' separated filenames).  */
-#define DL_DST_COUNT(name, is_path) \
-  ({                                                                         \
-    size_t __cnt = 0;                                                        \
-    const char *__sf = strchr (name, '$');                                   \
-                                                                             \
-    if (__builtin_expect (__sf != NULL, 0))                                  \
-      __cnt = _dl_dst_count (__sf, is_path);                                 \
-                                                                             \
-    __cnt; })
-
-/* Prototype for used function.  */
-extern size_t _dl_dst_count (const char *name, int is_path);
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
 
+#include "trusted-dirs.h"
 
+#ifdef SHARED
+# define IS_RTLD(l) (l) == &GL(dl_rtld_map)
+#else
+# define IS_RTLD(l) 0
+#endif
 /* Guess from the number of DSTs the length of the result string.  */
 #define DL_DST_REQUIRED(l, name, len, cnt) \
   ({                                                                         \
-    size_t origin_len;                                                       \
     size_t __len = (len);                                                    \
+    size_t __cnt = (cnt);                                                    \
                                                                              \
-    /* Now we make a guess how many extra characters on top of the length     \
-       of S we need to represent the result.  We know that we have CNT       \
-       replacements.  Each at most can use                                   \
-         MAX (strlen (ORIGIN), strlen (_dl_platform))                        \
-       minus 7 (which is the length of "$ORIGIN").                           \
-                                                                             \
-       First get the origin string if it is not available yet.  This can      \
-       only happen for the map of the executable.  */                        \
-    if ((l)->l_origin == NULL)                                               \
+    if (__cnt > 0)                                                           \
       {                                                                              \
-       assert ((l)->l_name[0] == '\0');                                      \
-       (l)->l_origin = _dl_get_origin ();                                    \
-       origin_len = ((l)->l_origin && (l)->l_origin != (char *) -1           \
-                     ? strlen ((l)->l_origin) : 0);                          \
+       size_t dst_len;                                                       \
+       /* Now we make a guess how many extra characters on top of the        \
+          length of S we need to represent the result.  We know that         \
+          we have CNT replacements.  Each at most can use                    \
+            MAX (MAX (strlen (ORIGIN), strlen (_dl_platform)),               \
+                 strlen (DL_DST_LIB))                                        \
+          minus 4 (which is the length of "$LIB").                           \
+                                                                             \
+          First get the origin string if it is not available yet.            \
+          This can only happen for the map of the executable or, when        \
+          auditing, in ld.so.  */                                            \
+       if ((l)->l_origin == NULL)                                            \
+         {                                                                   \
+           assert ((l)->l_name[0] == '\0' || IS_RTLD (l));                   \
+           (l)->l_origin = _dl_get_origin ();                                \
+           dst_len = ((l)->l_origin && (l)->l_origin != (char *) -1          \
+                         ? strlen ((l)->l_origin) : 0);                      \
+         }                                                                   \
+       else                                                                  \
+         dst_len = (l)->l_origin == (char *) -1                              \
+           ? 0 : strlen ((l)->l_origin);                                     \
+       dst_len = MAX (MAX (dst_len, GLRO(dl_platformlen)),                   \
+                      strlen (DL_DST_LIB));                                  \
+       if (dst_len > 4)                                                      \
+         __len += __cnt * (dst_len - 4);                                     \
       }                                                                              \
-    else                                                                     \
-      origin_len = (l)->l_origin == (char *) -1 ? 0 : strlen ((l)->l_origin); \
                                                                              \
-    __len + cnt * (MAX (origin_len, _dl_platformlen) - 7); })
-
-/* Find origin of the executable.  */
-extern const char *_dl_get_origin (void);
-
-
-/* Perform the DST substitution.  */
-#define DL_DST_SUBSTITUTE(l, name, res, is_path) \
-  _dl_dst_substitute (l, name, res, is_path)
-
-/* Prototype for used function.  */
-extern char *_dl_dst_substitute (struct link_map *l, const char *name,
-                                char *result, int is_path);
+    __len; })