aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2008-04-01 20:57:36 +0000
committerCary Coutant <ccoutant@google.com>2008-04-01 20:57:36 +0000
commita12074662b645834b85211121257c82b7763f2a6 (patch)
treeec3127a35fd8eded0118712f4cd282a7715d3d94 /gold/readsyms.cc
parent * gdb.cp/casts.cc: Add class reference variables. (diff)
downloadbinutils-gdb-a12074662b645834b85211121257c82b7763f2a6.tar.gz
binutils-gdb-a12074662b645834b85211121257c82b7763f2a6.tar.bz2
binutils-gdb-a12074662b645834b85211121257c82b7763f2a6.zip
2008-03-31 Cary Coutant <ccoutant@google.com>
Add thin archive support. * archive.cc (Archive::armagt): New const. (Archive::setup): Remove task parameter and calls to unlock. (Archive::unlock_nested_archives): New function. (Archive::read_header): Add nested_off parameter. Change all callers. (Archive::interpret_header): Likewise. (Archive::include_all_members): Change to handle thin archives. (Archive::include_member): Likewise. * archive.h (Archive::Archive): Add new parameters and initializers. (Archive::armagt): New const. (Archive::setup): Remove task parameter. (Archive::unlock_nested_archives): New function. (Archive::read_header): Add nested_off parameter. (Archive::interpret_header): Likewise. (Archive::Nested_archive_table): New typedef. (Archive::is_thin_archive_): New field. (Archive::nested_archives_): New field. (Archive::options_): New field. (Archive::dirpath_): New field. (Archive::task_): New field. * readsyms.cc (Read_symbols::do_read_symbols): Add check for thin archives. Pass additional parameters to Archive::Archive. Unlock the archive file after calling Archive::setup.
Diffstat (limited to 'gold/readsyms.cc')
-rw-r--r--gold/readsyms.cc13
1 files changed, 10 insertions, 3 deletions
diff --git a/gold/readsyms.cc b/gold/readsyms.cc
index 6c1369ba4b5..d0bf2644a46 100644
--- a/gold/readsyms.cc
+++ b/gold/readsyms.cc
@@ -204,12 +204,19 @@ Read_symbols::do_read_symbols(Workqueue* workqueue)
if (read_size >= Archive::sarmag)
{
- if (memcmp(ehdr_buf, Archive::armag, Archive::sarmag) == 0)
+ bool is_thin_archive
+ = memcmp(ehdr_buf, Archive::armagt, Archive::sarmag) == 0;
+ if (is_thin_archive
+ || memcmp(ehdr_buf, Archive::armag, Archive::sarmag) == 0)
{
// This is an archive.
Archive* arch = new Archive(this->input_argument_->file().name(),
- input_file);
- arch->setup(this);
+ input_file, is_thin_archive,
+ this->dirpath_, this);
+ arch->setup();
+
+ // Unlock the archive so it can be used in the next task.
+ arch->unlock(this);
workqueue->queue_next(new Add_archive_symbols(this->symtab_,
this->layout_,