aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog14
-rw-r--r--gold/archive.cc10
-rw-r--r--gold/object.cc22
-rw-r--r--gold/object.h21
-rw-r--r--gold/testsuite/binary_unittest.cc4
5 files changed, 67 insertions, 4 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index e1e126a..524340d 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,17 @@
+2010-04-07 Cary Coutant <ccoutant@google.com>
+
+ * archive.cc (include_member): Destroy Read_symbols_data object before
+ releasing file.
+ * object.cc (Read_symbols_data::~Read_symbols_data) New destructor.
+ * object.h (Read_symbols_data::Read_symbols_data) New constructor.
+ (Read_symbols_data::~Read_symbols_data) New destructor.
+ (Section_relocs::Section_relocs) New constructor.
+ (Section_relocs::~Section_relocs) New destructor.
+ (Read_relocs_data::Read_relocs_data) New constructor.
+ (Read_relocs_data::~Read_relocs_data) New destructor.
+ * testsuite/binary_unittest.cc (Sized_binary_test): Set sd member
+ pointers to NULL after deleting.
+
2010-04-07 Doug Kwan <dougkwan@google.com>
* arm.cc: Replace "endianity" with "endianness" in comments.
diff --git a/gold/archive.cc b/gold/archive.cc
index c62fb24..36e4862 100644
--- a/gold/archive.cc
+++ b/gold/archive.cc
@@ -877,10 +877,12 @@ Archive::include_member(Symbol_table* symtab, Layout* layout,
delete obj;
else
{
- Read_symbols_data sd;
- obj->read_symbols(&sd);
- obj->layout(symtab, layout, &sd);
- obj->add_symbols(symtab, &sd, layout);
+ {
+ Read_symbols_data sd;
+ obj->read_symbols(&sd);
+ obj->layout(symtab, layout, &sd);
+ obj->add_symbols(symtab, &sd, layout);
+ }
// If this is an external member of a thin archive, unlock the file
// for the next task.
diff --git a/gold/object.cc b/gold/object.cc
index b9d0028..8751d55 100644
--- a/gold/object.cc
+++ b/gold/object.cc
@@ -43,6 +43,28 @@
namespace gold
{
+// Struct Read_symbols_data.
+
+// Destroy any remaining File_view objects.
+
+Read_symbols_data::~Read_symbols_data()
+{
+ if (this->section_headers != NULL)
+ delete this->section_headers;
+ if (this->section_names != NULL)
+ delete this->section_names;
+ if (this->symbols != NULL)
+ delete this->symbols;
+ if (this->symbol_names != NULL)
+ delete this->symbol_names;
+ if (this->versym != NULL)
+ delete this->versym;
+ if (this->verdef != NULL)
+ delete this->verdef;
+ if (this->verneed != NULL)
+ delete this->verneed;
+}
+
// Class Xindex.
// Initialize the symtab_xindex_ array. Find the SHT_SYMTAB_SHNDX
diff --git a/gold/object.h b/gold/object.h
index dc0cb2d..02747a7 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -55,6 +55,13 @@ class Stringpool_template;
struct Read_symbols_data
{
+ Read_symbols_data()
+ : section_headers(NULL), section_names(NULL), symbols(NULL),
+ symbol_names(NULL), versym(NULL), verdef(NULL), verneed(NULL)
+ { }
+
+ ~Read_symbols_data();
+
// Section headers.
File_view* section_headers;
// Section names.
@@ -102,6 +109,13 @@ struct Symbol_location_info
struct Section_relocs
{
+ Section_relocs()
+ : contents(NULL)
+ { }
+
+ ~Section_relocs()
+ { delete this->contents; }
+
// Index of reloc section.
unsigned int reloc_shndx;
// Index of section that relocs apply to.
@@ -125,6 +139,13 @@ struct Section_relocs
struct Read_relocs_data
{
+ Read_relocs_data()
+ : local_symbols(NULL)
+ { }
+
+ ~Read_relocs_data()
+ { delete this->local_symbols; }
+
typedef std::vector<Section_relocs> Relocs_list;
// The relocations.
Relocs_list relocs;
diff --git a/gold/testsuite/binary_unittest.cc b/gold/testsuite/binary_unittest.cc
index b2e14df..8e95062 100644
--- a/gold/testsuite/binary_unittest.cc
+++ b/gold/testsuite/binary_unittest.cc
@@ -87,9 +87,13 @@ Sized_binary_test()
Read_symbols_data sd;
object->read_symbols(&sd);
delete sd.section_headers;
+ sd.section_headers = NULL;
delete sd.section_names;
+ sd.section_names = NULL;
delete sd.symbols;
+ sd.symbols = NULL;
delete sd.symbol_names;
+ sd.symbol_names = NULL;
Sized_relobj<size, big_endian>* relobj =
static_cast<Sized_relobj<size, big_endian>*>(object);