diff options
author | Alan Modra <amodra@gmail.com> | 2019-09-26 16:20:35 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-09-26 19:51:18 +0930 |
commit | 41f37a6fb71f2a3de388108f5cdfca9cbe6e9d51 (patch) | |
tree | 9c440accb37851b3f1328671eff5ceac04f0e99c | |
parent | d2f617897b4789ea370559ddbf19d96ad5618128 (diff) | |
download | binutils-41f37a6fb71f2a3de388108f5cdfca9cbe6e9d51.zip binutils-41f37a6fb71f2a3de388108f5cdfca9cbe6e9d51.tar.gz binutils-41f37a6fb71f2a3de388108f5cdfca9cbe6e9d51.tar.bz2 |
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/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/Makefile.am | 2 | ||||
-rw-r--r-- | bfd/Makefile.in | 5 | ||||
-rw-r--r-- | bfd/plugin.c | 86 | ||||
-rw-r--r-- | ld/ChangeLog | 5 | ||||
-rw-r--r-- | 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. @@ -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. |