This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Add --print-dirs option for ldconfig


On Mon, Apr 02, 2012 at 05:35:07PM -0700, Dan Nicholson wrote:
> On Mon, Apr 02, 2012 at 11:14:19AM -0700, Roland McGrath wrote:
> > Exactly what uses is this intended for?  
> 
> Figuring out where the linker is looking for libraries since it's not
> really documented anywhere.
> 
> > It shows all the directories listed in configuration files.  It
> > doesn't show all the directories that ldconfig searches.  That's
> > because the hwcap-named subdirectories don't get added until inside
> > the same loop that finds the individual libraries.  So if the intent
> > is to list all the directories where ldconfig might find libraries,
> > then it needs more work.
> 
> Right, I'd forgotten about those since they don't really get used on
> Fedora. I took another look and did the print at the time the
> directory is added to the list. It seems to work correctly now, but
> it's not as clean since you actually have to let it build up the cache
> to find all the directories. Untangling that seemed way too intrusive,
> though.
> 
> Doing this change did highlight a couple things to me, though.
> 
> * The non-existent directories won't be shown. It could be nice to
>   know all the possible directories, but didn't seem ncessary.
> 
> * The path built up by ldconfig puts the hwcap directories at the end.
>   I would have expected them to come at the beginning like
>   LD_DEBUG=libs shows. It does seem that things work out correctly in
>   the cache, though.
> 
> Anyway, updated patch attached.

OK, that patch sucked. After spending more time looking at this
(especially the hwcap paths), I think it's important to decide what this
feature should do.

1. Print just the base directories or the hwcap subdirectories, too? The
   latter can additionally confusing because ldconfig will recursively
   join hwcap entries as it finds them. From what I can tell, ld.so does
   not perform that feature.

2. Print the directories that are requested to be searched or just the
   ones that actually exist?

On this iteration, I've decided to optionally add the hwcap subdirs (not
recursively) and print the directories as requested. Here is sample
output from a Fedora 16 x86_64 system:

$ ./elf/ldconfig -P
/usr/lib64/atlas
/usr/lib64/llvm
/usr/lib64/tracker-0.12
/usr/lib64/xulrunner-2
/lib
/lib64
/libx32
/usr/lib
/usr/lib64
/usr/libx32

When -v|--verbose is added, the hwcap entries will be appended as
subdirs.

$ ./elf/ldconfig -Pv
/usr/lib64/atlas/sse2
/usr/lib64/atlas/i386
/usr/lib64/atlas/i486
/usr/lib64/atlas/i586
/usr/lib64/atlas/i686
/usr/lib64/atlas/tls
/usr/lib64/atlas
...

I had to more or less duplicate some code to do this without entering a
major refactoring. The difference here is that I'm iterating over all
known hwcap entries, but the cache building code looks at each entry and
checks if it's a hwcap. Roland, what do you think?

2012-05-11  Dan Nicholson  <dbn.lists@gmail.com>

	* elf/ldconfig.c (opt_print_search_dirs): New variable.
	(options, parse_opt): Add -P|--print-search-dirs to set it.
	(add_dir): Print directories and hwcap subdirs when set.
	(main): Exit after adding directories when option set.
---
 elf/ldconfig.c |   71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 71 insertions(+), 0 deletions(-)

diff --git a/elf/ldconfig.c b/elf/ldconfig.c
index aa97213..eab8909 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -89,6 +89,9 @@ static struct dir_entry *dir_entries;
 /* Print Cache.  */
 static int opt_print_cache;
 
+/* Print search directories.  */
+static int opt_print_search_dirs;
+
 /* Be verbose.  */
 int opt_verbose;
 
@@ -138,6 +141,7 @@ static char *more_help (int key, const char *text, void *input);
 static const struct argp_option options[] =
 {
   { "print-cache", 'p', NULL, 0, N_("Print cache"), 0},
+  { "print-search-dirs", 'P', NULL, 0, N_("Print search directories"), 0},
   { "verbose", 'v', NULL, 0, N_("Generate verbose messages"), 0},
   { NULL, 'N', NULL, 0, N_("Don't build cache"), 0},
   { NULL, 'X', NULL, 0, N_("Don't generate links"), 0},
@@ -266,6 +270,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
     case 'p':
       opt_print_cache = 1;
       break;
+    case 'P':
+      opt_print_search_dirs = 1;
+      break;
     case 'r':
       opt_chroot = arg;
       break;
@@ -395,6 +402,66 @@ add_dir (const char *line)
   if (i == 0)
     return;
 
+  /* Don't bother stating if we're just printing the search path */
+  if (opt_print_search_dirs)
+    {
+      /* Append the hwcap entries when verbose. */
+      if (opt_verbose)
+	{
+	  char *hwcap_path;
+
+	  /* Find all the hwcap subdirectories. */
+	  for (int hwcap_idx = 0; hwcap_idx < _DL_HWCAP_COUNT; ++hwcap_idx)
+	    {
+	      if ((1ULL << hwcap_idx) & hwcap_mask)
+		{
+		  asprintf (&hwcap_path, "%s/%s", entry->path,
+			    _dl_hwcap_string (hwcap_idx));
+		  if (hwcap_path)
+		    {
+		      puts (hwcap_path);
+		      free (hwcap_path);
+		    }
+		}
+	    }
+
+#ifdef _DL_FIRST_PLATFORM
+	  /* Find all the platform subdirectories. */
+	  for (int plat_idx = _DL_FIRST_PLATFORM; plat_idx < _DL_FIRST_EXTRA;
+	       ++plat_idx)
+	    {
+	      asprintf (&hwcap_path, "%s/%s", entry->path,
+			_dl_platform_string (plat_idx));
+	      if (hwcap_path)
+		{
+		  puts (hwcap_path);
+		  free (hwcap_path);
+		}
+	    }
+#endif /* _DL_FIRST_PLATFORM */
+
+	  /* Extra hwcap directories */
+	  for (int hwcap_idx = _DL_FIRST_EXTRA; hwcap_idx < 64; ++hwcap_idx)
+	    {
+	      if (hwcap_extra[hwcap_idx - _DL_FIRST_EXTRA] != NULL)
+		{
+		  asprintf (&hwcap_path, "%s/%s", entry->path,
+			    hwcap_extra[hwcap_idx - _DL_FIRST_EXTRA]);
+		  if (hwcap_path)
+		    {
+		      puts (hwcap_path);
+		      free (hwcap_path);
+		    }
+		}
+	    }
+	}
+
+      puts (entry->path);
+      free (entry->path);
+      free (entry);
+      return;
+    }
+
   char *path = entry->path;
   if (opt_chroot)
     path = chroot_canon (opt_chroot, path);
@@ -1359,6 +1426,10 @@ main (int argc, char **argv)
 	add_system_dir (LIBDIR);
     }
 
+  /* Search path printed in add_path */
+  if (opt_print_search_dirs)
+    exit (0);
+
   const char *aux_cache_file = _PATH_LDCONFIG_AUX_CACHE;
   if (opt_chroot)
     aux_cache_file = chroot_canon (opt_chroot, aux_cache_file);
-- 
1.7.7.6


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]