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