Author: bdubbs
Date: Tue Nov 11 13:39:49 2014
New Revision: 3053
Log:
Add new binutils patch
Added:
trunk/binutils/binutils-2.24-multiple_plugins-1.patch
Added: trunk/binutils/binutils-2.24-multiple_plugins-1.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/binutils/binutils-2.24-multiple_plugins-1.patch Tue Nov 11
13:39:49 2014 (r3053)
@@ -0,0 +1,160 @@
+Submitted By: Miklos Karacsony <mkaracsony81 at gmail dot com>
+Date: 2014-11-06
+Initial Package Version: 2.24
+Upstream Status: Applied
+Origin: Upstream
+Description: Handle more than one plugin in /usr/lib/bfd-plugins
+
+diff --git a/bfd/plugin.c b/bfd/plugin.c
+index c9d53c89a61f..d336b6731116 100644
+--- a/bfd/plugin.c
++++ b/bfd/plugin.c
+@@ -156,9 +156,54 @@ bfd_plugin_set_program_name (const char *program_name)
+ }
+
+ static int
+-try_load_plugin (const char *pname)
++try_claim (bfd *abfd)
+ {
+- static void *plugin_handle;
++ int claimed = 0;
++ struct ld_plugin_input_file file;
++ bfd *iobfd;
++
++ file.name = abfd->filename;
++
++ if (abfd->my_archive)
++ {
++ iobfd = abfd->my_archive;
++ file.offset = abfd->origin;
++ file.filesize = arelt_size (abfd);
++ }
++ else
++ {
++ iobfd = abfd;
++ file.offset = 0;
++ file.filesize = 0;
++ }
++
++ if (!iobfd->iostream && !bfd_open_file (iobfd))
++ return 0;
++
++ file.fd = fileno ((FILE *) iobfd->iostream);
++
++ if (!abfd->my_archive)
++ {
++ struct stat stat_buf;
++ if (fstat (file.fd, &stat_buf))
++ return 0;
++ file.filesize = stat_buf.st_size;
++ }
++
++ file.handle = abfd;
++ off_t cur_offset = lseek(file.fd, 0, SEEK_CUR);
++ claim_file (&file, &claimed);
++ lseek(file.fd, cur_offset, SEEK_SET);
++ if (!claimed)
++ return 0;
++
++ return 1;
++}
++
++static int
++try_load_plugin (const char *pname, bfd *abfd)
++{
++ void *plugin_handle;
+ int tv_size = 4;
+ struct ld_plugin_tv tv[tv_size];
+ int i;
+@@ -200,6 +245,9 @@ try_load_plugin (const char *pname)
+ if (!claim_file)
+ goto err;
+
++ if (!try_claim (abfd))
++ goto err;
++
+ return 1;
+
+ err:
+@@ -216,7 +264,7 @@ bfd_plugin_set_plugin (const char *p)
+ }
+
+ static int
+-load_plugin (void)
++load_plugin (bfd *abfd)
+ {
+ char *plugin_dir;
+ char *p;
+@@ -225,7 +273,7 @@ load_plugin (void)
+ int found = 0;
+
+ if (plugin_name)
+- return try_load_plugin (plugin_name);
++ return try_load_plugin (plugin_name, abfd);
+
+ if (plugin_program_name == NULL)
+ return 0;
+@@ -248,7 +296,7 @@ load_plugin (void)
+
+ 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);
++ found = try_load_plugin (full_name, abfd);
+ free (full_name);
+ if (found)
+ break;
+@@ -266,53 +314,7 @@ load_plugin (void)
+ static const bfd_target *
+ bfd_plugin_object_p (bfd *abfd)
+ {
+- int claimed = 0;
+- struct ld_plugin_input_file file;
+- bfd *iobfd;
+- static int have_loaded = 0;
+- static int have_plugin = 0;
+-
+- if (!have_loaded)
+- {
+- have_loaded = 1;
+- have_plugin = load_plugin ();
+- }
+- if (!have_plugin)
+- return NULL;
+-
+- file.name = abfd->filename;
+-
+- if (abfd->my_archive)
+- {
+- iobfd = abfd->my_archive;
+- file.offset = abfd->origin;
+- file.filesize = arelt_size (abfd);
+- }
+- else
+- {
+- iobfd = abfd;
+- file.offset = 0;
+- file.filesize = 0;
+- }
+-
+- if (!iobfd->iostream && !bfd_open_file (iobfd))
+- return NULL;
+-
+- file.fd = fileno ((FILE *) iobfd->iostream);
+-
+- if (!abfd->my_archive)
+- {
+- struct stat stat_buf;
+- if (fstat (file.fd, &stat_buf))
+- return NULL;
+- file.filesize = stat_buf.st_size;
+- }
+-
+- file.handle = abfd;
+- off_t cur_offset = lseek(file.fd, 0, SEEK_CUR);
+- claim_file (&file, &claimed);
+- lseek(file.fd, cur_offset, SEEK_SET);
+- if (!claimed)
++ if (!load_plugin (abfd))
+ return NULL;
+
+ return abfd->xvec;
--
http://lists.linuxfromscratch.org/listinfo/patches
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page