This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [patch] Add plugin support for bfd
- From: Rafael Espindola <espindola at google dot com>
- To: Nick Clifton <nickc at redhat dot com>
- Cc: Mike Frysinger <vapier at gentoo dot org>, binutils at sourceware dot org, "H.J. Lu" <hjl dot tools at gmail dot com>, Andreas Schwab <schwab at linux-m68k dot org>, Rafael EspÃndola <rafael dot espindola at gmail dot com>, Tristan Gingold <gingold at adacore dot com>
- Date: Tue, 12 May 2009 09:31:19 +0100
- Subject: Re: [patch] Add plugin support for bfd
- References: <564d96fb0904280939p47219a79y2bd35b1eeb34a875@mail.gmail.com> <200904301228.34006.vapier@gentoo.org> <38a0d8450904301025p5508ac8k3df2e0d5892da21a@mail.gmail.com> <200904301439.34913.vapier@gentoo.org> <38a0d8450905080352vb5e9akcdf2389f49bcc65@mail.gmail.com> <4A044DEF.30509@redhat.com>
> I think that you may need to extend this patch to include an update to the
> configure script in the binutils subdirectory. ÂSee the start of
> binutils/configure.in and in particular the refernce to PR 9992. ÂThe
> problem is that for Solaris, the size of the stat structure changes
> depending upon whether large file support is enabled or not, and this
> structure is passed between the binutils code and the bfd library.
That is interesting. If bfd and binutils already check for largefile
support, there should be no need to define LFS_CFLAGS for example.
The attached patches does just that. I tested it by building with -m32
on linux x86-64 and checking that it can load a 32 bit plugin. I don't
have a solaris machine to test it, but I think the change is simple
enough: If the user asked for plugin support, don't disable large file
support.
> Cheers
> ÂNick
Cheers,
--
Rafael Avila de Espindola
Google | Gordon House | Barrow Street | Dublin 4 | Ireland
Registered in Dublin, Ireland | Registration Number: 368047
diff --git a/bfd/Makefile.am b/bfd/Makefile.am
index 05df78e..8635498 100644
--- a/bfd/Makefile.am
+++ b/bfd/Makefile.am
@@ -1040,10 +1040,11 @@ archive.lo: archive.c $(INCDIR)/filenames.h $(INCDIR)/libiberty.h \
archures.lo: archures.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/safe-ctype.h
bfd.lo: bfd.c $(INCDIR)/filenames.h bfdver.h $(INCDIR)/libiberty.h \
- $(INCDIR)/demangle.h $(INCDIR)/safe-ctype.h $(INCDIR)/bfdlink.h \
- $(INCDIR)/hashtab.h $(INCDIR)/coff/internal.h $(INCDIR)/coff/sym.h \
- libcoff.h libecoff.h $(INCDIR)/coff/ecoff.h elf-bfd.h \
- $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h
+ $(INCDIR)/demangle.h $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h \
+ $(INCDIR)/bfdlink.h $(INCDIR)/hashtab.h $(INCDIR)/coff/internal.h \
+ $(INCDIR)/coff/sym.h libcoff.h libecoff.h $(INCDIR)/coff/ecoff.h \
+ elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
+ $(INCDIR)/elf/internal.h
bfdio.lo: bfdio.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
bfdwin.lo: bfdwin.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cache.lo: cache.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
@@ -1071,8 +1072,6 @@ linker.lo: linker.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/bfdlink.h genlink.h
srec.lo: srec.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h
-verilog.lo: verilog.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
- $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h
binary.lo: binary.c $(INCDIR)/filenames.h $(INCDIR)/safe-ctype.h \
$(INCDIR)/hashtab.h
tekhex.lo: tekhex.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
@@ -1092,6 +1091,8 @@ dwarf2.lo: dwarf2.c $(INCDIR)/filenames.h $(INCDIR)/libiberty.h \
simple.lo: simple.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/bfdlink.h
compress.lo: compress.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
+verilog.lo: verilog.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
+ $(INCDIR)/libiberty.h $(INCDIR)/safe-ctype.h
archive64.lo: archive64.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/aout/ar.h
cpu-alpha.lo: cpu-alpha.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
@@ -1225,7 +1226,8 @@ coff-arm.lo: coff-arm.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h
coff-aux.lo: coff-aux.c $(INCDIR)/filenames.h $(INCDIR)/coff/aux-coff.h \
$(INCDIR)/coff/internal.h $(INCDIR)/coff/m68k.h $(INCDIR)/coff/external.h \
- coff-m68k.c $(INCDIR)/hashtab.h libcoff.h $(INCDIR)/bfdlink.h \
+ coff-m68k.c $(INCDIR)/hashtab.h $(INCDIR)/coff/m68k.h \
+ $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \
coffcode.h coffswap.h
coff-h8300.lo: coff-h8300.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/bfdlink.h genlink.h $(INCDIR)/coff/h8300.h \
@@ -1397,10 +1399,10 @@ elf32-frv.lo: elf32-frv.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/frv.h \
$(INCDIR)/elf/reloc-macros.h $(INCDIR)/elf/dwarf2.h \
elf32-target.h
-elf32-moxie.lo: elf32-moxie.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
- elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
- $(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/moxie.h \
- $(INCDIR)/elf/reloc-macros.h $(INCDIR)/elf/dwarf2.h \
+elf32-moxie.lo: elf32-moxie.c $(INCDIR)/filenames.h \
+ $(INCDIR)/hashtab.h elf-bfd.h $(INCDIR)/elf/common.h \
+ $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h \
+ $(INCDIR)/elf/moxie.h $(INCDIR)/elf/reloc-macros.h \
elf32-target.h
elf32-gen.lo: elf32-gen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
@@ -1549,16 +1551,6 @@ elf32-s390.lo: elf32-s390.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \
$(INCDIR)/hashtab.h elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/s390.h \
$(INCDIR)/elf/reloc-macros.h elf32-target.h
-elf32-score.lo: elf32-score.c $(INCDIR)/filenames.h \
- $(INCDIR)/hashtab.h $(INCDIR)/libiberty.h elf-bfd.h \
- $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h \
- $(INCDIR)/bfdlink.h $(INCDIR)/elf/score.h $(INCDIR)/elf/reloc-macros.h \
- elf32-score.h elf32-target.h
-elf32-score7.lo: elf32-score7.c $(INCDIR)/filenames.h \
- $(INCDIR)/hashtab.h $(INCDIR)/libiberty.h elf-bfd.h \
- $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h \
- $(INCDIR)/bfdlink.h $(INCDIR)/elf/score.h $(INCDIR)/elf/reloc-macros.h \
- elf32-score.h
elf32-sh.lo: elf32-sh.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \
$(INCDIR)/hashtab.h elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h elf-vxworks.h \
@@ -1856,7 +1848,7 @@ vms-tir.lo: vms-tir.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \
vmsutil.lo: vmsutil.c vmsutil.h
xcofflink.lo: xcofflink.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \
$(INCDIR)/hashtab.h $(INCDIR)/coff/internal.h $(INCDIR)/coff/xcoff.h \
- libcoff.h libxcoff.h
+ libcoff.h libxcoff.h $(INCDIR)/libiberty.h
xsym.lo: xsym.c $(INCDIR)/alloca-conf.h $(INCDIR)/filenames.h \
xsym.h $(INCDIR)/hashtab.h
xtensa-isa.lo: xtensa-isa.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
@@ -1880,11 +1872,10 @@ demo64.lo: demo64.c aoutf1.h $(INCDIR)/filenames.h \
$(INCDIR)/hashtab.h $(INCDIR)/aout/sun4.h libaout.h \
$(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \
$(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h aout-target.h
-pei-ia64.lo: pei-ia64.c $(INCDIR)/filenames.h \
- coff-ia64.c $(INCDIR)/hashtab.h $(INCDIR)/coff/ia64.h \
- $(INCDIR)/coff/external.h $(INCDIR)/coff/internal.h \
- $(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h coffcode.h \
- peicode.h libpei.h
+pei-ia64.lo: pei-ia64.c $(INCDIR)/filenames.h coff-ia64.c \
+ $(INCDIR)/hashtab.h $(INCDIR)/coff/ia64.h $(INCDIR)/coff/external.h \
+ $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
+ $(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.h
elf64-x86-64.lo: elf64-x86-64.c $(INCDIR)/filenames.h \
$(INCDIR)/bfdlink.h $(INCDIR)/hashtab.h elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h bfd_stdint.h \
@@ -1932,6 +1923,16 @@ elf64-s390.lo: elf64-s390.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \
$(INCDIR)/hashtab.h elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/s390.h \
$(INCDIR)/elf/reloc-macros.h elf64-target.h
+elf32-score.lo: elf32-score.c $(INCDIR)/filenames.h \
+ $(INCDIR)/hashtab.h $(INCDIR)/libiberty.h elf-bfd.h \
+ $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h \
+ $(INCDIR)/bfdlink.h $(INCDIR)/elf/score.h $(INCDIR)/elf/reloc-macros.h \
+ elf32-score.h elf32-target.h
+elf32-score7.lo: elf32-score7.c $(INCDIR)/filenames.h \
+ $(INCDIR)/hashtab.h $(INCDIR)/libiberty.h elf-bfd.h \
+ $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h \
+ $(INCDIR)/bfdlink.h $(INCDIR)/elf/score.h $(INCDIR)/elf/reloc-macros.h \
+ elf32-score.h
elf64-sh64.lo: elf64-sh64.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \
$(INCDIR)/hashtab.h elf-bfd.h $(INCDIR)/elf/common.h \
$(INCDIR)/elf/external.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/sh.h \
@@ -1964,11 +1965,10 @@ pe-x86_64.lo: pe-x86_64.c $(INCDIR)/filenames.h coff-x86_64.c \
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
$(INCDIR)/bfdlink.h $(INCDIR)/libiberty.h coffcode.h \
peicode.h libpei.h
-pei-x86_64.lo: pei-x86_64.c $(INCDIR)/filenames.h coff-x86_64.c \
- $(INCDIR)/hashtab.h $(INCDIR)/coff/x86_64.h $(INCDIR)/coff/external.h \
- $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
- $(INCDIR)/bfdlink.h $(INCDIR)/libiberty.h coffcode.h \
- peicode.h libpei.h
+pei-x86_64.lo: pei-x86_64.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
+ $(INCDIR)/coff/x86_64.h $(INCDIR)/coff/external.h $(INCDIR)/coff/internal.h \
+ $(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h \
+ $(INCDIR)/libiberty.h coff-x86_64.c coffcode.h peicode.h
aix386-core.lo: aix386-core.c $(INCDIR)/filenames.h \
$(INCDIR)/hashtab.h $(INCDIR)/coff/i386.h $(INCDIR)/coff/external.h \
$(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h
@@ -1985,12 +1985,12 @@ elf32-ia64.lo: elf32-ia64.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h $(INCDIR)/opcode/ia64.h \
$(INCDIR)/elf/ia64.h $(INCDIR)/elf/reloc-macros.h $(INCDIR)/objalloc.h \
- elf32-target.h
+ $(INCDIR)/hashtab.h elf32-target.h
elf64-ia64.lo: elf64-ia64.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h $(INCDIR)/opcode/ia64.h \
$(INCDIR)/elf/ia64.h $(INCDIR)/elf/reloc-macros.h $(INCDIR)/objalloc.h \
- elf64-target.h
+ $(INCDIR)/hashtab.h elf64-target.h
peigen.lo: peigen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/coff/internal.h $(INCDIR)/coff/i386.h $(INCDIR)/coff/external.h \
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h libpei.h
diff --git a/bfd/Makefile.am b/bfd/Makefile.am
index 8635498..5c638ad 100644
--- a/bfd/Makefile.am
+++ b/bfd/Makefile.am
@@ -26,6 +26,10 @@ bfdlib_LTLIBRARIES = libbfd.la
WARN_CFLAGS = @WARN_CFLAGS@
NO_WERROR = @NO_WERROR@
AM_CFLAGS = $(WARN_CFLAGS)
+AM_CPPFLAGS = -DBINDIR='"$(bindir)"'
+if PLUGINS
+LIBDL = -ldl
+endif
# bfd.h goes here, for now
BFD_H = bfd.h
@@ -106,6 +110,7 @@ ALL_MACHINES = \
cpu-openrisc.lo \
cpu-pdp11.lo \
cpu-pj.lo \
+ cpu-plugin.lo \
cpu-powerpc.lo \
cpu-rs6000.lo \
cpu-s390.lo \
@@ -174,6 +179,7 @@ ALL_MACHINES_CFILES = \
cpu-openrisc.c \
cpu-pdp11.c \
cpu-pj.c \
+ cpu-plugin.c \
cpu-powerpc.c \
cpu-rs6000.c \
cpu-s390.c \
@@ -355,6 +361,7 @@ BFD32_BACKENDS = \
pe-mips.lo \
pei-mips.lo \
peigen.lo \
+ plugin.lo \
ppcboot.lo \
reloc16.lo \
riscix.lo \
@@ -534,6 +541,7 @@ BFD32_BACKENDS_CFILES = \
pei-sh.c \
pe-mips.c \
pei-mips.c \
+ plugin.c \
ppcboot.c \
reloc16.c \
riscix.c \
@@ -789,7 +797,7 @@ ofiles: stamp-ofiles ; @true
# libbfd_la_SOURCES, we put BFD64_LIBS in OFILES instead.
libbfd_la_SOURCES = $(BFD32_LIBS_CFILES)
libbfd_la_DEPENDENCIES = $(OFILES) ofiles
-libbfd_la_LIBADD = `cat ofiles` @SHARED_LIBADD@
+libbfd_la_LIBADD = `cat ofiles` @SHARED_LIBADD@ $(LIBDL)
libbfd_la_LDFLAGS = -release `cat libtool-soversion` @SHARED_LDFLAGS@
# libtool will build .libs/libbfd.a. We create libbfd.a in the build
@@ -1148,6 +1156,7 @@ cpu-openrisc.lo: cpu-openrisc.c $(INCDIR)/filenames.h \
$(INCDIR)/hashtab.h
cpu-pdp11.lo: cpu-pdp11.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-pj.lo: cpu-pj.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
+cpu-plugin.lo: cpu-plugin.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-powerpc.lo: cpu-powerpc.c $(INCDIR)/filenames.h \
$(INCDIR)/hashtab.h
cpu-rs6000.lo: cpu-rs6000.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
@@ -1797,6 +1806,8 @@ pei-mips.lo: pei-mips.c $(INCDIR)/filenames.h pe-mips.c \
$(INCDIR)/hashtab.h $(INCDIR)/coff/mipspe.h $(INCDIR)/coff/external.h \
$(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \
$(INCDIR)/bfdlink.h coffcode.h peicode.h libpei.h
+plugin.lo: plugin.c $(INCDIR)/plugin-api.h $(INCDIR)/filenames.h \
+ plugin.h $(INCDIR)/hashtab.h $(INCDIR)/libiberty.h
ppcboot.lo: ppcboot.c $(INCDIR)/filenames.h $(INCDIR)/safe-ctype.h \
$(INCDIR)/hashtab.h
reloc16.lo: reloc16.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
diff --git a/bfd/archures.c b/bfd/archures.c
index 0a78542..9e84b88 100644
--- a/bfd/archures.c
+++ b/bfd/archures.c
@@ -204,6 +204,7 @@ DESCRIPTION
.#define bfd_mach_h8300sx 6
.#define bfd_mach_h8300sxn 7
. bfd_arch_pdp11, {* DEC PDP-11 *}
+. bfd_arch_plugin,
. bfd_arch_powerpc, {* PowerPC *}
.#define bfd_mach_ppc 32
.#define bfd_mach_ppc64 64
@@ -501,6 +502,7 @@ extern const bfd_arch_info_type bfd_openrisc_arch;
extern const bfd_arch_info_type bfd_or32_arch;
extern const bfd_arch_info_type bfd_pdp11_arch;
extern const bfd_arch_info_type bfd_pj_arch;
+extern const bfd_arch_info_type bfd_plugin_arch;
extern const bfd_arch_info_type bfd_powerpc_archs[];
#define bfd_powerpc_arch bfd_powerpc_archs[0]
extern const bfd_arch_info_type bfd_rs6000_arch;
diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
index 9a303e0..c0a5c8e 100644
--- a/bfd/bfd-in.h
+++ b/bfd/bfd-in.h
@@ -66,6 +66,8 @@ extern "C" {
#define LITSTRCPY(DEST,STR2) memcpy ((DEST), (STR2), sizeof (STR2))
+#define BFD_SUPPORTS_PLUGINS @supports_plugins@
+
/* The word size used by BFD on the host. This may be 64 with a 32
bit target if the host is 64 bit, or if other 64 bit targets have
been selected with --enable-targets, or if --enable-64-bit-bfd. */
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 3be7a63..4a1b5ca 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -241,6 +241,7 @@ CODE_FRAGMENT
. struct netbsd_core_struct *netbsd_core_data;
. struct mach_o_data_struct *mach_o_data;
. struct mach_o_fat_data_struct *mach_o_fat_data;
+. struct plugin_data_struct *plugin_data;
. struct bfd_pef_data_struct *pef_data;
. struct bfd_pef_xlib_data_struct *pef_xlib_data;
. struct bfd_sym_data_struct *sym_data;
diff --git a/bfd/config.bfd b/bfd/config.bfd
index 56894ad..545d848 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -137,6 +137,11 @@ case "${targ}" in
exit 1
;;
+ plugin)
+ targ_defvec=plugin_vec
+ targ_selvecs="plugin_vec"
+ ;;
+
# START OF targmatch.h
#ifdef BFD64
alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
diff --git a/bfd/configure.in b/bfd/configure.in
index 81255dd..c7dd581 100644
--- a/bfd/configure.in
+++ b/bfd/configure.in
@@ -23,6 +23,27 @@ AC_PROG_CC
AC_GNU_SOURCE
AC_USE_SYSTEM_EXTENSIONS
+LT_INIT([dlopen])
+
+AC_ARG_ENABLE([plugins],
+AS_HELP_STRING([--enable-plugins], [linker plugins (defaults no)]),
+[case "${enableval}" in
+ yes | "") plugins=yes ;;
+ no) plugins=no ;;
+ *) plugins=yes ;;
+ esac],
+[plugins=no])
+
+AM_CONDITIONAL(PLUGINS, test "$plugins" = "yes")
+
+if test "$plugins" = "yes"; then
+ if test "$enable_dlopen" != "yes" ; then
+ AC_MSG_ERROR([
+ Building BFD with plugin support requires a host that supports -ldl.])
+ fi
+ enable_targets="$enable_targets plugin"
+fi
+
case "${target}" in
changequote(,)dnl
sparc-*-solaris*|i[3-7]86-*-solaris*)
@@ -34,15 +55,15 @@ changequote([,])dnl
# large-file support through the --enable-largefile switch, disable
# large-file support in favor of procfs support.
if test "${target}" = "${host}" -a "$enable_largefile" != 'yes'; then
- enable_largefile="no"
+ if test "$plugins" = "no"; then
+ enable_largefile="no"
+ fi
fi
;;
esac
AC_SYS_LARGEFILE
-LT_INIT
-
AC_ARG_ENABLE(64-bit-bfd,
[ --enable-64-bit-bfd 64-bit support (on hosts with narrower word sizes)],
[case "${enableval}" in
@@ -871,6 +892,7 @@ do
pef_vec) tb="$tb pef.lo" ;;
pef_xlib_vec) tb="$tb pef.lo" ;;
pdp11_aout_vec) tb="$tb pdp11.lo" ;;
+ plugin_vec) tb="$tb plugin.lo" ;;
pmac_xcoff_vec) tb="$tb coff-rs6000.lo xcofflink.lo" ;;
ppcboot_vec) tb="$tb ppcboot.lo" ;;
riscix_vec) tb="$tb aout32.lo riscix.lo" ;;
@@ -1018,6 +1040,13 @@ AC_SUBST(bfd_backends)
AC_SUBST(bfd_machines)
AC_SUBST(bfd_default_target_size)
+if test "$plugins" = "yes"; then
+ supports_plugins=1
+else
+ supports_plugins=0
+fi
+AC_SUBST(supports_plugins)
+
# Determine the host dependant file_ptr a.k.a. off_t type. In order
# prefer: off64_t - if ftello64 and fseeko64, off_t - if ftello and
# fseeko, long. This assumes that sizeof off_t is .ge. sizeof long.
diff --git a/bfd/cpu-plugin.c b/bfd/cpu-plugin.c
new file mode 100644
index 0000000..7a2169c
--- /dev/null
+++ b/bfd/cpu-plugin.c
@@ -0,0 +1,40 @@
+/* BFD support for plugins.
+ Copyright 2009
+ Free Software Foundation, Inc.
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+#include "sysdep.h"
+#include "bfd.h"
+#include "libbfd.h"
+
+const bfd_arch_info_type bfd_plugin_arch =
+{
+ 32, /* 32 bits in a word */
+ 32, /* 32 bits in an address */
+ 8, /* 8 bits in a byte */
+ bfd_arch_plugin,
+ 0, /* only 1 machine */
+ "plugin",
+ "plugin",
+ 3,
+ TRUE,
+ bfd_default_compatible,
+ bfd_default_scan,
+ 0
+};
diff --git a/bfd/plugin.c b/bfd/plugin.c
new file mode 100644
index 0000000..1a7c976
--- /dev/null
+++ b/bfd/plugin.c
@@ -0,0 +1,489 @@
+/* Plugin support for BFD.
+ Copyright 2009
+ Free Software Foundation, Inc.
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+#include "config.h"
+#include <assert.h>
+#include <dlfcn.h>
+#include <stdarg.h>
+#include "plugin-api.h"
+#include "sysdep.h"
+#include "plugin.h"
+#include "libbfd.h"
+#include "libiberty.h"
+#include <dirent.h>
+
+#define bfd_plugin_close_and_cleanup _bfd_generic_close_and_cleanup
+#define bfd_plugin_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
+#define bfd_plugin_new_section_hook _bfd_generic_new_section_hook
+#define bfd_plugin_get_section_contents _bfd_generic_get_section_contents
+#define bfd_plugin_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
+#define bfd_plugin_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
+#define bfd_plugin_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
+#define bfd_plugin_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
+#define bfd_plugin_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
+#define bfd_plugin_core_file_matches_executable_p generic_core_file_matches_executable_p
+#define bfd_plugin_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
+#define bfd_plugin_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
+#define bfd_plugin_get_lineno _bfd_nosymbols_get_lineno
+#define bfd_plugin_find_nearest_line _bfd_nosymbols_find_nearest_line
+#define bfd_plugin_find_inliner_info _bfd_nosymbols_find_inliner_info
+#define bfd_plugin_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
+#define bfd_plugin_read_minisymbols _bfd_generic_read_minisymbols
+#define bfd_plugin_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
+#define bfd_plugin_set_arch_mach bfd_default_set_arch_mach
+#define bfd_plugin_set_section_contents _bfd_generic_set_section_contents
+#define bfd_plugin_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
+#define bfd_plugin_bfd_relax_section bfd_generic_relax_section
+#define bfd_plugin_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
+#define bfd_plugin_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
+#define bfd_plugin_bfd_link_add_symbols _bfd_generic_link_add_symbols
+#define bfd_plugin_bfd_link_just_syms _bfd_generic_link_just_syms
+#define bfd_plugin_bfd_final_link _bfd_generic_final_link
+#define bfd_plugin_bfd_link_split_section _bfd_generic_link_split_section
+#define bfd_plugin_bfd_gc_sections bfd_generic_gc_sections
+#define bfd_plugin_bfd_merge_sections bfd_generic_merge_sections
+#define bfd_plugin_bfd_is_group_section bfd_generic_is_group_section
+#define bfd_plugin_bfd_discard_group bfd_generic_discard_group
+#define bfd_plugin_section_already_linked _bfd_generic_section_already_linked
+#define bfd_plugin_bfd_define_common_symbol bfd_generic_define_common_symbol
+
+static enum ld_plugin_status
+message (int level ATTRIBUTE_UNUSED,
+ const char * format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ printf ("bfd plugin: ");
+ vprintf (format, args);
+ va_end (args);
+ return LDPS_OK;
+}
+
+/* Register a claim-file handler. */
+static ld_plugin_claim_file_handler claim_file;
+
+static enum ld_plugin_status
+register_claim_file (ld_plugin_claim_file_handler handler)
+{
+ claim_file = handler;
+ return LDPS_OK;
+}
+
+static enum ld_plugin_status
+add_symbols (void* handle, int nsyms,
+ const struct ld_plugin_symbol *syms)
+{
+ bfd *abfd = handle;
+ struct plugin_data_struct *plugin_data =
+ bfd_alloc (abfd, sizeof (plugin_data_struct));;
+
+ plugin_data->nsyms = nsyms;
+ plugin_data->syms = syms;
+
+ if (nsyms != 0)
+ abfd->flags |= HAS_SYMS;
+
+ abfd->tdata.plugin_data = plugin_data;
+ return LDPS_OK;
+}
+
+extern char *program_name __attribute__ ((weak));
+
+static int
+try_load_plugin (const char *pname)
+{
+ static void *plugin_handle;
+ int tv_size = 4;
+ struct ld_plugin_tv tv[tv_size];
+ int i;
+ ld_plugin_onload onload;
+ enum ld_plugin_status status;
+
+ plugin_handle = dlopen (pname, RTLD_NOW);
+ if (!plugin_handle)
+ {
+ (*_bfd_error_handler)
+ ("%s\n", dlerror());
+ return 0;
+ }
+
+ onload = dlsym (plugin_handle, "onload");
+ if (!onload)
+ goto err;
+
+ i = 0;
+ tv[i].tv_tag = LDPT_MESSAGE;
+ tv[i].tv_u.tv_message = message;
+
+ ++i;
+ tv[i].tv_tag = LDPT_REGISTER_CLAIM_FILE_HOOK;
+ tv[i].tv_u.tv_register_claim_file = register_claim_file;
+
+ ++i;
+ tv[i].tv_tag = LDPT_ADD_SYMBOLS;
+ tv[i].tv_u.tv_add_symbols = add_symbols;
+
+ ++i;
+ tv[i].tv_tag = LDPT_NULL;
+ tv[i].tv_u.tv_val = 0;
+
+ status = (*onload)(tv);
+
+ if (status != LDPS_OK)
+ goto err;
+
+ if (!claim_file)
+ goto err;
+
+ return 1;
+
+ err:
+ plugin_handle = NULL;
+ return 0;
+}
+
+static const char *plugin_name;
+
+void
+bfd_plugin_set_plugin (const char *p)
+{
+ plugin_name = p;
+}
+
+static int
+load_plugin (void)
+{
+ char *plugin_dir;
+ char *p;
+ DIR *d;
+ struct dirent *ent;
+ int found = 0;
+
+ if (plugin_name)
+ return try_load_plugin (plugin_name);
+
+ if (!program_name)
+ return 0;
+
+ plugin_dir = concat (BINDIR, "/../lib/bfd-plugins", NULL);
+ p = make_relative_prefix (program_name,
+ BINDIR,
+ plugin_dir);
+ free (plugin_dir);
+ plugin_dir = NULL;
+
+ d = opendir (p);
+ if (!d)
+ goto out;
+
+ while ((ent = readdir (d)))
+ {
+ char *full_name;
+ if (ent->d_type != DT_REG && ent->d_type != DT_LNK)
+ continue;
+
+ full_name = concat (p, "/", ent->d_name, NULL);
+ found = try_load_plugin (full_name);
+ free (full_name);
+ if (found)
+ break;
+ }
+
+ out:
+ free (p);
+ if (d)
+ closedir (d);
+
+ return found;
+}
+
+
+static const bfd_target *
+bfd_plugin_object_p (bfd *abfd)
+{
+ int claimed = 0;
+ int t = load_plugin ();
+ struct ld_plugin_input_file file;
+ if (!t)
+ return NULL;
+
+ file.name = abfd->filename;
+
+ if (abfd->iostream)
+ {
+ file.fd = fileno (abfd->iostream);
+ file.offset = 0;
+ file.filesize = 0; /*FIXME*/
+ }
+ else
+ {
+ bfd *archive = abfd->my_archive;
+ BFD_ASSERT (archive);
+ file.fd = fileno (archive->iostream);
+ file.offset = abfd->origin;
+ file.filesize = arelt_size (abfd);
+
+ }
+ file.handle = abfd;
+ claim_file (&file, &claimed);
+ if (!claimed)
+ return NULL;
+
+ return abfd->xvec;
+}
+
+/* Copy any private info we understand from the input bfd
+ to the output bfd. */
+
+static bfd_boolean
+bfd_plugin_bfd_copy_private_bfd_data (bfd *ibfd ATTRIBUTE_UNUSED,
+ bfd *obfd ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+ return TRUE;
+}
+
+/* Copy any private info we understand from the input section
+ to the output section. */
+
+static bfd_boolean
+bfd_plugin_bfd_copy_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
+ asection *isection ATTRIBUTE_UNUSED,
+ bfd *obfd ATTRIBUTE_UNUSED,
+ asection *osection ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+ return TRUE;
+}
+
+/* Copy any private info we understand from the input symbol
+ to the output symbol. */
+
+static bfd_boolean
+bfd_plugin_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
+ asymbol *isymbol ATTRIBUTE_UNUSED,
+ bfd *obfd ATTRIBUTE_UNUSED,
+ asymbol *osymbol ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+ return TRUE;
+}
+
+static bfd_boolean
+bfd_plugin_bfd_print_private_bfd_data (bfd *abfd ATTRIBUTE_UNUSED, PTR ptr ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+ return TRUE;
+}
+
+static char *
+bfd_plugin_core_file_failing_command (bfd *abfd ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+ return NULL;
+}
+
+static int
+bfd_plugin_core_file_failing_signal (bfd *abfd ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+ return 0;
+}
+
+static long
+bfd_plugin_get_symtab_upper_bound (bfd *abfd)
+{
+ struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
+ long nsyms = plugin_data->nsyms;
+
+ BFD_ASSERT (nsyms >= 0);
+
+ return ((nsyms + 1) * sizeof (asymbol *));
+}
+
+static flagword
+convert_flags (const struct ld_plugin_symbol *sym)
+{
+ switch (sym->def)
+ {
+ case LDPK_DEF:
+ case LDPK_COMMON:
+ case LDPK_UNDEF:
+ return BSF_GLOBAL;
+
+ case LDPK_WEAKUNDEF:
+ case LDPK_WEAKDEF:
+ return BSF_GLOBAL | BSF_WEAK;
+
+ default:
+ BFD_ASSERT (0);
+ return 0;
+ }
+}
+
+static long
+bfd_plugin_canonicalize_symtab (bfd *abfd,
+ asymbol **alocation)
+{
+ struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data;
+ long nsyms = plugin_data->nsyms;
+ const struct ld_plugin_symbol *syms = plugin_data->syms;
+ static asection fake_section;
+ static asection fake_common_section;
+ int i;
+
+ fake_section.name = ".text";
+ fake_common_section.flags = SEC_IS_COMMON;
+
+ for (i = 0; i < nsyms; i++)
+ {
+ asymbol *s = bfd_alloc (abfd, sizeof (asymbol));
+
+ BFD_ASSERT (s);
+ alocation[i] = s;
+
+ s->the_bfd = abfd;
+ s->name = syms[i].name;
+ s->value = 0;
+ s->flags = convert_flags (&syms[i]);
+ switch (syms[i].def)
+ {
+ case LDPK_COMMON:
+ s->section = &fake_common_section;
+ break;
+ case LDPK_UNDEF:
+ case LDPK_WEAKUNDEF:
+ s->section = bfd_und_section_ptr;
+ break;
+ case LDPK_DEF:
+ case LDPK_WEAKDEF:
+ s->section = &fake_section;
+ break;
+ default:
+ BFD_ASSERT (0);
+ }
+
+ s->udata.p = (void *) &syms[i];
+ }
+
+ return nsyms;
+}
+
+static void
+bfd_plugin_print_symbol (bfd *abfd ATTRIBUTE_UNUSED,
+ PTR afile ATTRIBUTE_UNUSED,
+ asymbol *symbol ATTRIBUTE_UNUSED,
+ bfd_print_symbol_type how ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+}
+
+static void
+bfd_plugin_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
+ asymbol *symbol,
+ symbol_info *ret)
+{
+ bfd_symbol_info (symbol, ret);
+}
+
+/* Make an empty symbol. */
+
+static asymbol *
+bfd_plugin_make_empty_symbol (bfd *abfd)
+{
+ asymbol *new = bfd_zalloc (abfd, sizeof (asymbol));
+ if (new == NULL)
+ return new;
+ new->the_bfd = abfd;
+ return new;
+}
+
+static int
+bfd_plugin_sizeof_headers (bfd *a ATTRIBUTE_UNUSED,
+ struct bfd_link_info *info ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+ return 0;
+}
+
+static bfd_boolean
+bfd_plugin_mkobject (bfd *abfd ATTRIBUTE_UNUSED)
+{
+ BFD_ASSERT (0);
+ return 0;
+}
+
+const bfd_target plugin_vec =
+{
+ "plugin", /* Name. */
+ bfd_target_unknown_flavour,
+ BFD_ENDIAN_LITTLE, /* Target byte order. */
+ BFD_ENDIAN_LITTLE, /* Target headers byte order. */
+ (HAS_RELOC | EXEC_P | /* Object flags. */
+ HAS_LINENO | HAS_DEBUG |
+ HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
+ (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
+ | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
+ 0, /* symbol_leading_char. */
+ '/', /* ar_pad_char. */
+ 15, /* ar_max_namelen. */
+
+ bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+ bfd_getl32, bfd_getl_signed_32, bfd_putl32,
+ bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
+ bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+ bfd_getl32, bfd_getl_signed_32, bfd_putl32,
+ bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
+
+ { /* bfd_check_format. */
+ _bfd_dummy_target,
+ bfd_plugin_object_p,
+ bfd_generic_archive_p,
+ _bfd_dummy_target
+ },
+ { /* bfd_set_format. */
+ bfd_false,
+ bfd_plugin_mkobject,
+ _bfd_generic_mkarchive,
+ bfd_false,
+ },
+ { /* bfd_write_contents. */
+ bfd_false,
+ bfd_false,
+ _bfd_write_archive_contents,
+ bfd_false,
+ },
+
+ BFD_JUMP_TABLE_GENERIC (bfd_plugin),
+ BFD_JUMP_TABLE_COPY (bfd_plugin),
+ BFD_JUMP_TABLE_CORE (bfd_plugin),
+ BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
+ BFD_JUMP_TABLE_SYMBOLS (bfd_plugin),
+ BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
+ BFD_JUMP_TABLE_WRITE (bfd_plugin),
+ BFD_JUMP_TABLE_LINK (bfd_plugin),
+ BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+
+ NULL,
+
+ /* backend_data: */
+ NULL
+};
diff --git a/bfd/plugin.h b/bfd/plugin.h
new file mode 100644
index 0000000..2654042
--- /dev/null
+++ b/bfd/plugin.h
@@ -0,0 +1,36 @@
+/* Plugin support for BFD.
+ Copyright 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008
+ Free Software Foundation, Inc.
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+#ifndef _PLUGIN_H_
+#define _PLUGIN_H_
+
+#include "bfd.h"
+
+void bfd_plugin_set_plugin (const char *p);
+
+typedef struct plugin_data_struct
+{
+ int nsyms;
+ const struct ld_plugin_symbol *syms;
+}
+plugin_data_struct;
+
+#endif
diff --git a/bfd/targets.c b/bfd/targets.c
index 57a400d..6ec6a6c 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -766,6 +766,7 @@ extern const bfd_target pc532netbsd_vec;
extern const bfd_target pdp11_aout_vec;
extern const bfd_target pef_vec;
extern const bfd_target pef_xlib_vec;
+extern const bfd_target plugin_vec;
extern const bfd_target pmac_xcoff_vec;
extern const bfd_target ppcboot_vec;
extern const bfd_target riscix_vec;
@@ -1144,6 +1145,7 @@ static const bfd_target * const _bfd_target_vector[] =
&pdp11_aout_vec,
&pef_vec,
&pef_xlib_vec,
+ &plugin_vec,
#if 0
/* This has the same magic number as RS/6000. */
&pmac_xcoff_vec,
diff --git a/binutils/ar.c b/binutils/ar.c
index 73ab1d4..345beb7 100644
--- a/binutils/ar.c
+++ b/binutils/ar.c
@@ -37,6 +37,7 @@
#include "arsup.h"
#include "filenames.h"
#include "binemul.h"
+#include "plugin.h"
#include <sys/stat.h>
#ifdef __GO32___
@@ -480,6 +481,19 @@ main (int argc, char **argv)
arg_index = 1;
arg_ptr = argv[arg_index];
+#if BFD_SUPPORTS_PLUGINS
+ if (strcmp (arg_ptr, "--plugin") == 0)
+ {
+ if (argc < 4)
+ usage (1);
+
+ bfd_plugin_set_plugin (argv[2]);
+
+ arg_index += 2;
+ arg_ptr = argv[arg_index];
+ }
+#endif
+
if (*arg_ptr == '-')
{
/* When the first option starts with '-' we support POSIX-compatible
diff --git a/binutils/configure.in b/binutils/configure.in
index e35b169..3fdb349 100644
--- a/binutils/configure.in
+++ b/binutils/configure.in
@@ -16,6 +16,15 @@ AC_PROG_CC
AC_GNU_SOURCE
AC_USE_SYSTEM_EXTENSIONS
+AC_ARG_ENABLE([plugins],
+AS_HELP_STRING([--enable-plugins], [linker plugins (defaults no)]),
+[case "${enableval}" in
+ yes | "") plugins=yes ;;
+ no) plugins=no ;;
+ *) plugins=yes ;;
+ esac],
+[plugins=no])
+
case "${target}" in
changequote(,)dnl
sparc-*-solaris*|i[3-7]86-*-solaris*)
@@ -25,7 +34,9 @@ changequote([,])dnl
# configure script so that the utilities in this directory agree
# on the size of structures used to describe files.
if test "${target}" = "${host}" -a "$enable_largefile" != 'yes'; then
- enable_largefile="no"
+ if test "$plugins" = "no"; then
+ enable_largefile="no"
+ fi
fi
;;
esac
diff --git a/binutils/nm.c b/binutils/nm.c
index e11568a..030f083 100644
--- a/binutils/nm.c
+++ b/binutils/nm.c
@@ -31,6 +31,7 @@
#include "elf-bfd.h"
#include "elf/common.h"
#include "bucomm.h"
+#include "plugin.h"
/* When sorting by size, we use this structure to hold the size and a
pointer to the minisymbol. */
@@ -178,6 +179,7 @@ static bfd *lineno_cache_bfd;
static bfd *lineno_cache_rel_bfd;
#define OPTION_TARGET 200
+#define OPTION_PLUGIN 201
static struct option long_options[] =
{
@@ -192,6 +194,9 @@ static struct option long_options[] =
{"no-demangle", no_argument, &do_demangle, 0},
{"no-sort", no_argument, &no_sort, 1},
{"numeric-sort", no_argument, &sort_numerically, 1},
+#if BFD_SUPPORTS_PLUGINS
+ {"plugin", required_argument, 0, OPTION_PLUGIN},
+#endif
{"portability", no_argument, 0, 'P'},
{"print-armap", no_argument, &print_armap, 1},
{"print-file-name", no_argument, 0, 'o'},
@@ -1608,6 +1613,12 @@ main (int argc, char **argv)
target = optarg;
break;
+#if BFD_SUPPORTS_PLUGINS
+ case OPTION_PLUGIN: /* --plugin */
+ bfd_plugin_set_plugin (optarg);
+ break;
+#endif
+
case 0: /* A long option that just sets a flag. */
break;