From 9919d93bc70b0ed9bb5991bcf46e4c3ffaa0a3ce Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Mon, 23 Aug 2010 20:28:24 +0000 Subject: * archive.cc (Lib_group::add_symbols): Lock object before deleting its symbols data. (Lib_group::include_member): Unlock object after deleting its symbols data. * testsuite/start_lib_test_3.c: Remove all global symbols to trigger the bug fixed here. --- gold/archive.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'gold/archive.cc') diff --git a/gold/archive.cc b/gold/archive.cc index 68a674ddfe8..dade0430de2 100644 --- a/gold/archive.cc +++ b/gold/archive.cc @@ -1057,7 +1057,14 @@ Lib_group::add_symbols(Symbol_table* symtab, Layout* layout, else { if (member.sd_ != NULL) - delete member.sd_; + { + // The file must be locked in order to destroy the views + // associated with it. + gold_assert(obj != NULL); + obj->lock(this->task_); + delete member.sd_; + obj->unlock(this->task_); + } } this->members_[i] = this->members_.back(); @@ -1096,10 +1103,10 @@ Lib_group::include_member(Symbol_table* symtab, Layout* layout, layout->incremental_inputs()->report_object(obj, NULL); obj->layout(symtab, layout, sd); obj->add_symbols(symtab, sd, layout); - // Unlock the file for the next task. - obj->unlock(this->task_); } delete sd; + // Unlock the file for the next task. + obj->unlock(this->task_); } // Print statistical information to stderr. This is used for --stats. -- cgit v1.2.1