Changeset f1cf3a9 in rtems-tools


Ignore:
Timestamp:
Nov 17, 2012, 8:37:02 PM (7 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
8ad4837
Parents:
065ac15
Message:

Better handling of archive open/close and begin/end.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • linkers/rld-files.cpp

    r065ac15 rf1cf3a9  
    547547    archive::~archive ()
    548548    {
     549      end ();
    549550      close ();
    550551    }
     
    553554    archive::begin ()
    554555    {
    555       elf ().begin (name ().full (), fd ());
    556 
    557       /*
    558        * Make sure it is an archive.
    559        */
    560       if (!elf ().is_archive ())
    561         throw rld::error ("Not an archive.",
    562                           "archive-begin:" + name ().full ());
     556      if (references () == 1)
     557      {
     558        elf ().begin (name ().full (), fd ());
     559
     560        /*
     561         * Make sure it is an archive.
     562         */
     563        if (!elf ().is_archive ())
     564          throw rld::error ("Not an archive.",
     565                            "archive-begin:" + name ().full ());
     566      }
    563567    }
    564568
     
    566570    archive::end ()
    567571    {
    568       elf ().end ();
     572      if (references () == 1)
     573        elf ().end ();
    569574    }
    570575
     
    876881    object::open ()
    877882    {
    878       if (rld::verbose () >= RLD_VERBOSE_TRACE)
    879         std::cout << "object::open: " << name ().full () << std::endl;
    880 
    881883      if (archive_)
    882884        archive_->open ();
     
    888890    object::close ()
    889891    {
    890       if (rld::verbose () >= RLD_VERBOSE_TRACE)
    891         std::cout << "object::close: " << name ().full () << std::endl;
    892 
    893892      if (archive_)
     893      {
     894        archive_->end ();
    894895        archive_->close ();
     896      }
    895897      else
     898      {
     899        end ();
    896900        image::close ();
     901      }
    897902    }
    898903
     
    12161221    cache::load_symbols (rld::symbols::table& symbols, bool local)
    12171222    {
    1218       for (objects::iterator oi = objects_.begin ();
    1219            oi != objects_.end ();
    1220            ++oi)
    1221       {
    1222         object* obj = (*oi).second;
    1223         obj->open ();
    1224         obj->begin ();
    1225         obj->load_symbols (symbols, local);
    1226         obj->end ();
    1227         obj->close ();
    1228       }
     1223      if (rld::verbose () >= RLD_VERBOSE_INFO)
     1224        std::cout << "cache:load-sym: object files: " << objects_.size ()
     1225                  << std::endl;
     1226
     1227      try
     1228      {
     1229        archives_begin ();
     1230        for (objects::iterator oi = objects_.begin ();
     1231             oi != objects_.end ();
     1232             ++oi)
     1233        {
     1234          object* obj = (*oi).second;
     1235          obj->open ();
     1236          obj->begin ();
     1237          obj->load_symbols (symbols, local);
     1238          obj->end ();
     1239          obj->close ();
     1240        }
     1241      }
     1242      catch (...)
     1243      {
     1244        archives_end ();
     1245        throw;
     1246      }
     1247
     1248      archives_end ();
     1249
     1250      if (rld::verbose () >= RLD_VERBOSE_INFO)
     1251        std::cout << "cache:load-sym: symbols: " << symbols.size ()
     1252                  << std::endl;
    12291253    }
    12301254
Note: See TracChangeset for help on using the changeset viewer.