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
commitd40970d63ea8d4397a27d66f87bfbe54ef58272d (patch)
tree77686ced3ba7bc7c2c80b945ab4fbf52af3a67a1 /gold/archive.cc
parent9d10bf214b6cb4812474b2b207465f82a3a07b6c (diff)
downloadbinutils-redhat-d40970d63ea8d4397a27d66f87bfbe54ef58272d.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 68a674ddfe..dade0430de 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.