[prev in list] [next in list] [prev in thread] [next in thread] 

List:       binutils-cvs
Subject:    [binutils-gdb] PR24262, plugin search dir doesn't respect --libdir
From:       Alan Modra <amodra () sourceware ! org>
Date:       2019-09-26 10:21:46
Message-ID: 20190926102146.123410.qmail () sourceware ! org
[Download RAW message or body]

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=41f37a6fb71f2a3de388108f5cdfca9cbe6e9d51

commit 41f37a6fb71f2a3de388108f5cdfca9cbe6e9d51
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Sep 26 16:20:35 2019 +0930

    PR24262, plugin search dir doesn't respect --libdir
    
    bfd/
    	PR 24262
    	* Makefile.am (AM_CPPFLAGS): Add -DLIBDIR.
    	* plugin.c (load_plugin): Search both ${libdir}/bfd-plugins and
    	${bindir}/../lib/bfd-plugins if different.
    	* Makefile.in: Regenerate.
    ld/
    	PR 24262
    	* ld.texi (-plugin): Revert 2019-03-15 change.

Diff:
---
 bfd/ChangeLog   |  8 ++++++
 bfd/Makefile.am |  2 +-
 bfd/Makefile.in |  5 ++--
 bfd/plugin.c    | 86 ++++++++++++++++++++++++++++++++++++---------------------
 ld/ChangeLog    |  5 ++++
 ld/ld.texi      |  2 +-
 6 files changed, 73 insertions(+), 35 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ac02964..8496cb4 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2019-09-26  Alan Modra  <amodra@gmail.com>
+
+	PR 24262
+	* Makefile.am (AM_CPPFLAGS): Add -DLIBDIR.
+	* plugin.c (load_plugin): Search both ${libdir}/bfd-plugins and
+	${bindir}/../lib/bfd-plugins if different.
+	* Makefile.in: Regenerate.
+
 2019-09-23  Alan Modra  <amodra@gmail.com>
 
 	* elf64-ppc.c (ppc64_elf_check_relocs): Use bfd_link_executable
diff --git a/bfd/Makefile.am b/bfd/Makefile.am
index f31a734..ca868e7 100644
--- a/bfd/Makefile.am
+++ b/bfd/Makefile.am
@@ -53,7 +53,7 @@ ZLIBINC = @zlibinc@
 WARN_CFLAGS = @WARN_CFLAGS@
 NO_WERROR = @NO_WERROR@
 AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC)
-AM_CPPFLAGS = -DBINDIR='"$(bindir)"'
+AM_CPPFLAGS = -DBINDIR='"$(bindir)"' -DLIBDIR='"$(libdir)"'
 if PLUGINS
 bfdinclude_HEADERS += $(INCDIR)/plugin-api.h
 LIBDL = @lt_cv_dlopen_libs@
diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index c1cd371..ec1ce3e 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -479,8 +479,9 @@ libbfd_la_LDFLAGS = $(am__append_1) -release `cat libtool-soversion` \
 ZLIB = @zlibdir@ -lz
 ZLIBINC = @zlibinc@
 AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC)
-AM_CPPFLAGS = -DBINDIR='"$(bindir)"' @HDEFINES@ @COREFLAG@ @TDEFINES@ \
-	$(CSEARCH) $(CSWITCHES) $(HAVEVECS) @INCINTL@
+AM_CPPFLAGS = -DBINDIR='"$(bindir)"' -DLIBDIR='"$(libdir)"' @HDEFINES@ \
+	@COREFLAG@ @TDEFINES@ $(CSEARCH) $(CSWITCHES) $(HAVEVECS) \
+	@INCINTL@ $(am__empty)
 @PLUGINS_TRUE@LIBDL = @lt_cv_dlopen_libs@
 
 # bfd.h goes here, for now
