diff options
author | Cary Coutant <ccoutant@google.com> | 2010-08-23 20:28:24 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2010-08-23 20:28:24 +0000 |
commit | 9919d93bc70b0ed9bb5991bcf46e4c3ffaa0a3ce (patch) | |
tree | 4d58e30e8ec798bdfd93e875b7aee578ec4aba77 /gold/archive.cc | |
parent | 96f73ba54fb8e863d7c5d2b7cf3678ea6693952a (diff) | |
download | binutils-9919d93bc70b0ed9bb5991bcf46e4c3ffaa0a3ce.zip binutils-9919d93bc70b0ed9bb5991bcf46e4c3ffaa0a3ce.tar.gz binutils-9919d93bc70b0ed9bb5991bcf46e4c3ffaa0a3ce.tar.bz2 |
* 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.cc | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gold/archive.cc b/gold/archive.cc index 68a674d..dade043 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. |