* archive.cc (Archive::interpret_header): Return -1 if something
[external/binutils.git] / gold / archive.cc
1 // archive.cc -- archive support for gold
2
3 // Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>.
5
6 // This file is part of gold.
7
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22
23 #include "gold.h"
24
25 #include <cerrno>
26 #include <cstring>
27 #include <climits>
28 #include <vector>
29 #include "libiberty.h"
30 #include "filenames.h"
31
32 #include "elfcpp.h"
33 #include "options.h"
34 #include "mapfile.h"
35 #include "fileread.h"
36 #include "readsyms.h"
37 #include "symtab.h"
38 #include "object.h"
39 #include "layout.h"
40 #include "archive.h"
41 #include "plugin.h"
42 #include "incremental.h"
43
44 namespace gold
45 {
46
47 // The header of an entry in the archive.  This is all readable text,
48 // padded with spaces where necessary.  If the contents of an archive
49 // are all text file, the entire archive is readable.
50
51 struct Archive::Archive_header
52 {
53   // The entry name.
54   char ar_name[16];
55   // The file modification time.
56   char ar_date[12];
57   // The user's UID in decimal.
58   char ar_uid[6];
59   // The user's GID in decimal.
60   char ar_gid[6];
61   // The file mode in octal.
62   char ar_mode[8];
63   // The file size in decimal.
64   char ar_size[10];
65   // The final magic code.
66   char ar_fmag[2];
67 };
68
69 // Class Archive static variables.
70 unsigned int Archive::total_archives;
71 unsigned int Archive::total_members;
72 unsigned int Archive::total_members_loaded;
73
74 // Archive methods.
75
76 const char Archive::armag[sarmag] =
77 {
78   '!', '<', 'a', 'r', 'c', 'h', '>', '\n'
79 };
80
81 const char Archive::armagt[sarmag] =
82 {
83   '!', '<', 't', 'h', 'i', 'n', '>', '\n'
84 };
85
86 const char Archive::arfmag[2] = { '`', '\n' };
87
88 Archive::Archive(const std::string& name, Input_file* input_file,
89                  bool is_thin_archive, Dirsearch* dirpath, Task* task)
90   : name_(name), input_file_(input_file), armap_(), armap_names_(),
91     extended_names_(), armap_checked_(), seen_offsets_(), members_(),
92     is_thin_archive_(is_thin_archive), included_member_(false),
93     nested_archives_(), dirpath_(dirpath), task_(task), num_members_(0),
94     incremental_info_(NULL)
95 {
96   this->no_export_ =
97     parameters->options().check_excluded_libs(input_file->found_name());
98 }
99
100 // Set up the archive: read the symbol map and the extended name
101 // table.
102
103 void
104 Archive::setup()
105 {
106   // We need to ignore empty archives.
107   if (this->input_file_->file().filesize() == sarmag)
108     return;
109
110   // The first member of the archive should be the symbol table.
111   std::string armap_name;
112   off_t header_size = this->read_header(sarmag, false, &armap_name, NULL);
113   if (header_size == -1)
114     return;
115
116   section_size_type armap_size = convert_to_section_size_type(header_size);
117   off_t off = sarmag;
118   if (armap_name.empty())
119     {
120       this->read_armap(sarmag + sizeof(Archive_header), armap_size);
121       off = sarmag + sizeof(Archive_header) + armap_size;
122     }
123   else if (!this->input_file_->options().whole_archive())
124     gold_error(_("%s: no archive symbol table (run ranlib)"),
125                this->name().c_str());
126
127   // See if there is an extended name table.  We cache these views
128   // because it is likely that we will want to read the following
129   // header in the add_symbols routine.
130   if ((off & 1) != 0)
131     ++off;
132   std::string xname;
133   header_size = this->read_header(off, true, &xname, NULL);
134   if (header_size == -1)
135     return;
136
137   section_size_type extended_size = convert_to_section_size_type(header_size);
138   if (xname == "/")
139     {
140       const unsigned char* p = this->get_view(off + sizeof(Archive_header),
141                                               extended_size, false, true);
142       const char* px = reinterpret_cast<const char*>(p);
143       this->extended_names_.assign(px, extended_size);
144     }
145   bool preread_syms = (parameters->options().threads()
146                        && parameters->options().preread_archive_symbols());
147 #ifndef ENABLE_THREADS
148   preread_syms = false;
149 #else
150   if (parameters->options().has_plugins())
151     preread_syms = false;
152 #endif
153   if (preread_syms)
154     this->read_all_symbols();
155 }
156
157 // Unlock any nested archives.
158
159 void
160 Archive::unlock_nested_archives()
161 {
162   for (Nested_archive_table::iterator p = this->nested_archives_.begin();
163        p != this->nested_archives_.end();
164        ++p)
165     {
166       p->second->unlock(this->task_);
167     }
168 }
169
170 // Read the archive symbol map.
171
172 void
173 Archive::read_armap(off_t start, section_size_type size)
174 {
175   // To count the total number of archive members, we'll just count
176   // the number of times the file offset changes.  Since most archives
177   // group the symbols in the armap by object, this ought to give us
178   // an accurate count.
179   off_t last_seen_offset = -1;
180
181   // Read in the entire armap.
182   const unsigned char* p = this->get_view(start, size, true, false);
183
184   // Numbers in the armap are always big-endian.
185   const elfcpp::Elf_Word* pword = reinterpret_cast<const elfcpp::Elf_Word*>(p);
186   unsigned int nsyms = elfcpp::Swap<32, true>::readval(pword);
187   ++pword;
188
189   // Note that the addition is in units of sizeof(elfcpp::Elf_Word).
190   const char* pnames = reinterpret_cast<const char*>(pword + nsyms);
191   section_size_type names_size =
192     reinterpret_cast<const char*>(p) + size - pnames;
193   this->armap_names_.assign(pnames, names_size);
194
195   this->armap_.resize(nsyms);
196
197   section_offset_type name_offset = 0;
198   for (unsigned int i = 0; i < nsyms; ++i)
199     {
200       this->armap_[i].name_offset = name_offset;
201       this->armap_[i].file_offset = elfcpp::Swap<32, true>::readval(pword);
202       name_offset += strlen(pnames + name_offset) + 1;
203       ++pword;
204       if (this->armap_[i].file_offset != last_seen_offset)
205         {
206           last_seen_offset = this->armap_[i].file_offset;
207           ++this->num_members_;
208         }
209     }
210
211   if (static_cast<section_size_type>(name_offset) > names_size)
212     gold_error(_("%s: bad archive symbol table names"),
213                this->name().c_str());
214
215   // This array keeps track of which symbols are for archive elements
216   // which we have already included in the link.
217   this->armap_checked_.resize(nsyms);
218 }
219
220 // Read the header of an archive member at OFF.  Fail if something
221 // goes wrong.  Return the size of the member.  Set *PNAME to the name
222 // of the member.
223
224 off_t
225 Archive::read_header(off_t off, bool cache, std::string* pname,
226                      off_t* nested_off)
227 {
228   const unsigned char* p = this->get_view(off, sizeof(Archive_header), true,
229                                           cache);
230   const Archive_header* hdr = reinterpret_cast<const Archive_header*>(p);
231   return this->interpret_header(hdr, off,  pname, nested_off);
232 }
233
234 // Interpret the header of HDR, the header of the archive member at
235 // file offset OFF.  Return the size of the member, or -1 if something
236 // has gone wrong.  Set *PNAME to the name of the member.
237
238 off_t
239 Archive::interpret_header(const Archive_header* hdr, off_t off,
240                           std::string* pname, off_t* nested_off) const
241 {
242   if (memcmp(hdr->ar_fmag, arfmag, sizeof arfmag) != 0)
243     {
244       gold_error(_("%s: malformed archive header at %zu"),
245                  this->name().c_str(), static_cast<size_t>(off));
246       return -1;
247     }
248
249   const int size_string_size = sizeof hdr->ar_size;
250   char size_string[size_string_size + 1];
251   memcpy(size_string, hdr->ar_size, size_string_size);
252   char* ps = size_string + size_string_size;
253   while (ps[-1] == ' ')
254     --ps;
255   *ps = '\0';
256
257   errno = 0;
258   char* end;
259   off_t member_size = strtol(size_string, &end, 10);
260   if (*end != '\0'
261       || member_size < 0
262       || (member_size == LONG_MAX && errno == ERANGE))
263     {
264       gold_error(_("%s: malformed archive header size at %zu"),
265                  this->name().c_str(), static_cast<size_t>(off));
266       return -1;
267     }
268
269   if (hdr->ar_name[0] != '/')
270     {
271       const char* name_end = strchr(hdr->ar_name, '/');
272       if (name_end == NULL
273           || name_end - hdr->ar_name >= static_cast<int>(sizeof hdr->ar_name))
274         {
275           gold_error(_("%s: malformed archive header name at %zu"),
276                      this->name().c_str(), static_cast<size_t>(off));
277           return -1;
278         }
279       pname->assign(hdr->ar_name, name_end - hdr->ar_name);
280       if (nested_off != NULL)
281         *nested_off = 0;
282     }
283   else if (hdr->ar_name[1] == ' ')
284     {
285       // This is the symbol table.
286       if (!pname->empty())
287         pname->clear();
288     }
289   else if (hdr->ar_name[1] == '/')
290     {
291       // This is the extended name table.
292       pname->assign(1, '/');
293     }
294   else
295     {
296       errno = 0;
297       long x = strtol(hdr->ar_name + 1, &end, 10);
298       long y = 0;
299       if (*end == ':')
300         y = strtol(end + 1, &end, 10);
301       if (*end != ' '
302           || x < 0
303           || (x == LONG_MAX && errno == ERANGE)
304           || static_cast<size_t>(x) >= this->extended_names_.size())
305         {
306           gold_error(_("%s: bad extended name index at %zu"),
307                      this->name().c_str(), static_cast<size_t>(off));
308           return -1;
309         }
310
311       const char* name = this->extended_names_.data() + x;
312       const char* name_end = strchr(name, '\n');
313       if (static_cast<size_t>(name_end - name) > this->extended_names_.size()
314           || name_end[-1] != '/')
315         {
316           gold_error(_("%s: bad extended name entry at header %zu"),
317                      this->name().c_str(), static_cast<size_t>(off));
318           return -1;
319         }
320       pname->assign(name, name_end - 1 - name);
321       if (nested_off != NULL)
322         *nested_off = y;
323     }
324
325   return member_size;
326 }
327
328 // An archive member iterator.
329
330 class Archive::const_iterator
331 {
332  public:
333   // The header of an archive member.  This is what this iterator
334   // points to.
335   struct Header
336   {
337     // The name of the member.
338     std::string name;
339     // The file offset of the member.
340     off_t off;
341     // The file offset of a nested archive member.
342     off_t nested_off;
343     // The size of the member.
344     off_t size;
345   };
346
347   const_iterator(Archive* archive, off_t off)
348     : archive_(archive), off_(off)
349   { this->read_next_header(); }
350
351   const Header&
352   operator*() const
353   { return this->header_; }
354
355   const Header*
356   operator->() const
357   { return &this->header_; }
358
359   const_iterator&
360   operator++()
361   {
362     if (this->off_ == this->archive_->file().filesize())
363       return *this;
364     this->off_ += sizeof(Archive_header);
365     if (!this->archive_->is_thin_archive())
366       this->off_ += this->header_.size;
367     if ((this->off_ & 1) != 0)
368       ++this->off_;
369     this->read_next_header();
370     return *this;
371   }
372
373   const_iterator
374   operator++(int)
375   {
376     const_iterator ret = *this;
377     ++*this;
378     return ret;
379   }
380
381   bool
382   operator==(const const_iterator p) const
383   { return this->off_ == p->off; }
384
385   bool
386   operator!=(const const_iterator p) const
387   { return this->off_ != p->off; }
388
389  private:
390   void
391   read_next_header();
392
393   // The underlying archive.
394   Archive* archive_;
395   // The current offset in the file.
396   off_t off_;
397   // The current archive header.
398   Header header_;
399 };
400
401 // Read the next archive header.
402
403 void
404 Archive::const_iterator::read_next_header()
405 {
406   off_t filesize = this->archive_->file().filesize();
407   while (true)
408     {
409       if (filesize - this->off_ < static_cast<off_t>(sizeof(Archive_header)))
410         {
411           if (filesize != this->off_)
412             {
413               gold_error(_("%s: short archive header at %zu"),
414                          this->archive_->filename().c_str(),
415                          static_cast<size_t>(this->off_));
416               this->off_ = filesize;
417             }
418           this->header_.off = filesize;
419           return;
420         }
421
422       unsigned char buf[sizeof(Archive_header)];
423       this->archive_->file().read(this->off_, sizeof(Archive_header), buf);
424
425       const Archive_header* hdr = reinterpret_cast<const Archive_header*>(buf);
426       off_t size = this->archive_->interpret_header(hdr, this->off_,
427                                                     &this->header_.name,
428                                                     &this->header_.nested_off);
429       if (size == -1)
430         {
431           this->header_.off = filesize;
432           return;
433         }
434
435       this->header_.size = size;
436       this->header_.off = this->off_;
437
438       // Skip special members.
439       if (!this->header_.name.empty() && this->header_.name != "/")
440         return;
441
442       this->off_ += sizeof(Archive_header) + this->header_.size;
443       if ((this->off_ & 1) != 0)
444         ++this->off_;
445     }
446 }
447
448 // Initial iterator.
449
450 Archive::const_iterator
451 Archive::begin()
452 {
453   return Archive::const_iterator(this, sarmag);
454 }
455
456 // Final iterator.
457
458 Archive::const_iterator
459 Archive::end()
460 {
461   return Archive::const_iterator(this, this->input_file_->file().filesize());
462 }
463
464 // Get the file and offset for an archive member, which may be an
465 // external member of a thin archive.  Set *INPUT_FILE to the
466 // file containing the actual member, *MEMOFF to the offset
467 // within that file (0 if not a nested archive), and *MEMBER_NAME
468 // to the name of the archive member.  Return TRUE on success.
469
470 bool
471 Archive::get_file_and_offset(off_t off, Input_file** input_file, off_t* memoff,
472                              off_t* memsize, std::string* member_name)
473 {
474   off_t nested_off;
475
476   *memsize = this->read_header(off, false, member_name, &nested_off);
477   if (*memsize == -1)
478     return false;
479
480   *input_file = this->input_file_;
481   *memoff = off + static_cast<off_t>(sizeof(Archive_header));
482
483   if (!this->is_thin_archive_)
484     return true;
485
486   // Adjust a relative pathname so that it is relative
487   // to the directory containing the archive.
488   if (!IS_ABSOLUTE_PATH(member_name->c_str()))
489     {
490       const char* arch_path = this->filename().c_str();
491       const char* basename = lbasename(arch_path);
492       if (basename > arch_path)
493         member_name->replace(0, 0,
494                              this->filename().substr(0, basename - arch_path));
495     }
496
497   if (nested_off > 0)
498     {
499       // This is a member of a nested archive.  Open the containing
500       // archive if we don't already have it open, then do a recursive
501       // call to include the member from that archive.
502       Archive* arch;
503       Nested_archive_table::const_iterator p =
504         this->nested_archives_.find(*member_name);
505       if (p != this->nested_archives_.end())
506         arch = p->second;
507       else
508         {
509           Input_file_argument* input_file_arg =
510             new Input_file_argument(member_name->c_str(),
511                                     Input_file_argument::INPUT_FILE_TYPE_FILE,
512                                     "", false, parameters->options());
513           *input_file = new Input_file(input_file_arg);
514           int dummy = 0;
515           if (!(*input_file)->open(*this->dirpath_, this->task_, &dummy))
516             return false;
517           arch = new Archive(*member_name, *input_file, false, this->dirpath_,
518                              this->task_);
519           arch->setup();
520           std::pair<Nested_archive_table::iterator, bool> ins =
521             this->nested_archives_.insert(std::make_pair(*member_name, arch));
522           gold_assert(ins.second);
523         }
524       return arch->get_file_and_offset(nested_off, input_file, memoff,
525                                        memsize, member_name);
526     }
527
528   // This is an external member of a thin archive.  Open the
529   // file as a regular relocatable object file.
530   Input_file_argument* input_file_arg =
531       new Input_file_argument(member_name->c_str(),
532                               Input_file_argument::INPUT_FILE_TYPE_FILE,
533                               "", false, this->input_file_->options());
534   *input_file = new Input_file(input_file_arg);
535   int dummy = 0;
536   if (!(*input_file)->open(*this->dirpath_, this->task_, &dummy))
537     return false;
538
539   *memoff = 0;
540   *memsize = (*input_file)->file().filesize();
541   return true;
542 }
543
544 // Return an ELF object for the member at offset OFF.  If
545 // PUNCONFIGURED is not NULL, then if the ELF object has an
546 // unsupported target type, set *PUNCONFIGURED to true and return
547 // NULL.
548
549 Object*
550 Archive::get_elf_object_for_member(off_t off, bool* punconfigured)
551 {
552   if (punconfigured != NULL)
553     *punconfigured = false;
554
555   Input_file* input_file;
556   off_t memoff;
557   off_t memsize;
558   std::string member_name;
559   if (!this->get_file_and_offset(off, &input_file, &memoff, &memsize,
560                                  &member_name))
561     return NULL;
562
563   if (parameters->options().has_plugins())
564     {
565       Object* obj = parameters->options().plugins()->claim_file(input_file,
566                                                                 memoff,
567                                                                 memsize);
568       if (obj != NULL)
569         {
570           // The input file was claimed by a plugin, and its symbols
571           // have been provided by the plugin.
572           return obj;
573         }
574     }
575
576   const unsigned char* ehdr;
577   int read_size;
578   if (!is_elf_object(input_file, memoff, &ehdr, &read_size))
579     {
580       gold_error(_("%s: member at %zu is not an ELF object"),
581                  this->name().c_str(), static_cast<size_t>(off));
582       return NULL;
583     }
584
585   Object* obj = make_elf_object((std::string(this->input_file_->filename())
586                                  + "(" + member_name + ")"),
587                                 input_file, memoff, ehdr, read_size,
588                                 punconfigured);
589   if (obj == NULL)
590     return NULL;
591   obj->set_no_export(this->no_export());
592   return obj;
593 }
594
595 // Read the symbols from all the archive members in the link.
596
597 void
598 Archive::read_all_symbols()
599 {
600   for (Archive::const_iterator p = this->begin();
601        p != this->end();
602        ++p)
603     this->read_symbols(p->off);
604 }
605
606 // Read the symbols from an archive member in the link.  OFF is the file
607 // offset of the member header.
608
609 void
610 Archive::read_symbols(off_t off)
611 {
612   Object* obj = this->get_elf_object_for_member(off, NULL);
613   if (obj == NULL)
614     return;
615
616   Read_symbols_data* sd = new Read_symbols_data;
617   obj->read_symbols(sd);
618   Archive_member member(obj, sd);
619   this->members_[off] = member;
620 }
621
622 Archive::Should_include
623 Archive::should_include_member(Symbol_table* symtab, Layout* layout,
624                                const char* sym_name, Symbol** symp,
625                                std::string* why, char** tmpbufp,
626                                size_t* tmpbuflen)
627 {
628   // In an object file, and therefore in an archive map, an
629   // '@' in the name separates the symbol name from the
630   // version name.  If there are two '@' characters, this is
631   // the default version.
632   char* tmpbuf = *tmpbufp;
633   const char* ver = strchr(sym_name, '@');
634   bool def = false;
635   if (ver != NULL)
636     {
637       size_t symlen = ver - sym_name;
638       if (symlen + 1 > *tmpbuflen)
639         {
640           tmpbuf = static_cast<char*>(xrealloc(tmpbuf, symlen + 1));
641           *tmpbufp = tmpbuf;
642           *tmpbuflen = symlen + 1;
643         }
644       memcpy(tmpbuf, sym_name, symlen);
645       tmpbuf[symlen] = '\0';
646       sym_name = tmpbuf;
647
648       ++ver;
649       if (*ver == '@')
650         {
651           ++ver;
652           def = true;
653         }
654     }
655
656   Symbol* sym = symtab->lookup(sym_name, ver);
657   if (def
658       && ver != NULL
659       && (sym == NULL
660           || !sym->is_undefined()
661           || sym->binding() == elfcpp::STB_WEAK))
662     sym = symtab->lookup(sym_name, NULL);
663
664   *symp = sym;
665
666   if (sym == NULL)
667     {
668       // Check whether the symbol was named in a -u option.
669       if (parameters->options().is_undefined(sym_name))
670         {
671           *why = "-u ";
672           *why += sym_name;
673         }
674       else if (layout->script_options()->is_referenced(sym_name))
675         {
676           size_t alc = 100 + strlen(sym_name);
677           char* buf = new char[alc];
678           snprintf(buf, alc, _("script or expression reference to %s"),
679                    sym_name);
680           *why = buf;
681           delete[] buf;
682         }
683       else
684         return Archive::SHOULD_INCLUDE_UNKNOWN;
685     }
686   else if (!sym->is_undefined())
687     return Archive::SHOULD_INCLUDE_NO;
688   // PR 12001: Do not include an archive when the undefined
689   // symbol has actually been defined on the command line.
690   else if (layout->script_options()->is_pending_assignment(sym_name))
691     return Archive::SHOULD_INCLUDE_NO;
692   else if (sym->binding() == elfcpp::STB_WEAK)
693     return Archive::SHOULD_INCLUDE_UNKNOWN;
694
695   return Archive::SHOULD_INCLUDE_YES;
696 }
697
698 // Select members from the archive and add them to the link.  We walk
699 // through the elements in the archive map, and look each one up in
700 // the symbol table.  If it exists as a strong undefined symbol, we
701 // pull in the corresponding element.  We have to do this in a loop,
702 // since pulling in one element may create new undefined symbols which
703 // may be satisfied by other objects in the archive.  Return true in
704 // the normal case, false if the first member we tried to add from
705 // this archive had an incompatible target.
706
707 bool
708 Archive::add_symbols(Symbol_table* symtab, Layout* layout,
709                      Input_objects* input_objects, Mapfile* mapfile)
710 {
711   ++Archive::total_archives;
712
713   if (this->input_file_->options().whole_archive())
714     return this->include_all_members(symtab, layout, input_objects,
715                                      mapfile);
716
717   Archive::total_members += this->num_members_;
718
719   input_objects->archive_start(this);
720
721   const size_t armap_size = this->armap_.size();
722
723   // This is a quick optimization, since we usually see many symbols
724   // in a row with the same offset.  last_seen_offset holds the last
725   // offset we saw that was present in the seen_offsets_ set.
726   off_t last_seen_offset = -1;
727
728   // Track which symbols in the symbol table we've already found to be
729   // defined.
730
731   char* tmpbuf = NULL;
732   size_t tmpbuflen = 0;
733   bool added_new_object;
734   do
735     {
736       added_new_object = false;
737       for (size_t i = 0; i < armap_size; ++i)
738         {
739           if (this->armap_checked_[i])
740             continue;
741           if (this->armap_[i].file_offset == last_seen_offset)
742             {
743               this->armap_checked_[i] = true;
744               continue;
745             }
746           if (this->seen_offsets_.find(this->armap_[i].file_offset)
747               != this->seen_offsets_.end())
748             {
749               this->armap_checked_[i] = true;
750               last_seen_offset = this->armap_[i].file_offset;
751               continue;
752             }
753
754           const char* sym_name = (this->armap_names_.data()
755                                   + this->armap_[i].name_offset);
756
757           Symbol* sym;
758           std::string why;
759           Archive::Should_include t =
760             Archive::should_include_member(symtab, layout, sym_name, &sym,
761                                            &why, &tmpbuf, &tmpbuflen);
762
763           if (t == Archive::SHOULD_INCLUDE_NO
764               || t == Archive::SHOULD_INCLUDE_YES)
765             this->armap_checked_[i] = true;
766
767           if (t != Archive::SHOULD_INCLUDE_YES)
768             continue;
769
770           // We want to include this object in the link.
771           last_seen_offset = this->armap_[i].file_offset;
772           this->seen_offsets_.insert(last_seen_offset);
773
774           if (!this->include_member(symtab, layout, input_objects,
775                                     last_seen_offset, mapfile, sym,
776                                     why.c_str()))
777             {
778               if (tmpbuf != NULL)
779                 free(tmpbuf);
780               return false;
781             }
782
783           added_new_object = true;
784         }
785     }
786   while (added_new_object);
787
788   if (tmpbuf != NULL)
789     free(tmpbuf);
790
791   input_objects->archive_stop(this);
792
793   return true;
794 }
795
796 // Return whether the archive includes a member which defines the
797 // symbol SYM.
798
799 bool
800 Archive::defines_symbol(Symbol* sym) const
801 {
802   const char* symname = sym->name();
803   size_t symname_len = strlen(symname);
804   size_t armap_size = this->armap_.size();
805   for (size_t i = 0; i < armap_size; ++i)
806     {
807       if (this->armap_checked_[i])
808         continue;
809       const char* archive_symname = (this->armap_names_.data()
810                                      + this->armap_[i].name_offset);
811       if (strncmp(archive_symname, symname, symname_len) != 0)
812         continue;
813       char c = archive_symname[symname_len];
814       if (c == '\0' && sym->version() == NULL)
815         return true;
816       if (c == '@')
817         {
818           const char* ver = archive_symname + symname_len + 1;
819           if (*ver == '@')
820             {
821               if (sym->version() == NULL)
822                 return true;
823               ++ver;
824             }
825           if (sym->version() != NULL && strcmp(sym->version(), ver) == 0)
826             return true;
827         }
828     }
829   return false;
830 }
831
832 // Include all the archive members in the link.  This is for --whole-archive.
833
834 bool
835 Archive::include_all_members(Symbol_table* symtab, Layout* layout,
836                              Input_objects* input_objects, Mapfile* mapfile)
837 {
838   input_objects->archive_start(this);
839
840   if (this->members_.size() > 0)
841     {
842       std::map<off_t, Archive_member>::const_iterator p;
843       for (p = this->members_.begin();
844            p != this->members_.end();
845            ++p)
846         {
847           if (!this->include_member(symtab, layout, input_objects, p->first,
848                                     mapfile, NULL, "--whole-archive"))
849             return false;
850           ++Archive::total_members;
851         }
852     }
853   else
854     {
855       for (Archive::const_iterator p = this->begin();
856            p != this->end();
857            ++p)
858         {
859           if (!this->include_member(symtab, layout, input_objects, p->off,
860                                     mapfile, NULL, "--whole-archive"))
861             return false;
862           ++Archive::total_members;
863         }
864     }
865
866   input_objects->archive_stop(this);
867
868   return true;
869 }
870
871 // Return the number of members in the archive.  This is only used for
872 // reports.
873
874 size_t
875 Archive::count_members()
876 {
877   size_t ret = 0;
878   for (Archive::const_iterator p = this->begin();
879        p != this->end();
880        ++p)
881     ++ret;
882   return ret;
883 }
884
885 // Include an archive member in the link.  OFF is the file offset of
886 // the member header.  WHY is the reason we are including this member.
887 // Return true if we added the member or if we had an error, return
888 // false if this was the first member we tried to add from this
889 // archive and it had an incompatible format.
890
891 bool
892 Archive::include_member(Symbol_table* symtab, Layout* layout,
893                         Input_objects* input_objects, off_t off,
894                         Mapfile* mapfile, Symbol* sym, const char* why)
895 {
896   ++Archive::total_members_loaded;
897
898   std::map<off_t, Archive_member>::const_iterator p = this->members_.find(off);
899   if (p != this->members_.end())
900     {
901       Object* obj = p->second.obj_;
902
903       Read_symbols_data* sd = p->second.sd_;
904       if (mapfile != NULL)
905         mapfile->report_include_archive_member(obj->name(), sym, why);
906       if (input_objects->add_object(obj))
907         {
908           obj->layout(symtab, layout, sd);
909           obj->add_symbols(symtab, sd, layout);
910           this->included_member_ = true;
911         }
912       delete sd;
913       return true;
914     }
915
916   // If this is the first object we are including from this archive,
917   // and we searched for this archive, most likely because it was
918   // found via a -l option, then if the target is incompatible we want
919   // to move on to the next archive found in the search path.
920   bool unconfigured = false;
921   bool* punconfigured = NULL;
922   if (!this->included_member_ && this->searched_for())
923     punconfigured = &unconfigured;
924
925   Object* obj = this->get_elf_object_for_member(off, punconfigured);
926   if (obj == NULL)
927     {
928       // Return false to search for another archive, true if we found
929       // an error.
930       return unconfigured ? false : true;
931     }
932
933   if (mapfile != NULL)
934     mapfile->report_include_archive_member(obj->name(), sym, why);
935
936   Pluginobj* pluginobj = obj->pluginobj();
937   if (pluginobj != NULL)
938     {
939       pluginobj->add_symbols(symtab, NULL, layout);
940       this->included_member_ = true;
941       return true;
942     }
943
944   if (!input_objects->add_object(obj))
945     {
946       // If this is an external member of a thin archive, unlock the
947       // file.
948       if (obj->offset() == 0)
949         obj->unlock(this->task_);
950       delete obj;
951     }
952   else
953     {
954       {
955         if (layout->incremental_inputs() != NULL)
956           layout->incremental_inputs()->report_object(obj, this);
957         Read_symbols_data sd;
958         obj->read_symbols(&sd);
959         obj->layout(symtab, layout, &sd);
960         obj->add_symbols(symtab, &sd, layout);
961       }
962
963       // If this is an external member of a thin archive, unlock the file
964       // for the next task.
965       if (obj->offset() == 0)
966         obj->unlock(this->task_);
967
968       this->included_member_ = true;
969     }
970
971   return true;
972 }
973
974 // Print statistical information to stderr.  This is used for --stats.
975
976 void
977 Archive::print_stats()
978 {
979   fprintf(stderr, _("%s: archive libraries: %u\n"),
980           program_name, Archive::total_archives);
981   fprintf(stderr, _("%s: total archive members: %u\n"),
982           program_name, Archive::total_members);
983   fprintf(stderr, _("%s: loaded archive members: %u\n"),
984           program_name, Archive::total_members_loaded);
985 }
986
987 // Add_archive_symbols methods.
988
989 Add_archive_symbols::~Add_archive_symbols()
990 {
991   if (this->this_blocker_ != NULL)
992     delete this->this_blocker_;
993   // next_blocker_ is deleted by the task associated with the next
994   // input file.
995 }
996
997 // Return whether we can add the archive symbols.  We are blocked by
998 // this_blocker_.  We block next_blocker_.  We also lock the file.
999
1000 Task_token*
1001 Add_archive_symbols::is_runnable()
1002 {
1003   if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked())
1004     return this->this_blocker_;
1005   return NULL;
1006 }
1007
1008 void
1009 Add_archive_symbols::locks(Task_locker* tl)
1010 {
1011   tl->add(this, this->next_blocker_);
1012   tl->add(this, this->archive_->token());
1013 }
1014
1015 void
1016 Add_archive_symbols::run(Workqueue* workqueue)
1017 {
1018   // For an incremental link, begin recording layout information.
1019   Incremental_inputs* incremental_inputs = this->layout_->incremental_inputs();
1020   if (incremental_inputs != NULL)
1021     incremental_inputs->report_archive_begin(this->archive_);
1022
1023   bool added = this->archive_->add_symbols(this->symtab_, this->layout_,
1024                                            this->input_objects_,
1025                                            this->mapfile_);
1026   this->archive_->unlock_nested_archives();
1027
1028   this->archive_->release();
1029   this->archive_->clear_uncached_views();
1030
1031   if (!added)
1032     {
1033       // This archive holds object files which are incompatible with
1034       // our output file.
1035       Read_symbols::incompatible_warning(this->input_argument_,
1036                                          this->archive_->input_file());
1037       Read_symbols::requeue(workqueue, this->input_objects_, this->symtab_,
1038                             this->layout_, this->dirpath_, this->dirindex_,
1039                             this->mapfile_, this->input_argument_,
1040                             this->input_group_, this->next_blocker_);
1041       delete this->archive_;
1042       return;
1043     }
1044
1045   if (this->input_group_ != NULL)
1046     this->input_group_->add_archive(this->archive_);
1047   else
1048     {
1049       // For an incremental link, finish recording the layout information.
1050       Incremental_inputs* incremental_inputs = this->layout_->incremental_inputs();
1051       if (incremental_inputs != NULL)
1052         incremental_inputs->report_archive_end(this->archive_);
1053
1054       if (!parameters->options().has_plugins()
1055           || this->archive_->input_file()->options().whole_archive())
1056         {
1057           // We no longer need to know about this archive.
1058           delete this->archive_;
1059         }
1060       else
1061         {
1062           // The plugin interface may want to rescan this archive.
1063           parameters->options().plugins()->save_archive(this->archive_);
1064         }
1065
1066       this->archive_ = NULL;
1067     }
1068 }
1069
1070 // Class Lib_group static variables.
1071 unsigned int Lib_group::total_lib_groups;
1072 unsigned int Lib_group::total_members;
1073 unsigned int Lib_group::total_members_loaded;
1074
1075 Lib_group::Lib_group(const Input_file_lib* lib, Task* task)
1076   : lib_(lib), task_(task), members_()
1077 {
1078   this->members_.resize(lib->size());
1079 }
1080
1081 // Select members from the lib group and add them to the link.  We walk
1082 // through the members, and check if each one up should be included.
1083 // If the object says it should be included, we do so.  We have to do
1084 // this in a loop, since including one member may create new undefined
1085 // symbols which may be satisfied by other members.
1086
1087 void
1088 Lib_group::add_symbols(Symbol_table* symtab, Layout* layout,
1089                        Input_objects* input_objects)
1090 {
1091   ++Lib_group::total_lib_groups;
1092
1093   Lib_group::total_members += this->members_.size();
1094
1095   bool added_new_object;
1096   do
1097     {
1098       added_new_object = false;
1099       unsigned int i = 0;
1100       while (i < this->members_.size())
1101         {
1102           const Archive_member& member = this->members_[i];
1103           Object* obj = member.obj_;
1104           std::string why;
1105
1106           // Skip files with no symbols. Plugin objects have
1107           // member.sd_ == NULL.
1108           if (obj != NULL
1109               && (member.sd_ == NULL || member.sd_->symbol_names != NULL))
1110             {
1111               Archive::Should_include t = obj->should_include_member(symtab,
1112                                                                      layout,
1113                                                                      member.sd_,
1114                                                                      &why);
1115
1116               if (t != Archive::SHOULD_INCLUDE_YES)
1117                 {
1118                   ++i;
1119                   continue;
1120                 }
1121
1122               this->include_member(symtab, layout, input_objects, member);
1123
1124               added_new_object = true;
1125             }
1126           else
1127             {
1128               if (member.sd_ != NULL)
1129                 {
1130                   // The file must be locked in order to destroy the views
1131                   // associated with it.
1132                   gold_assert(obj != NULL);
1133                   obj->lock(this->task_);
1134                   delete member.sd_;
1135                   obj->unlock(this->task_);
1136                 }
1137             }
1138
1139           this->members_[i] = this->members_.back();
1140           this->members_.pop_back();
1141         }
1142     }
1143   while (added_new_object);
1144 }
1145
1146 // Include a lib group member in the link.
1147
1148 void
1149 Lib_group::include_member(Symbol_table* symtab, Layout* layout,
1150                           Input_objects* input_objects,
1151                           const Archive_member& member)
1152 {
1153   ++Lib_group::total_members_loaded;
1154
1155   Object* obj = member.obj_;
1156   gold_assert(obj != NULL);
1157
1158   Pluginobj* pluginobj = obj->pluginobj();
1159   if (pluginobj != NULL)
1160     {
1161       pluginobj->add_symbols(symtab, NULL, layout);
1162       return;
1163     }
1164
1165   Read_symbols_data* sd = member.sd_;
1166   gold_assert(sd != NULL);
1167   obj->lock(this->task_);
1168   if (input_objects->add_object(obj))
1169     {
1170       // FIXME: Record incremental link info for --start-lib/--end-lib.
1171       if (layout->incremental_inputs() != NULL)
1172         layout->incremental_inputs()->report_object(obj, NULL);
1173       obj->layout(symtab, layout, sd);
1174       obj->add_symbols(symtab, sd, layout);
1175     }
1176   delete sd;
1177   // Unlock the file for the next task.
1178   obj->unlock(this->task_);
1179 }
1180
1181 // Print statistical information to stderr.  This is used for --stats.
1182
1183 void
1184 Lib_group::print_stats()
1185 {
1186   fprintf(stderr, _("%s: lib groups: %u\n"),
1187           program_name, Lib_group::total_lib_groups);
1188   fprintf(stderr, _("%s: total lib groups members: %u\n"),
1189           program_name, Lib_group::total_members);
1190   fprintf(stderr, _("%s: loaded lib groups members: %u\n"),
1191           program_name, Lib_group::total_members_loaded);
1192 }
1193
1194 Task_token*
1195 Add_lib_group_symbols::is_runnable()
1196 {
1197   if (this->readsyms_blocker_ != NULL && this->readsyms_blocker_->is_blocked())
1198     return this->readsyms_blocker_;
1199   if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked())
1200     return this->this_blocker_;
1201   return NULL;
1202 }
1203
1204 void
1205 Add_lib_group_symbols::locks(Task_locker* tl)
1206 {
1207   tl->add(this, this->next_blocker_);
1208 }
1209
1210 void
1211 Add_lib_group_symbols::run(Workqueue*)
1212 {
1213   this->lib_->add_symbols(this->symtab_, this->layout_, this->input_objects_);
1214
1215   // FIXME: Record incremental link info for --start_lib/--end_lib.
1216 }
1217
1218 Add_lib_group_symbols::~Add_lib_group_symbols()
1219 {
1220   if (this->this_blocker_ != NULL)
1221     delete this->this_blocker_;
1222   // next_blocker_ is deleted by the task associated with the next
1223   // input file.
1224 }
1225
1226 } // End namespace gold.