diff --git a/bfd/plugin.c b/bfd/plugin.c
index ca26005..5f059be 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -367,11 +367,15 @@ register_ld_plugin_object_p (const bfd_target *(*object_p) (bfd *))
 static int
 load_plugin (bfd *abfd)
 {
-  char *plugin_dir;
-  char *p;
-  DIR *d;
-  struct dirent *ent;
+  /* The intent was to search ${libdir}/bfd-plugins for plugins, but
+     unfortunately the original implementation wasn't precisely that
+     when configuring binutils using --libdir.  Search in the proper
+     path first, then the old one for backwards compatibility.  */
+  static const char *path[]
+    = { LIBDIR "/bfd-plugins", BINDIR "/../lib/bfd-plugins" };
+  struct stat last_st;
   int found = 0;
+  unsigned int i;
 
   if (!has_plugin)
     return found;
@@ -382,38 +386,58 @@ load_plugin (bfd *abfd)
   if (plugin_program_name == NULL)
     return found;
 
-  plugin_dir = concat (BINDIR, "/../lib/bfd-plugins", NULL);
-  p = make_relative_prefix (plugin_program_name,
-			    BINDIR,
-			    plugin_dir);
-  free (plugin_dir);
-  plugin_dir = NULL;
-
-  d = opendir (p);
-  if (!d)
-    goto out;
-
-  while ((ent = readdir (d)))
+  /* Try not to search the same dir twice, by looking at st_dev and
+     st_ino for the dir.  If we are on a file system that always sets
+     st_ino to zero or the actual st_ino is zero we might waste some
+     time, but that doesn't matter too much.  */
+  last_st.st_dev = 0;
+  last_st.st_ino = 0;
+  for (i = 0; i < sizeof (path) / sizeof (path[0]); i++)
     {
-      char *full_name;
-      struct stat s;
-      int valid_plugin;
-
-      full_name = concat (p, "/", ent->d_name, NULL);
-      if (stat (full_name, &s) == 0 && S_ISREG (s.st_mode))
-	found = try_load_plugin (full_name, abfd, &valid_plugin);
-      if (has_plugin <= 0)
-	has_plugin = valid_plugin;
-      free (full_name);
+      char *plugin_dir = make_relative_prefix (plugin_program_name,
+					       BINDIR,
+					       path[i]);
+      if (plugin_dir)
+	{
+	  struct stat st;
+	  DIR *d;
+
+	  if (stat (plugin_dir, &st) == 0
+	      && S_ISDIR (st.st_mode)
+	      && !(last_st.st_dev == st.st_dev
+		   && last_st.st_ino == st.st_ino
+		   && st.st_ino != 0)
+	      && (d = opendir (plugin_dir)) != NULL)
+	    {
+	      struct dirent *ent;
+
+	      last_st.st_dev = st.st_dev;
+	      last_st.st_ino = st.st_ino;
+	      while ((ent = readdir (d)) != NULL)
+		{
+		  char *full_name;
+
+		  full_name = concat (plugin_dir, "/", ent->d_name, NULL);
+		  if (stat (full_name, &st) == 0 && S_ISREG (st.st_mode))
+		    {
+		      int valid_plugin;
+
+		      found = try_load_plugin (full_name, abfd, &valid_plugin);
+		      if (has_plugin <= 0)
+			has_plugin = valid_plugin;
+		    }
+		  free (full_name);
+		  if (found)
+		    break;
+		}
+	      closedir (d);
+	    }
+	  free (plugin_dir);
+	}
       if (found)
 	break;
     }
 
- out:
-  free (p);
-  if (d)
-    closedir (d);
-
   return found;
 }
 
diff --git a/ld/ChangeLog b/ld/ChangeLog
index c90a587..24f0ae9 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2019-09-26  Alan Modra  <amodra@gmail.com>
+
+	PR 24262
+	* ld.texi (-plugin): Revert 2019-03-15 change.
+
 2019-09-25  Alan Modra  <amodra@gmail.com>
 
 	* ld.texi (SORT_BY_ALIGNMENT): Reword slightly.
diff --git a/ld/ld.texi b/ld/ld.texi
index 95fa6a0..fcbc335 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -855,7 +855,7 @@ Note that the location of the compiler originated plugins is different
 from the place where the @command{ar}, @command{nm} and
 @command{ranlib} programs search for their plugins.  In order for
 those commands to make use of a compiler based plugin it must first be
-copied into the @file{$@{bindir@}/../lib/bfd-plugins} directory.  All gcc
+copied into the @file{$@{libdir@}/bfd-plugins} directory.  All gcc
 based linker plugins are backward compatible, so it is sufficient to
 just copy in the newest one.
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic