This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Add plugin support for bfd


> 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;
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]