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.
This commit is contained in:
Alan Modra
2019-09-26 16:20:35 +09:30
parent d2f617897b
commit 41f37a6fb7
6 changed files with 72 additions and 34 deletions

View File

@@ -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> 2019-09-23 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ppc64_elf_check_relocs): Use bfd_link_executable * elf64-ppc.c (ppc64_elf_check_relocs): Use bfd_link_executable

View File

@@ -53,7 +53,7 @@ ZLIBINC = @zlibinc@
WARN_CFLAGS = @WARN_CFLAGS@ WARN_CFLAGS = @WARN_CFLAGS@
NO_WERROR = @NO_WERROR@ NO_WERROR = @NO_WERROR@
AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC)
AM_CPPFLAGS = -DBINDIR='"$(bindir)"' AM_CPPFLAGS = -DBINDIR='"$(bindir)"' -DLIBDIR='"$(libdir)"'
if PLUGINS if PLUGINS
bfdinclude_HEADERS += $(INCDIR)/plugin-api.h bfdinclude_HEADERS += $(INCDIR)/plugin-api.h
LIBDL = @lt_cv_dlopen_libs@ LIBDL = @lt_cv_dlopen_libs@

View File

@@ -479,8 +479,9 @@ libbfd_la_LDFLAGS = $(am__append_1) -release `cat libtool-soversion` \
ZLIB = @zlibdir@ -lz ZLIB = @zlibdir@ -lz
ZLIBINC = @zlibinc@ ZLIBINC = @zlibinc@
AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC) AM_CFLAGS = $(WARN_CFLAGS) $(ZLIBINC)
AM_CPPFLAGS = -DBINDIR='"$(bindir)"' @HDEFINES@ @COREFLAG@ @TDEFINES@ \ AM_CPPFLAGS = -DBINDIR='"$(bindir)"' -DLIBDIR='"$(libdir)"' @HDEFINES@ \
$(CSEARCH) $(CSWITCHES) $(HAVEVECS) @INCINTL@ @COREFLAG@ @TDEFINES@ $(CSEARCH) $(CSWITCHES) $(HAVEVECS) \
@INCINTL@ $(am__empty)
@PLUGINS_TRUE@LIBDL = @lt_cv_dlopen_libs@ @PLUGINS_TRUE@LIBDL = @lt_cv_dlopen_libs@
# bfd.h goes here, for now # bfd.h goes here, for now

View File

@@ -367,11 +367,15 @@ register_ld_plugin_object_p (const bfd_target *(*object_p) (bfd *))
static int static int
load_plugin (bfd *abfd) load_plugin (bfd *abfd)
{ {
char *plugin_dir; /* The intent was to search ${libdir}/bfd-plugins for plugins, but
char *p; unfortunately the original implementation wasn't precisely that
DIR *d; when configuring binutils using --libdir. Search in the proper
struct dirent *ent; 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; int found = 0;
unsigned int i;
if (!has_plugin) if (!has_plugin)
return found; return found;
@@ -382,38 +386,58 @@ load_plugin (bfd *abfd)
if (plugin_program_name == NULL) if (plugin_program_name == NULL)
return found; return found;
plugin_dir = concat (BINDIR, "/../lib/bfd-plugins", NULL); /* Try not to search the same dir twice, by looking at st_dev and
p = make_relative_prefix (plugin_program_name, st_ino for the dir. If we are on a file system that always sets
BINDIR, st_ino to zero or the actual st_ino is zero we might waste some
plugin_dir); time, but that doesn't matter too much. */
free (plugin_dir); last_st.st_dev = 0;
plugin_dir = NULL; last_st.st_ino = 0;
for (i = 0; i < sizeof (path) / sizeof (path[0]); i++)
d = opendir (p);
if (!d)
goto out;
while ((ent = readdir (d)))
{ {
char *full_name; char *plugin_dir = make_relative_prefix (plugin_program_name,
struct stat s; BINDIR,
int valid_plugin; path[i]);
if (plugin_dir)
{
struct stat st;
DIR *d;
full_name = concat (p, "/", ent->d_name, NULL); if (stat (plugin_dir, &st) == 0
if (stat (full_name, &s) == 0 && S_ISREG (s.st_mode)) && S_ISDIR (st.st_mode)
found = try_load_plugin (full_name, abfd, &valid_plugin); && !(last_st.st_dev == st.st_dev
if (has_plugin <= 0) && last_st.st_ino == st.st_ino
has_plugin = valid_plugin; && st.st_ino != 0)
free (full_name); && (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) if (found)
break; break;
} }
out:
free (p);
if (d)
closedir (d);
return found; return found;
} }

View File

@@ -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> 2019-09-25 Alan Modra <amodra@gmail.com>
* ld.texi (SORT_BY_ALIGNMENT): Reword slightly. * ld.texi (SORT_BY_ALIGNMENT): Reword slightly.

View File

@@ -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 from the place where the @command{ar}, @command{nm} and
@command{ranlib} programs search for their plugins. In order for @command{ranlib} programs search for their plugins. In order for
those commands to make use of a compiler based plugin it must first be 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 based linker plugins are backward compatible, so it is sufficient to
just copy in the newest one. just copy in the newest one.