diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 8 | ||||
-rw-r--r-- | ld/ldlang.c | 7 | ||||
-rw-r--r-- | ld/plugin.c | 32 |
3 files changed, 31 insertions, 16 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index f842a82..ce8a034 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2011-08-17 Alan Modra <amodra@gmail.com> + + PR ld/12762 + * ldlang.c (section_already_linked): Revert 2011-07-09 changes. + * plugin.c: Likewise. + (asymbol_from_plugin_symbol): Create linkonce section for syms + with comdat_key. + 2011-08-09 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> * emultempl/armelf.em (fix_arm1176): New variable. diff --git a/ld/ldlang.c b/ld/ldlang.c index 0ffafb6..5b548d0 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2240,12 +2240,7 @@ section_already_linked (bfd *abfd, asection *sec, void *data) } if (!(abfd->flags & DYNAMIC)) - { - struct already_linked linked; - linked.comdat_key = NULL; - linked.u.sec = sec; - bfd_section_already_linked (abfd, &linked, &link_info); - } + bfd_section_already_linked (abfd, sec, &link_info); } /* The wild routines. diff --git a/ld/plugin.c b/ld/plugin.c index 9baeb46..0be7fa3a 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -32,7 +32,6 @@ #include "plugin.h" #include "plugin-api.h" #include "elf-bfd.h" -#include "libbfd.h" #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) #include <windows.h> #endif @@ -240,7 +239,7 @@ plugin_get_ir_dummy_bfd (const char *name, bfd *srctemplate) { flagword flags; - /* Create sections to own the symbols. */ + /* Create section to own the symbols. */ flags = (SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_EXCLUDE); if (bfd_make_section_anyway_with_flags (abfd, ".text", flags)) @@ -285,7 +284,27 @@ asymbol_from_plugin_symbol (bfd *abfd, asymbol *asym, /* FALLTHRU */ case LDPK_DEF: flags |= BSF_GLOBAL; - section = bfd_get_section_by_name (abfd, ".text"); + if (ldsym->comdat_key) + { + char *name = concat (".gnu.linkonce.t.", ldsym->comdat_key, + (const char *) NULL); + section = bfd_get_section_by_name (abfd, name); + if (section != NULL) + free (name); + else + { + flagword sflags; + + sflags = (SEC_CODE | SEC_HAS_CONTENTS | SEC_READONLY + | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_EXCLUDE + | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD); + section = bfd_make_section_anyway_with_flags (abfd, name, sflags); + if (section == NULL) + return LDPS_ERR; + } + } + else + section = bfd_get_section_by_name (abfd, ".text"); break; case LDPK_WEAKUNDEF: @@ -389,13 +408,6 @@ add_symbols (void *handle, int nsyms, const struct ld_plugin_symbol *syms) enum ld_plugin_status rv; asymbol *bfdsym; - if (syms[n].comdat_key) - { - struct already_linked linked; - linked.comdat_key = xstrdup (syms[n].comdat_key); - linked.u.abfd = abfd; - bfd_section_already_linked (abfd, &linked, &link_info); - } bfdsym = bfd_make_empty_symbol (abfd); symptrs[n] = bfdsym; rv = asymbol_from_plugin_symbol (abfd, bfdsym, syms + n); |