* 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.
This commit is contained in:
Cary Coutant
2010-08-23 20:28:24 +00:00
parent 96f73ba54f
commit 9919d93bc7
3 changed files with 20 additions and 9 deletions

View File

@@ -1,3 +1,12 @@
2010-08-23 Cary Coutant <ccoutant@google.com>
* 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.
2010-08-19 Neil Vachharajani <nvachhar@google.com>
Cary Coutant <ccoutant@google.com>

View File

@@ -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.

View File

@@ -22,9 +22,4 @@
This is a test of the --start-lib and --end-lib options. */
extern void t3 (void);
void
t3 (void)
{
}
static char t3[] = "t3";