From 5f9bcf5825f56b017aacf20aaabce0ed07920454 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Fri, 5 Nov 2010 21:14:33 +0000 Subject: [PATCH] PR gold/10708 * copy-relocs.cc (Copy_relocs::emit_copy_reloc): Hold a lock on the object when reading from the file. * gold.cc (queue_middle_tasks): Hold a lock on the object when doing second layout pass. * icf.cc (preprocess_for_unique_sections): Hold a lock on the object when reading section contents. (get_section_contents): Likewise. (icf::find_identical_sections): Likewise. * mapfile.cc (Mapfile::print_discarded_sections): Hold a lock on the object when reading from the file. * plugin.cc (Plugin_manager::layout_deferred_objects): Hold a lock on the object when doing deferred section layout. --- gold/ChangeLog | 16 ++++++++++++++++ gold/copy-relocs.cc | 13 +++++++++++-- gold/gold.cc | 1 + gold/icf.cc | 22 ++++++++++++++++++++++ gold/mapfile.cc | 6 ++++++ gold/plugin.cc | 9 ++++++++- 6 files changed, 64 insertions(+), 3 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 53bc363..ee2b865 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,19 @@ +2010-11-05 Cary Coutant + + PR gold/10708 + * copy-relocs.cc (Copy_relocs::emit_copy_reloc): Hold a lock on the + object when reading from the file. + * gold.cc (queue_middle_tasks): Hold a lock on the object when doing + second layout pass. + * icf.cc (preprocess_for_unique_sections): Hold a lock on the object + when reading section contents. + (get_section_contents): Likewise. + (icf::find_identical_sections): Likewise. + * mapfile.cc (Mapfile::print_discarded_sections): Hold a lock on the + object when reading from the file. + * plugin.cc (Plugin_manager::layout_deferred_objects): Hold a lock on + the object when doing deferred section layout. + 2010-11-03 Nick Clifton PR gold/12001 diff --git a/gold/copy-relocs.cc b/gold/copy-relocs.cc index ed8002f..4931aa0 100644 --- a/gold/copy-relocs.cc +++ b/gold/copy-relocs.cc @@ -125,8 +125,17 @@ Copy_relocs::emit_copy_reloc( bool is_ordinary; unsigned int shndx = sym->shndx(&is_ordinary); gold_assert(is_ordinary); - typename elfcpp::Elf_types::Elf_WXword addralign = - sym->object()->section_addralign(shndx); + typename elfcpp::Elf_types::Elf_WXword addralign; + + { + // Lock the object so we can read from it. This is only called + // single-threaded from scan_relocs, so it is OK to lock. + // Unfortunately we have no way to pass in a Task token. + const Task* dummy_task = reinterpret_cast(-1); + Object* obj = sym->object(); + Task_lock_obj tl(dummy_task, obj); + addralign = obj->section_addralign(shndx); + } typename Sized_symbol::Value_type value = sym->value(); while ((value & (addralign - 1)) != 0) diff --git a/gold/gold.cc b/gold/gold.cc index 6bbf02e..564ca39 100644 --- a/gold/gold.cc +++ b/gold/gold.cc @@ -359,6 +359,7 @@ queue_middle_tasks(const General_options& options, p != input_objects->relobj_end(); ++p) { + Task_lock_obj tlo(task, *p); (*p)->layout(symtab, layout, NULL); } } diff --git a/gold/icf.cc b/gold/icf.cc index 09cb1d4..a132875 100644 --- a/gold/icf.cc +++ b/gold/icf.cc @@ -182,6 +182,11 @@ preprocess_for_unique_sections(const std::vector& id_section, section_size_type plen; if (section_contents == NULL) { + // Lock the object so we can read from it. This is only called + // single-threaded from queue_middle_tasks, so it is OK to lock. + // Unfortunately we have no way to pass in a Task token. + const Task* dummy_task = reinterpret_cast(-1); + Task_lock_obj tl(dummy_task, secn.first); const unsigned char* contents; contents = secn.first->section_contents(secn.second, &plen, @@ -237,6 +242,11 @@ get_section_contents(bool first_iteration, if (first_iteration) { + // Lock the object so we can read from it. This is only called + // single-threaded from queue_middle_tasks, so it is OK to lock. + // Unfortunately we have no way to pass in a Task token. + const Task* dummy_task = reinterpret_cast(-1); + Task_lock_obj tl(dummy_task, secn.first); contents = secn.first->section_contents(secn.second, &plen, false); @@ -363,6 +373,12 @@ get_section_contents(bool first_iteration, if (!first_iteration) continue; + // Lock the object so we can read from it. This is only called + // single-threaded from queue_middle_tasks, so it is OK to lock. + // Unfortunately we have no way to pass in a Task token. + const Task* dummy_task = reinterpret_cast(-1); + Task_lock_obj tl(dummy_task, it_v->first); + uint64_t secn_flags = (it_v->first)->section_flags(it_v->second); // This reloc points to a merge section. Hash the // contents of this section. @@ -682,6 +698,12 @@ Icf::find_identical_sections(const Input_objects* input_objects, p != input_objects->relobj_end(); ++p) { + // Lock the object so we can read from it. This is only called + // single-threaded from queue_middle_tasks, so it is OK to lock. + // Unfortunately we have no way to pass in a Task token. + const Task* dummy_task = reinterpret_cast(-1); + Task_lock_obj tl(dummy_task, *p); + for (unsigned int i = 0;i < (*p)->shnum(); ++i) { const char* section_name = (*p)->section_name(i).c_str(); diff --git a/gold/mapfile.cc b/gold/mapfile.cc index a3ba52b..0cde51e 100644 --- a/gold/mapfile.cc +++ b/gold/mapfile.cc @@ -347,6 +347,12 @@ Mapfile::print_discarded_sections(const Input_objects* input_objects) ++p) { Relobj* relobj = *p; + // Lock the object so we can read from it. This is only called + // single-threaded from Layout_task_runner, so it is OK to lock. + // Unfortunately we have no way to pass in a Task token. + const Task* dummy_task = reinterpret_cast(-1); + Task_lock_obj tl(dummy_task, relobj); + unsigned int shnum = relobj->shnum(); for (unsigned int i = 0; i < shnum; ++i) { diff --git a/gold/plugin.cc b/gold/plugin.cc index 7dd1fa3..a3569c9 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -361,7 +361,14 @@ Plugin_manager::layout_deferred_objects() for (obj = this->deferred_layout_objects_.begin(); obj != this->deferred_layout_objects_.end(); ++obj) - (*obj)->layout_deferred_sections(this->layout_); + { + // Lock the object so we can read from it. This is only called + // single-threaded from queue_middle_tasks, so it is OK to lock. + // Unfortunately we have no way to pass in a Task token. + const Task* dummy_task = reinterpret_cast(-1); + Task_lock_obj tl(dummy_task, *obj); + (*obj)->layout_deferred_sections(this->layout_); + } } // Call the cleanup handlers. -- 2.7.4