summaryrefslogtreecommitdiff
path: root/gold/archive.cc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2010-08-23 20:28:24 +0000
committerCary Coutant <ccoutant@google.com>2010-08-23 20:28:24 +0000
commit9919d93bc70b0ed9bb5991bcf46e4c3ffaa0a3ce (patch)
tree4d58e30e8ec798bdfd93e875b7aee578ec4aba77 /gold/archive.cc
parent96f73ba54fb8e863d7c5d2b7cf3678ea6693952a (diff)
downloadbinutils-gdb-9919d93bc70b0ed9bb5991bcf46e4c3ffaa0a3ce.tar.gz
* 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.
Diffstat (limited to 'gold/archive.cc')
-rw-r--r--gold/archive.cc13
1 files changed, 10 insertions, 3 deletions
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.