summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-09-26 16:20:35 +0930
committerAlan Modra <amodra@gmail.com>2019-09-26 19:51:18 +0930
commit41f37a6fb71f2a3de388108f5cdfca9cbe6e9d51 (patch)
tree9c440accb37851b3f1328671eff5ceac04f0e99c
parentd2f617897b4789ea370559ddbf19d96ad5618128 (diff)
downloadbinutils-gdb-41f37a6fb71f2a3de388108f5cdfca9cbe6e9d51.tar.gz
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.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/Makefile.am2
-rw-r--r--bfd/Makefile.in5
-rw-r--r--bfd/plugin.c86
-rw-r--r--ld/ChangeLog5
-rw-r--r--ld/ld.texi2
6 files changed, 73 insertions, 35 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ac0296482b3..8496cb484f9 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 f31a7345994..ca868e7c2e8 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 c1cd3718526..ec1ce3eb8d7 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 ca26005055e..5f059befb40 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 c90a587b3ad..24f0ae90cbe 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 95fa6a03485..fcbc335c95e 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.