Home | History | Annotate | Download | only in gold
      1 // fileread.cc -- read files for gold
      2 
      3 // Copyright (C) 2006-2016 Free Software Foundation, Inc.
      4 // Written by Ian Lance Taylor <iant (at) 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 <cstring>
     26 #include <cerrno>
     27 #include <climits>
     28 #include <fcntl.h>
     29 #include <unistd.h>
     30 
     31 #ifdef HAVE_SYS_MMAN_H
     32 #include <sys/mman.h>
     33 #endif
     34 
     35 #ifdef HAVE_READV
     36 #include <sys/uio.h>
     37 #endif
     38 
     39 #include <sys/stat.h>
     40 #include "filenames.h"
     41 
     42 #include "debug.h"
     43 #include "parameters.h"
     44 #include "options.h"
     45 #include "dirsearch.h"
     46 #include "target.h"
     47 #include "binary.h"
     48 #include "descriptors.h"
     49 #include "gold-threads.h"
     50 #include "fileread.h"
     51 
     52 // For systems without mmap support.
     53 #ifndef HAVE_MMAP
     54 # define mmap gold_mmap
     55 # define munmap gold_munmap
     56 # ifndef MAP_FAILED
     57 #  define MAP_FAILED (reinterpret_cast<void*>(-1))
     58 # endif
     59 # ifndef PROT_READ
     60 #  define PROT_READ 0
     61 # endif
     62 # ifndef MAP_PRIVATE
     63 #  define MAP_PRIVATE 0
     64 # endif
     65 
     66 # ifndef ENOSYS
     67 #  define ENOSYS EINVAL
     68 # endif
     69 
     70 static void *
     71 gold_mmap(void *, size_t, int, int, int, off_t)
     72 {
     73   errno = ENOSYS;
     74   return MAP_FAILED;
     75 }
     76 
     77 static int
     78 gold_munmap(void *, size_t)
     79 {
     80   errno = ENOSYS;
     81   return -1;
     82 }
     83 
     84 #endif
     85 
     86 #ifndef HAVE_READV
     87 struct iovec { void* iov_base; size_t iov_len; };
     88 ssize_t
     89 readv(int, const iovec*, int)
     90 {
     91   gold_unreachable();
     92 }
     93 #endif
     94 
     95 namespace gold
     96 {
     97 
     98 // Get the last modified time of an unopened file.
     99 
    100 bool
    101 get_mtime(const char* filename, Timespec* mtime)
    102 {
    103   struct stat file_stat;
    104 
    105   if (stat(filename, &file_stat) < 0)
    106     return false;
    107 #ifdef HAVE_STAT_ST_MTIM
    108   mtime->seconds = file_stat.st_mtim.tv_sec;
    109   mtime->nanoseconds = file_stat.st_mtim.tv_nsec;
    110 #else
    111   mtime->seconds = file_stat.st_mtime;
    112   mtime->nanoseconds = 0;
    113 #endif
    114   return true;
    115 }
    116 
    117 // Class File_read.
    118 
    119 // A lock for the File_read static variables.
    120 static Lock* file_counts_lock = NULL;
    121 static Initialize_lock file_counts_initialize_lock(&file_counts_lock);
    122 
    123 // The File_read static variables.
    124 unsigned long long File_read::total_mapped_bytes;
    125 unsigned long long File_read::current_mapped_bytes;
    126 unsigned long long File_read::maximum_mapped_bytes;
    127 
    128 // Class File_read::View.
    129 
    130 File_read::View::~View()
    131 {
    132   gold_assert(!this->is_locked());
    133   switch (this->data_ownership_)
    134     {
    135     case DATA_ALLOCATED_ARRAY:
    136       free(const_cast<unsigned char*>(this->data_));
    137       break;
    138     case DATA_MMAPPED:
    139       if (::munmap(const_cast<unsigned char*>(this->data_), this->size_) != 0)
    140 	gold_warning(_("munmap failed: %s"), strerror(errno));
    141       if (!parameters->options_valid() || parameters->options().stats())
    142 	{
    143 	  file_counts_initialize_lock.initialize();
    144 	  Hold_optional_lock hl(file_counts_lock);
    145 	  File_read::current_mapped_bytes -= this->size_;
    146 	}
    147       break;
    148     case DATA_NOT_OWNED:
    149       break;
    150     default:
    151       gold_unreachable();
    152     }
    153 }
    154 
    155 void
    156 File_read::View::lock()
    157 {
    158   ++this->lock_count_;
    159 }
    160 
    161 void
    162 File_read::View::unlock()
    163 {
    164   gold_assert(this->lock_count_ > 0);
    165   --this->lock_count_;
    166 }
    167 
    168 bool
    169 File_read::View::is_locked()
    170 {
    171   return this->lock_count_ > 0;
    172 }
    173 
    174 // Class File_read.
    175 
    176 File_read::~File_read()
    177 {
    178   gold_assert(this->token_.is_writable());
    179   if (this->is_descriptor_opened_)
    180     {
    181       release_descriptor(this->descriptor_, true);
    182       this->descriptor_ = -1;
    183       this->is_descriptor_opened_ = false;
    184     }
    185   this->name_.clear();
    186   this->clear_views(CLEAR_VIEWS_ALL);
    187 }
    188 
    189 // Open the file.
    190 
    191 bool
    192 File_read::open(const Task* task, const std::string& name)
    193 {
    194   gold_assert(this->token_.is_writable()
    195 	      && this->descriptor_ < 0
    196 	      && !this->is_descriptor_opened_
    197 	      && this->name_.empty());
    198   this->name_ = name;
    199 
    200   this->descriptor_ = open_descriptor(-1, this->name_.c_str(),
    201 				      O_RDONLY);
    202 
    203   if (this->descriptor_ >= 0)
    204     {
    205       this->is_descriptor_opened_ = true;
    206       struct stat s;
    207       if (::fstat(this->descriptor_, &s) < 0)
    208 	gold_error(_("%s: fstat failed: %s"),
    209 		   this->name_.c_str(), strerror(errno));
    210       this->size_ = s.st_size;
    211       gold_debug(DEBUG_FILES, "Attempt to open %s succeeded",
    212 		 this->name_.c_str());
    213       this->token_.add_writer(task);
    214     }
    215 
    216   return this->descriptor_ >= 0;
    217 }
    218 
    219 // Open the file with the contents in memory.
    220 
    221 bool
    222 File_read::open(const Task* task, const std::string& name,
    223 		const unsigned char* contents, off_t size)
    224 {
    225   gold_assert(this->token_.is_writable()
    226 	      && this->descriptor_ < 0
    227 	      && !this->is_descriptor_opened_
    228 	      && this->name_.empty());
    229   this->name_ = name;
    230   this->whole_file_view_ = new View(0, size, contents, 0, false,
    231 				    View::DATA_NOT_OWNED);
    232   this->add_view(this->whole_file_view_);
    233   this->size_ = size;
    234   this->token_.add_writer(task);
    235   return true;
    236 }
    237 
    238 // Reopen a descriptor if necessary.
    239 
    240 void
    241 File_read::reopen_descriptor()
    242 {
    243   if (!this->is_descriptor_opened_)
    244     {
    245       this->descriptor_ = open_descriptor(this->descriptor_,
    246 					  this->name_.c_str(),
    247 					  O_RDONLY);
    248       if (this->descriptor_ < 0)
    249 	gold_fatal(_("could not reopen file %s"), this->name_.c_str());
    250       this->is_descriptor_opened_ = true;
    251     }
    252 }
    253 
    254 // Release the file.  This is called when we are done with the file in
    255 // a Task.
    256 
    257 void
    258 File_read::release()
    259 {
    260   gold_assert(this->is_locked());
    261 
    262   if (!parameters->options_valid() || parameters->options().stats())
    263     {
    264       file_counts_initialize_lock.initialize();
    265       Hold_optional_lock hl(file_counts_lock);
    266       File_read::total_mapped_bytes += this->mapped_bytes_;
    267       File_read::current_mapped_bytes += this->mapped_bytes_;
    268       if (File_read::current_mapped_bytes > File_read::maximum_mapped_bytes)
    269 	File_read::maximum_mapped_bytes = File_read::current_mapped_bytes;
    270     }
    271 
    272   this->mapped_bytes_ = 0;
    273 
    274   // Only clear views if there is only one attached object.  Otherwise
    275   // we waste time trying to clear cached archive views.  Similarly
    276   // for releasing the descriptor.
    277   if (this->object_count_ <= 1)
    278     {
    279       this->clear_views(CLEAR_VIEWS_NORMAL);
    280       if (this->is_descriptor_opened_)
    281 	{
    282 	  release_descriptor(this->descriptor_, false);
    283 	  this->is_descriptor_opened_ = false;
    284 	}
    285     }
    286 
    287   this->released_ = true;
    288 }
    289 
    290 // Lock the file.
    291 
    292 void
    293 File_read::lock(const Task* task)
    294 {
    295   gold_assert(this->released_);
    296   gold_debug(DEBUG_FILES, "Locking file \"%s\"", this->name_.c_str());
    297   this->token_.add_writer(task);
    298   this->released_ = false;
    299 }
    300 
    301 // Unlock the file.
    302 
    303 void
    304 File_read::unlock(const Task* task)
    305 {
    306   gold_debug(DEBUG_FILES, "Unlocking file \"%s\"", this->name_.c_str());
    307   this->release();
    308   this->token_.remove_writer(task);
    309 }
    310 
    311 // Return whether the file is locked.
    312 
    313 bool
    314 File_read::is_locked() const
    315 {
    316   if (!this->token_.is_writable())
    317     return true;
    318   // The file is not locked, so it should have been released.
    319   gold_assert(this->released_);
    320   return false;
    321 }
    322 
    323 // See if we have a view which covers the file starting at START for
    324 // SIZE bytes.  Return a pointer to the View if found, NULL if not.
    325 // If BYTESHIFT is not -1U, the returned View must have the specified
    326 // byte shift; otherwise, it may have any byte shift.  If VSHIFTED is
    327 // not NULL, this sets *VSHIFTED to a view which would have worked if
    328 // not for the requested BYTESHIFT.
    329 
    330 inline File_read::View*
    331 File_read::find_view(off_t start, section_size_type size,
    332 		     unsigned int byteshift, File_read::View** vshifted) const
    333 {
    334   gold_assert(start <= this->size_
    335 	      && (static_cast<unsigned long long>(size)
    336 		  <= static_cast<unsigned long long>(this->size_ - start)));
    337 
    338   if (vshifted != NULL)
    339     *vshifted = NULL;
    340 
    341   // If we have the whole file mmapped, and the alignment is right,
    342   // we can return it.
    343   if (this->whole_file_view_)
    344     if (byteshift == -1U || byteshift == 0)
    345       return this->whole_file_view_;
    346 
    347   off_t page = File_read::page_offset(start);
    348 
    349   unsigned int bszero = 0;
    350   Views::const_iterator p = this->views_.upper_bound(std::make_pair(page - 1,
    351 								    bszero));
    352 
    353   while (p != this->views_.end() && p->first.first <= page)
    354     {
    355       if (p->second->start() <= start
    356 	  && (p->second->start() + static_cast<off_t>(p->second->size())
    357 	      >= start + static_cast<off_t>(size)))
    358 	{
    359 	  if (byteshift == -1U || byteshift == p->second->byteshift())
    360 	    {
    361 	      p->second->set_accessed();
    362 	      return p->second;
    363 	    }
    364 
    365 	  if (vshifted != NULL && *vshifted == NULL)
    366 	    *vshifted = p->second;
    367 	}
    368 
    369       ++p;
    370     }
    371 
    372   return NULL;
    373 }
    374 
    375 // Read SIZE bytes from the file starting at offset START.  Read into
    376 // the buffer at P.
    377 
    378 void
    379 File_read::do_read(off_t start, section_size_type size, void* p)
    380 {
    381   ssize_t bytes;
    382   if (this->whole_file_view_ != NULL)
    383     {
    384       bytes = this->size_ - start;
    385       if (static_cast<section_size_type>(bytes) >= size)
    386 	{
    387 	  memcpy(p, this->whole_file_view_->data() + start, size);
    388 	  return;
    389 	}
    390     }
    391   else
    392     {
    393       this->reopen_descriptor();
    394 
    395       char *read_ptr = static_cast<char *>(p);
    396       off_t read_pos = start;
    397       size_t to_read = size;
    398       do
    399 	{
    400 	  bytes = ::pread(this->descriptor_, read_ptr, to_read, read_pos);
    401 	  if (bytes < 0)
    402 	    gold_fatal(_("%s: pread failed: %s"),
    403 		       this->filename().c_str(), strerror(errno));
    404 
    405 	  read_pos += bytes;
    406 	  read_ptr += bytes;
    407 	  to_read -= bytes;
    408 	  if (to_read == 0)
    409 	    return;
    410 	}
    411       while (bytes > 0);
    412 
    413       bytes = size - to_read;
    414     }
    415 
    416   gold_fatal(_("%s: file too short: read only %lld of %lld bytes at %lld"),
    417 	     this->filename().c_str(),
    418 	     static_cast<long long>(bytes),
    419 	     static_cast<long long>(size),
    420 	     static_cast<long long>(start));
    421 }
    422 
    423 // Read data from the file.
    424 
    425 void
    426 File_read::read(off_t start, section_size_type size, void* p)
    427 {
    428   const File_read::View* pv = this->find_view(start, size, -1U, NULL);
    429   if (pv != NULL)
    430     {
    431       memcpy(p, pv->data() + (start - pv->start() + pv->byteshift()), size);
    432       return;
    433     }
    434 
    435   this->do_read(start, size, p);
    436 }
    437 
    438 // Add a new view.  There may already be an existing view at this
    439 // offset.  If there is, the new view will be larger, and should
    440 // replace the old view.
    441 
    442 void
    443 File_read::add_view(File_read::View* v)
    444 {
    445   std::pair<Views::iterator, bool> ins =
    446     this->views_.insert(std::make_pair(std::make_pair(v->start(),
    447 						      v->byteshift()),
    448 				       v));
    449   if (ins.second)
    450     return;
    451 
    452   // There was an existing view at this offset.  It must not be large
    453   // enough.  We can't delete it here, since something might be using
    454   // it; we put it on a list to be deleted when the file is unlocked.
    455   File_read::View* vold = ins.first->second;
    456   gold_assert(vold->size() < v->size());
    457   if (vold->should_cache())
    458     {
    459       v->set_cache();
    460       vold->clear_cache();
    461     }
    462   this->saved_views_.push_back(vold);
    463 
    464   ins.first->second = v;
    465 }
    466 
    467 // Make a new view with a specified byteshift, reading the data from
    468 // the file.
    469 
    470 File_read::View*
    471 File_read::make_view(off_t start, section_size_type size,
    472 		     unsigned int byteshift, bool cache)
    473 {
    474   gold_assert(size > 0);
    475   gold_assert(start <= this->size_
    476 	      && (static_cast<unsigned long long>(size)
    477 		  <= static_cast<unsigned long long>(this->size_ - start)));
    478 
    479   off_t poff = File_read::page_offset(start);
    480 
    481   section_size_type psize = File_read::pages(size + (start - poff));
    482 
    483   if (poff + static_cast<off_t>(psize) >= this->size_)
    484     {
    485       psize = this->size_ - poff;
    486       gold_assert(psize >= size);
    487     }
    488 
    489   void* p;
    490   View::Data_ownership ownership;
    491   if (byteshift != 0)
    492     {
    493       p = malloc(psize + byteshift);
    494       if (p == NULL)
    495 	gold_nomem();
    496       memset(p, 0, byteshift);
    497       this->do_read(poff, psize, static_cast<unsigned char*>(p) + byteshift);
    498       ownership = View::DATA_ALLOCATED_ARRAY;
    499     }
    500   else
    501     {
    502       this->reopen_descriptor();
    503       p = ::mmap(NULL, psize, PROT_READ, MAP_PRIVATE, this->descriptor_, poff);
    504       if (p != MAP_FAILED)
    505 	{
    506 	  ownership = View::DATA_MMAPPED;
    507 	  this->mapped_bytes_ += psize;
    508 	}
    509       else
    510 	{
    511 	  p = malloc(psize);
    512 	  if (p == NULL)
    513 	    gold_nomem();
    514 	  this->do_read(poff, psize, p);
    515 	  ownership = View::DATA_ALLOCATED_ARRAY;
    516 	}
    517     }
    518 
    519   const unsigned char* pbytes = static_cast<const unsigned char*>(p);
    520   File_read::View* v = new File_read::View(poff, psize, pbytes, byteshift,
    521 					   cache, ownership);
    522 
    523   this->add_view(v);
    524 
    525   return v;
    526 }
    527 
    528 // Find a View or make a new one, shifted as required by the file
    529 // offset OFFSET and ALIGNED.
    530 
    531 File_read::View*
    532 File_read::find_or_make_view(off_t offset, off_t start,
    533 			     section_size_type size, bool aligned, bool cache)
    534 {
    535   // Check that start and end of the view are within the file.
    536   if (start > this->size_
    537       || (static_cast<unsigned long long>(size)
    538 	  > static_cast<unsigned long long>(this->size_ - start)))
    539     gold_fatal(_("%s: attempt to map %lld bytes at offset %lld exceeds "
    540 		 "size of file; the file may be corrupt"),
    541 		   this->filename().c_str(),
    542 		   static_cast<long long>(size),
    543 		   static_cast<long long>(start));
    544 
    545   unsigned int byteshift;
    546   if (offset == 0)
    547     byteshift = 0;
    548   else
    549     {
    550       unsigned int target_size = (!parameters->target_valid()
    551 				  ? 64
    552 				  : parameters->target().get_size());
    553       byteshift = offset & ((target_size / 8) - 1);
    554 
    555       // Set BYTESHIFT to the number of dummy bytes which must be
    556       // inserted before the data in order for this data to be
    557       // aligned.
    558       if (byteshift != 0)
    559 	byteshift = (target_size / 8) - byteshift;
    560     }
    561 
    562   // If --map-whole-files is set, make sure we have a
    563   // whole file view.  Options may not yet be ready, e.g.,
    564   // when reading a version script.  We then default to
    565   // --no-map-whole-files.
    566   if (this->whole_file_view_ == NULL
    567       && parameters->options_valid()
    568       && parameters->options().map_whole_files())
    569     this->whole_file_view_ = this->make_view(0, this->size_, 0, cache);
    570 
    571   // Try to find a View with the required BYTESHIFT.
    572   File_read::View* vshifted;
    573   File_read::View* v = this->find_view(offset + start, size,
    574 				       aligned ? byteshift : -1U,
    575 				       &vshifted);
    576   if (v != NULL)
    577     {
    578       if (cache)
    579 	v->set_cache();
    580       return v;
    581     }
    582 
    583   // If VSHIFTED is not NULL, then it has the data we need, but with
    584   // the wrong byteshift.
    585   v = vshifted;
    586   if (v != NULL)
    587     {
    588       gold_assert(aligned);
    589 
    590       unsigned char* pbytes;
    591       pbytes = static_cast<unsigned char*>(malloc(v->size() + byteshift));
    592       if (pbytes == NULL)
    593 	gold_nomem();
    594       memset(pbytes, 0, byteshift);
    595       memcpy(pbytes + byteshift, v->data() + v->byteshift(), v->size());
    596 
    597       File_read::View* shifted_view =
    598 	  new File_read::View(v->start(), v->size(), pbytes, byteshift,
    599 			      cache, View::DATA_ALLOCATED_ARRAY);
    600 
    601       this->add_view(shifted_view);
    602       return shifted_view;
    603     }
    604 
    605   // Make a new view.  If we don't need an aligned view, use a
    606   // byteshift of 0, so that we can use mmap.
    607   return this->make_view(offset + start, size,
    608 			 aligned ? byteshift : 0,
    609 			 cache);
    610 }
    611 
    612 // Get a view into the file.
    613 
    614 const unsigned char*
    615 File_read::get_view(off_t offset, off_t start, section_size_type size,
    616 		    bool aligned, bool cache)
    617 {
    618   File_read::View* pv = this->find_or_make_view(offset, start, size,
    619 						aligned, cache);
    620   return pv->data() + (offset + start - pv->start() + pv->byteshift());
    621 }
    622 
    623 File_view*
    624 File_read::get_lasting_view(off_t offset, off_t start, section_size_type size,
    625 			    bool aligned, bool cache)
    626 {
    627   File_read::View* pv = this->find_or_make_view(offset, start, size,
    628 						aligned, cache);
    629   pv->lock();
    630   return new File_view(*this, pv,
    631 		       (pv->data()
    632 			+ (offset + start - pv->start() + pv->byteshift())));
    633 }
    634 
    635 // Use readv to read COUNT entries from RM starting at START.  BASE
    636 // must be added to all file offsets in RM.
    637 
    638 void
    639 File_read::do_readv(off_t base, const Read_multiple& rm, size_t start,
    640 		    size_t count)
    641 {
    642   unsigned char discard[File_read::page_size];
    643   iovec iov[File_read::max_readv_entries * 2];
    644   size_t iov_index = 0;
    645 
    646   off_t first_offset = rm[start].file_offset;
    647   off_t last_offset = first_offset;
    648   ssize_t want = 0;
    649   for (size_t i = 0; i < count; ++i)
    650     {
    651       const Read_multiple_entry& i_entry(rm[start + i]);
    652 
    653       if (i_entry.file_offset > last_offset)
    654 	{
    655 	  size_t skip = i_entry.file_offset - last_offset;
    656 	  gold_assert(skip <= sizeof discard);
    657 
    658 	  iov[iov_index].iov_base = discard;
    659 	  iov[iov_index].iov_len = skip;
    660 	  ++iov_index;
    661 
    662 	  want += skip;
    663 	}
    664 
    665       iov[iov_index].iov_base = i_entry.buffer;
    666       iov[iov_index].iov_len = i_entry.size;
    667       ++iov_index;
    668 
    669       want += i_entry.size;
    670 
    671       last_offset = i_entry.file_offset + i_entry.size;
    672     }
    673 
    674   this->reopen_descriptor();
    675 
    676   gold_assert(iov_index < sizeof iov / sizeof iov[0]);
    677 
    678   if (::lseek(this->descriptor_, base + first_offset, SEEK_SET) < 0)
    679     gold_fatal(_("%s: lseek failed: %s"),
    680 	       this->filename().c_str(), strerror(errno));
    681 
    682   ssize_t got = ::readv(this->descriptor_, iov, iov_index);
    683 
    684   if (got < 0)
    685     gold_fatal(_("%s: readv failed: %s"),
    686 	       this->filename().c_str(), strerror(errno));
    687   if (got != want)
    688     gold_fatal(_("%s: file too short: read only %zd of %zd bytes at %lld"),
    689 	       this->filename().c_str(),
    690 	       got, want, static_cast<long long>(base + first_offset));
    691 }
    692 
    693 // Portable IOV_MAX.
    694 
    695 #if !defined(HAVE_READV)
    696 #define GOLD_IOV_MAX 1
    697 #elif defined(IOV_MAX)
    698 #define GOLD_IOV_MAX IOV_MAX
    699 #else
    700 #define GOLD_IOV_MAX (File_read::max_readv_entries * 2)
    701 #endif
    702 
    703 // Read several pieces of data from the file.
    704 
    705 void
    706 File_read::read_multiple(off_t base, const Read_multiple& rm)
    707 {
    708   static size_t iov_max = GOLD_IOV_MAX;
    709   size_t count = rm.size();
    710   size_t i = 0;
    711   while (i < count)
    712     {
    713       // Find up to MAX_READV_ENTRIES consecutive entries which are
    714       // less than one page apart.
    715       const Read_multiple_entry& i_entry(rm[i]);
    716       off_t i_off = i_entry.file_offset;
    717       off_t end_off = i_off + i_entry.size;
    718       size_t j;
    719       for (j = i + 1; j < count; ++j)
    720 	{
    721 	  if (j - i >= File_read::max_readv_entries || j - i >= iov_max / 2)
    722 	    break;
    723 	  const Read_multiple_entry& j_entry(rm[j]);
    724 	  off_t j_off = j_entry.file_offset;
    725 	  gold_assert(j_off >= end_off);
    726 	  off_t j_end_off = j_off + j_entry.size;
    727 	  if (j_end_off - end_off >= File_read::page_size)
    728 	    break;
    729 	  end_off = j_end_off;
    730 	}
    731 
    732       if (j == i + 1)
    733 	this->read(base + i_off, i_entry.size, i_entry.buffer);
    734       else
    735 	{
    736 	  File_read::View* view = this->find_view(base + i_off,
    737 						  end_off - i_off,
    738 						  -1U, NULL);
    739 	  if (view == NULL)
    740 	    this->do_readv(base, rm, i, j - i);
    741 	  else
    742 	    {
    743 	      const unsigned char* v = (view->data()
    744 					+ (base + i_off - view->start()
    745 					   + view->byteshift()));
    746 	      for (size_t k = i; k < j; ++k)
    747 		{
    748 		  const Read_multiple_entry& k_entry(rm[k]);
    749 		  gold_assert((convert_to_section_size_type(k_entry.file_offset
    750 							   - i_off)
    751 			       + k_entry.size)
    752 			      <= convert_to_section_size_type(end_off
    753 							      - i_off));
    754 		  memcpy(k_entry.buffer,
    755 			 v + (k_entry.file_offset - i_off),
    756 			 k_entry.size);
    757 		}
    758 	    }
    759 	}
    760 
    761       i = j;
    762     }
    763 }
    764 
    765 // Mark all views as no longer cached.
    766 
    767 void
    768 File_read::clear_view_cache_marks()
    769 {
    770   // Just ignore this if there are multiple objects associated with
    771   // the file.  Otherwise we will wind up uncaching and freeing some
    772   // views for other objects.
    773   if (this->object_count_ > 1)
    774     return;
    775 
    776   for (Views::iterator p = this->views_.begin();
    777        p != this->views_.end();
    778        ++p)
    779     p->second->clear_cache();
    780   for (Saved_views::iterator p = this->saved_views_.begin();
    781        p != this->saved_views_.end();
    782        ++p)
    783     (*p)->clear_cache();
    784 }
    785 
    786 // Remove all the file views.  For a file which has multiple
    787 // associated objects (i.e., an archive), we keep accessed views
    788 // around until next time, in the hopes that they will be useful for
    789 // the next object.
    790 
    791 void
    792 File_read::clear_views(Clear_views_mode mode)
    793 {
    794   bool keep_files_mapped = (parameters->options_valid()
    795 			    && parameters->options().keep_files_mapped());
    796   Views::iterator p = this->views_.begin();
    797   while (p != this->views_.end())
    798     {
    799       bool should_delete;
    800       if (p->second->is_locked() || p->second->is_permanent_view())
    801 	should_delete = false;
    802       else if (mode == CLEAR_VIEWS_ALL)
    803 	should_delete = true;
    804       else if ((p->second->should_cache()
    805 		|| p->second == this->whole_file_view_)
    806 	       && keep_files_mapped)
    807 	should_delete = false;
    808       else if (this->object_count_ > 1
    809 	       && p->second->accessed()
    810 	       && mode != CLEAR_VIEWS_ARCHIVE)
    811 	should_delete = false;
    812       else
    813 	should_delete = true;
    814 
    815       if (should_delete)
    816 	{
    817 	  if (p->second == this->whole_file_view_)
    818 	    this->whole_file_view_ = NULL;
    819 	  delete p->second;
    820 
    821 	  // map::erase invalidates only the iterator to the deleted
    822 	  // element.
    823 	  Views::iterator pe = p;
    824 	  ++p;
    825 	  this->views_.erase(pe);
    826 	}
    827       else
    828 	{
    829 	  p->second->clear_accessed();
    830 	  ++p;
    831 	}
    832     }
    833 
    834   Saved_views::iterator q = this->saved_views_.begin();
    835   while (q != this->saved_views_.end())
    836     {
    837       if (!(*q)->is_locked())
    838 	{
    839 	  delete *q;
    840 	  q = this->saved_views_.erase(q);
    841 	}
    842       else
    843 	{
    844 	  gold_assert(mode != CLEAR_VIEWS_ALL);
    845 	  ++q;
    846 	}
    847     }
    848 }
    849 
    850 // Print statistical information to stderr.  This is used for --stats.
    851 
    852 void
    853 File_read::print_stats()
    854 {
    855   fprintf(stderr, _("%s: total bytes mapped for read: %llu\n"),
    856 	  program_name, File_read::total_mapped_bytes);
    857   fprintf(stderr, _("%s: maximum bytes mapped for read at one time: %llu\n"),
    858 	  program_name, File_read::maximum_mapped_bytes);
    859 }
    860 
    861 // Class File_view.
    862 
    863 File_view::~File_view()
    864 {
    865   gold_assert(this->file_.is_locked());
    866   this->view_->unlock();
    867 }
    868 
    869 // Class Input_file.
    870 
    871 // Create a file given just the filename.
    872 
    873 Input_file::Input_file(const char* name)
    874   : found_name_(), file_(), is_in_sysroot_(false), format_(FORMAT_NONE)
    875 {
    876   this->input_argument_ =
    877     new Input_file_argument(name, Input_file_argument::INPUT_FILE_TYPE_FILE,
    878 			    "", false, Position_dependent_options());
    879 }
    880 
    881 // Create a file for testing.
    882 
    883 Input_file::Input_file(const Task* task, const char* name,
    884 		       const unsigned char* contents, off_t size)
    885   : file_()
    886 {
    887   this->input_argument_ =
    888     new Input_file_argument(name, Input_file_argument::INPUT_FILE_TYPE_FILE,
    889 			    "", false, Position_dependent_options());
    890   bool ok = this->file_.open(task, name, contents, size);
    891   gold_assert(ok);
    892 }
    893 
    894 // Return the position dependent options in force for this file.
    895 
    896 const Position_dependent_options&
    897 Input_file::options() const
    898 {
    899   return this->input_argument_->options();
    900 }
    901 
    902 // Return the name given by the user.  For -lc this will return "c".
    903 
    904 const char*
    905 Input_file::name() const
    906 {
    907   return this->input_argument_->name();
    908 }
    909 
    910 // Return whether this file is in a system directory.
    911 
    912 bool
    913 Input_file::is_in_system_directory() const
    914 {
    915   if (this->is_in_sysroot())
    916     return true;
    917   return parameters->options().is_in_system_directory(this->filename());
    918 }
    919 
    920 // Return whether we are only reading symbols.
    921 
    922 bool
    923 Input_file::just_symbols() const
    924 {
    925   return this->input_argument_->just_symbols();
    926 }
    927 
    928 // Return whether this is a file that we will search for in the list
    929 // of directories.
    930 
    931 bool
    932 Input_file::will_search_for() const
    933 {
    934   return (!IS_ABSOLUTE_PATH(this->input_argument_->name())
    935 	  && (this->input_argument_->is_lib()
    936 	      || this->input_argument_->is_searched_file()
    937 	      || this->input_argument_->extra_search_path() != NULL));
    938 }
    939 
    940 // Return the file last modification time.  Calls gold_fatal if the stat
    941 // system call failed.
    942 
    943 Timespec
    944 File_read::get_mtime()
    945 {
    946   struct stat file_stat;
    947   this->reopen_descriptor();
    948 
    949   if (fstat(this->descriptor_, &file_stat) < 0)
    950     gold_fatal(_("%s: stat failed: %s"), this->name_.c_str(),
    951 	       strerror(errno));
    952 #ifdef HAVE_STAT_ST_MTIM
    953   return Timespec(file_stat.st_mtim.tv_sec, file_stat.st_mtim.tv_nsec);
    954 #else
    955   return Timespec(file_stat.st_mtime, 0);
    956 #endif
    957 }
    958 
    959 // Try to find a file in the extra search dirs.  Returns true on success.
    960 
    961 bool
    962 Input_file::try_extra_search_path(int* pindex,
    963 				  const Input_file_argument* input_argument,
    964 				  std::string filename, std::string* found_name,
    965 				  std::string* namep)
    966 {
    967   if (input_argument->extra_search_path() == NULL)
    968     return false;
    969 
    970   std::string name = input_argument->extra_search_path();
    971   if (!IS_DIR_SEPARATOR(name[name.length() - 1]))
    972     name += '/';
    973   name += filename;
    974 
    975   struct stat dummy_stat;
    976   if (*pindex > 0 || ::stat(name.c_str(), &dummy_stat) < 0)
    977     return false;
    978 
    979   *found_name = filename;
    980   *namep = name;
    981   return true;
    982 }
    983 
    984 // Find the actual file.
    985 // If the filename is not absolute, we assume it is in the current
    986 // directory *except* when:
    987 //    A) input_argument_->is_lib() is true;
    988 //    B) input_argument_->is_searched_file() is true; or
    989 //    C) input_argument_->extra_search_path() is not empty.
    990 // In each, we look in extra_search_path + library_path to find
    991 // the file location, rather than the current directory.
    992 
    993 bool
    994 Input_file::find_file(const Dirsearch& dirpath, int* pindex,
    995 		      const Input_file_argument* input_argument,
    996 		      bool* is_in_sysroot,
    997 		      std::string* found_name, std::string* namep)
    998 {
    999   std::string name;
   1000 
   1001   // Case 1: name is an absolute file, just try to open it
   1002   // Case 2: name is relative but is_lib is false, is_searched_file is false,
   1003   //         and extra_search_path is empty
   1004   if (IS_ABSOLUTE_PATH(input_argument->name())
   1005       || (!input_argument->is_lib()
   1006 	  && !input_argument->is_searched_file()
   1007 	  && input_argument->extra_search_path() == NULL))
   1008     {
   1009       name = input_argument->name();
   1010       *found_name = name;
   1011       *namep = name;
   1012       return true;
   1013     }
   1014   // Case 3: is_lib is true or is_searched_file is true
   1015   else if (input_argument->is_lib()
   1016 	   || input_argument->is_searched_file())
   1017     {
   1018       std::vector<std::string> names;
   1019       names.reserve(2);
   1020       if (input_argument->is_lib())
   1021 	{
   1022 	  std::string prefix = "lib";
   1023 	  prefix += input_argument->name();
   1024 	  if (parameters->options().is_static()
   1025 	      || !input_argument->options().Bdynamic())
   1026 	    names.push_back(prefix + ".a");
   1027 	  else
   1028 	    {
   1029 	      names.push_back(prefix + ".so");
   1030 	      names.push_back(prefix + ".a");
   1031 	    }
   1032 	}
   1033       else
   1034 	names.push_back(input_argument->name());
   1035 
   1036       for (std::vector<std::string>::const_iterator n = names.begin();
   1037 	   n != names.end();
   1038 	   ++n)
   1039 	if (Input_file::try_extra_search_path(pindex, input_argument, *n,
   1040 					      found_name, namep))
   1041 	  return true;
   1042 
   1043       // It is not in the extra_search_path.
   1044       name = dirpath.find(names, is_in_sysroot, pindex, found_name);
   1045       if (name.empty())
   1046 	{
   1047 	  gold_error(_("cannot find %s%s"),
   1048 		     input_argument->is_lib() ? "-l" : "",
   1049 		     input_argument->name());
   1050 	  return false;
   1051 	}
   1052       *namep = name;
   1053       return true;
   1054     }
   1055   // Case 4: extra_search_path is not empty
   1056   else
   1057     {
   1058       gold_assert(input_argument->extra_search_path() != NULL);
   1059 
   1060       if (try_extra_search_path(pindex, input_argument, input_argument->name(),
   1061 				found_name, namep))
   1062 	return true;
   1063 
   1064       // extra_search_path failed, so check the normal search-path.
   1065       int index = *pindex;
   1066       if (index > 0)
   1067 	--index;
   1068       name = dirpath.find(std::vector<std::string>(1, input_argument->name()),
   1069 			  is_in_sysroot, &index, found_name);
   1070       if (name.empty())
   1071 	{
   1072 	  gold_error(_("cannot find %s"),
   1073 		     input_argument->name());
   1074 	  return false;
   1075 	}
   1076       *namep = name;
   1077       *pindex = index + 1;
   1078       return true;
   1079     }
   1080 }
   1081 
   1082 // Open the file.
   1083 
   1084 bool
   1085 Input_file::open(const Dirsearch& dirpath, const Task* task, int* pindex)
   1086 {
   1087   std::string name;
   1088   if (!Input_file::find_file(dirpath, pindex, this->input_argument_,
   1089 			     &this->is_in_sysroot_, &this->found_name_, &name))
   1090     return false;
   1091 
   1092   // Now that we've figured out where the file lives, try to open it.
   1093 
   1094   General_options::Object_format format =
   1095     this->input_argument_->options().format_enum();
   1096   bool ok;
   1097   if (format == General_options::OBJECT_FORMAT_ELF)
   1098     {
   1099       ok = this->file_.open(task, name);
   1100       this->format_ = FORMAT_ELF;
   1101     }
   1102   else
   1103     {
   1104       gold_assert(format == General_options::OBJECT_FORMAT_BINARY);
   1105       ok = this->open_binary(task, name);
   1106       this->format_ = FORMAT_BINARY;
   1107     }
   1108 
   1109   if (!ok)
   1110     {
   1111       gold_error(_("cannot open %s: %s"),
   1112 		 name.c_str(), strerror(errno));
   1113       this->format_ = FORMAT_NONE;
   1114       return false;
   1115     }
   1116 
   1117   return true;
   1118 }
   1119 
   1120 // Open a file for --format binary.
   1121 
   1122 bool
   1123 Input_file::open_binary(const Task* task, const std::string& name)
   1124 {
   1125   // In order to open a binary file, we need machine code, size, and
   1126   // endianness.  We may not have a valid target at this point, in
   1127   // which case we use the default target.
   1128   parameters_force_valid_target();
   1129   const Target& target(parameters->target());
   1130 
   1131   Binary_to_elf binary_to_elf(target.machine_code(),
   1132 			      target.get_size(),
   1133 			      target.is_big_endian(),
   1134 			      name);
   1135   if (!binary_to_elf.convert(task))
   1136     return false;
   1137   return this->file_.open(task, name, binary_to_elf.converted_data_leak(),
   1138 			  binary_to_elf.converted_size());
   1139 }
   1140 
   1141 } // End namespace gold.
   1142