Changeset a458e27 in rtems-tools


Ignore:
Timestamp:
Nov 26, 2012, 12:07:06 AM (7 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
cad8b53
Parents:
076d935
Message:

Add exit label, ELF application and Application.

Add an exit label that is called when removing an application.

Change the "applicatiion" to "elf_application" and add a custom
format called the RAP format for applications.

Location:
linkers
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • linkers/rld-outputter.cpp

    r076d935 ra458e27  
    3434
    3535#include <rld.h>
    36 #include <rld-compression.h>
     36#include <rld-rap.h>
    3737
    3838namespace rld
     
    4242    const std::string
    4343    script_text (const std::string&        entry,
     44                 const std::string&        exit,
    4445                 const files::object_list& dependents,
    4546                 const files::cache&       cache,
     
    5556
    5657      if (rld::verbose () >= RLD_VERBOSE_INFO)
    57         std::cout << " e: " << entry << std::endl;
    58 
    59       out << "e: " << entry << std::endl;
     58        std::cout << " E: " << entry << std::endl;
     59
     60      out << "E: " << entry << std::endl;
     61
     62      if (!exit.empty ())
     63      {
     64        if (rld::verbose () >= RLD_VERBOSE_INFO)
     65          std::cout << " e: " << exit << std::endl;
     66        out << "e: " << exit << std::endl;
     67      }
    6068
    6169      for (files::object_list::iterator oi = objects.begin ();
     
    105113    metadata_object (files::object&            metadata,
    106114                     const std::string&        entry,
     115                     const std::string&        exit,
    107116                     const files::object_list& dependents,
    108117                     const files::cache&       cache)
     
    111120        std::cout << "metadata: " << metadata.name ().full () << std::endl;
    112121
    113       const std::string script = script_text (entry, dependents, cache, true);
     122      const std::string script =
     123        script_text (entry, exit, dependents, cache, true);
    114124
    115125      metadata.open (true);
     
    148158    archive (const std::string&        name,
    149159             const std::string&        entry,
     160             const std::string&        exit,
    150161             const files::object_list& dependents,
    151162             const files::cache&       cache)
     
    161172      files::object metadata (mdname);
    162173
    163       metadata_object (metadata, entry, dependents, cache);
     174      metadata_object (metadata, entry, exit, dependents, cache);
    164175
    165176      files::object_list dep_copy (dependents);
     
    178189    script (const std::string&        name,
    179190            const std::string&        entry,
     191            const std::string&        exit,
    180192            const files::object_list& dependents,
    181193            const files::cache&       cache)
     
    194206      try
    195207      {
    196         out << script_text (entry, dependents, cache, false);
     208        out << script_text (entry, exit, dependents, cache, false);
    197209      }
    198210      catch (...)
     
    206218
    207219    void
    208     application (const std::string&        name,
    209                  const std::string&        entry,
    210                  const files::object_list& dependents,
    211                  const files::cache&       cache)
     220    elf_application (const std::string&        name,
     221                     const std::string&        entry,
     222                     const std::string&        exit,
     223                     const files::object_list& dependents,
     224                     const files::cache&       cache)
    212225    {
    213226      if (rld::verbose () >= RLD_VERBOSE_INFO)
     
    220233      files::image       app (name);
    221234
    222       header = "RAP,00000000,01.00.00,LZ77,00000000\n";
     235      header = "RELF,00000000,0001,none,00000000\n";
    223236      header += '\0';
    224237
    225       script = script_text (entry, dependents, cache, true);
     238      script = script_text (entry, exit, dependents, cache, true);
    226239
    227240      cache.get_objects (objects);
     
    234247      #define APP_BUFFER_SIZE  (128 * 1024)
    235248
    236       compress::compressor compressor (app, APP_BUFFER_SIZE);
    237 
    238249      uint8_t* buffer = 0;
    239250
     
    241252      {
    242253        buffer = new uint8_t[APP_BUFFER_SIZE];
    243 
    244         compressor.write (script.c_str (), script.size ());
    245254
    246255        for (files::object_list::iterator oi = objects.begin ();
     
    263272                in_size < APP_BUFFER_SIZE ? in_size : APP_BUFFER_SIZE;
    264273
    265               obj.read (buffer, reading);
    266 
    267               compressor.write (buffer, reading);
     274              app.write (buffer, obj.read (buffer, reading));
     275
     276              in_size -= reading;
    268277            }
    269278          }
     
    280289      {
    281290        delete [] buffer;
     291        app.close ();
    282292        throw;
    283293      }
    284294
    285       compressor.flush ();
     295      delete [] buffer;
    286296
    287297      app.close ();
    288 
    289       delete [] buffer;
    290 
    291       if (rld::verbose () >= RLD_VERBOSE_INFO)
    292       {
    293         int pcent = (compressor.compressed () * 100) / compressor.transferred ();
    294         int premand = (((compressor.compressed () * 1000) + 500) /
    295                        compressor.transferred ()) % 10;
    296         std::cout << "outputter:application: objects: " << objects.size ()
    297                   << ", size: " << compressor.compressed ()
    298                   << ", compression: " << pcent << '.' << premand << '%'
    299                   << std::endl;
    300       }
     298    }
     299
     300    void
     301    application (const std::string&        name,
     302                 const std::string&        entry,
     303                 const std::string&        exit,
     304                 const files::object_list& dependents,
     305                 const files::cache&       cache,
     306                 const symbols::table&     symbols)
     307    {
     308      if (rld::verbose () >= RLD_VERBOSE_INFO)
     309        std::cout << "outputter:application: " << name << std::endl;
     310
     311      files::object_list dep_copy (dependents);
     312      files::object_list objects;
     313      std::string        header;
     314      std::string        script;
     315      files::image       app (name);
     316
     317      header = "RAP,00000000,0001,LZ77,00000000\n";
     318      header += '\0';
     319
     320      script = script_text (entry, exit, dependents, cache, true);
     321
     322      cache.get_objects (objects);
     323      objects.merge (dep_copy);
     324      objects.unique ();
     325
     326      app.open (true);
     327      app.write (header.c_str (), header.size ());
     328
     329      try
     330      {
     331        rap::write (app, script, objects, symbols);
     332      }
     333      catch (...)
     334      {
     335        app.close ();
     336        throw;
     337      }
     338
     339      app.close ();
    301340    }
    302341
  • linkers/rld-outputter.h

    r076d935 ra458e27  
    3333  {
    3434    /**
    35      * The types of output.
    36      */
    37     enum type
    38     {
    39       ot_script,
    40       ot_archive,
    41       ot_application
    42     };
    43 
    44     /**
    4535     * Output the object file list as a string.
    4636     *
    4737     * @param entry The name of the entry point symbol.
     38     * @param exit The name of the exit point symbol.
    4839     * @param dependents The list of dependent object files
    4940     * @param cache The file cache for the link. Includes the object list
     
    5243     */
    5344    std::string script_text (const std::string&        entry,
     45                             const std::string&        exit,
    5446                             const files::object_list& dependents,
    5547                             const files::cache&       cache);
     
    6052     * @param name The name of the archive.
    6153     * @param entry The name of the entry point symbol.
     54     * @param exit The name of the exit point symbol.
    6255     * @param dependents The list of dependent object files
    6356     * @param cache The file cache for the link. Includes the object list
     
    6659    void archive (const std::string&        name,
    6760                  const std::string&        entry,
     61                  const std::string&        exit,
    6862                  const files::object_list& dependents,
    6963                  const files::cache&       cache);
     
    7468     * @param name The name of the script.
    7569     * @param entry The name of the entry point symbol.
     70     * @param exit The name of the exit point symbol.
    7671     * @param dependents The list of dependent object files
    7772     * @param cache The file cache for the link. Includes the object list
     
    8075    void script (const std::string&        name,
    8176                 const std::string&        entry,
     77                 const std::string&        exit,
    8278                 const files::object_list& dependents,
    8379                 const files::cache&       cache);
    8480
    8581    /**
    86      * Output the object files as a compressed list of files.
     82     * Output the object files in an archive with the metadata.
    8783     *
    8884     * @param name The name of the script.
    8985     * @param entry The name of the entry point symbol.
     86     * @param exit The name of the exit point symbol.
     87     * @param dependents The list of dependent object files
     88     * @param cache The file cache for the link. Includes the object list
     89     *              the user requested.
     90     */
     91    void elf_application (const std::string&        name,
     92                          const std::string&        entry,
     93                          const std::string&        exit,
     94                          const files::object_list& dependents,
     95                          const files::cache&       cache);
     96
     97    /**
     98     * Output the object files in an archive with the metadata.
     99     *
     100     * @param name The name of the script.
     101     * @param entry The name of the entry point symbol.
     102     * @param exit The name of the exit point symbol.
    90103     * @param dependents The list of dependent object files
    91104     * @param cache The file cache for the link. Includes the object list
     
    94107    void application (const std::string&        name,
    95108                      const std::string&        entry,
     109                      const std::string&        exit,
    96110                      const files::object_list& dependents,
    97                       const files::cache&       cache);
     111                      const files::cache&       cache,
     112                      const symbols::table&     symbols);
    98113
    99114  }
Note: See TracChangeset for help on using the changeset viewer.