Index: archive.cc =================================================================== RCS file: /cvs/src/src/gold/archive.cc,v retrieving revision 1.52 diff -u -p -r1.52 archive.cc --- archive.cc 22 Mar 2010 14:18:24 -0000 1.52 +++ archive.cc 26 Mar 2010 22:56:22 -0000 @@ -877,10 +877,12 @@ Archive::include_member(Symbol_table* sy 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. Index: object.cc =================================================================== RCS file: /cvs/src/src/gold/object.cc,v retrieving revision 1.121 diff -u -p -r1.121 object.cc --- object.cc 22 Mar 2010 14:18:24 -0000 1.121 +++ object.cc 26 Mar 2010 22:56:22 -0000 @@ -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 Index: object.h =================================================================== RCS file: /cvs/src/src/gold/object.h,v retrieving revision 1.94 diff -u -p -r1.94 object.h --- object.h 22 Mar 2010 14:18:24 -0000 1.94 +++ object.h 26 Mar 2010 22:56:22 -0000 @@ -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 Relocs_list; // The relocations. Relocs_list relocs; Index: testsuite/binary_unittest.cc =================================================================== RCS file: /cvs/src/src/gold/testsuite/binary_unittest.cc,v retrieving revision 1.7 diff -u -p -r1.7 binary_unittest.cc --- testsuite/binary_unittest.cc 30 Sep 2009 22:21:13 -0000 1.7 +++ testsuite/binary_unittest.cc 26 Mar 2010 22:56:22 -0000 @@ -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* relobj = static_cast*>(object);