diff options
author | Cary Coutant <ccoutant@google.com> | 2008-04-01 20:57:36 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2008-04-01 20:57:36 +0000 |
commit | a12074662b645834b85211121257c82b7763f2a6 (patch) | |
tree | ec3127a35fd8eded0118712f4cd282a7715d3d94 /gold/archive.h | |
parent | 79c6ced6ea7d833502f2734eb43011ed06ea2068 (diff) | |
download | fsf-binutils-gdb-a12074662b645834b85211121257c82b7763f2a6.zip fsf-binutils-gdb-a12074662b645834b85211121257c82b7763f2a6.tar.gz fsf-binutils-gdb-a12074662b645834b85211121257c82b7763f2a6.tar.bz2 |
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/archive.h')
-rw-r--r-- | gold/archive.h | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/gold/archive.h b/gold/archive.h index aa01997..6780398 100644 --- a/gold/archive.h +++ b/gold/archive.h @@ -44,9 +44,11 @@ class Symbol_table; class Archive { public: - Archive(const std::string& name, Input_file* input_file) + Archive(const std::string& name, Input_file* input_file, + bool is_thin_archive, Dirsearch* dirpath, Task* task) : name_(name), input_file_(input_file), armap_(), armap_names_(), - extended_names_(), armap_checked_(), seen_offsets_() + extended_names_(), armap_checked_(), seen_offsets_(), + is_thin_archive_(is_thin_archive), dirpath_(dirpath), task_(task) { } // The length of the magic string at the start of an archive. @@ -54,6 +56,7 @@ class Archive // The magic string at the start of an archive. static const char armag[sarmag]; + static const char armagt[sarmag]; // The string expected at the end of an archive member header. static const char arfmag[2]; @@ -65,7 +68,7 @@ class Archive // Set up the archive: read the symbol map. void - setup(Task*); + setup(); // Get a reference to the underlying file. File_read& @@ -97,6 +100,10 @@ class Archive release() { this->input_file_->file().release(); } + // Unlock any nested archives. + void + unlock_nested_archives(); + // Select members from the archive as needed and add them to the // link. void @@ -121,12 +128,13 @@ class Archive // the file view. Return the size of the member, and set *PNAME to // the name. off_t - read_header(off_t off, bool cache, std::string* pname); + read_header(off_t off, bool cache, std::string* pname, off_t* nested_off); // Interpret an archive header HDR at OFF. Return the size of the // member, and set *PNAME to the name. off_t - interpret_header(const Archive_header* hdr, off_t off, std::string* pname); + interpret_header(const Archive_header* hdr, off_t off, std::string* pname, + off_t* nested_off); // Include all the archive members in the link. void @@ -153,6 +161,9 @@ class Archive { return static_cast<size_t>(val); } }; + // For keeping track of open nested archives in a thin archive file. + typedef Unordered_map<std::string, Archive*> Nested_archive_table; + // Name of object as printed to user. std::string name_; // For reading the file. @@ -168,6 +179,14 @@ class Archive std::vector<bool> armap_checked_; // Track which elements have been included by offset. Unordered_set<off_t, Seen_hash> seen_offsets_; + // True if this is a thin archive. + const bool is_thin_archive_; + // Table of nested archives, indexed by filename. + Nested_archive_table nested_archives_; + // The directory search path. + Dirsearch* dirpath_; + // The task reading this archive. + Task *task_; }; // This class is used to read an archive and pick out the desired |