Changeset 37a7a7c in rtems-tools for linkers/rtems-ld.cpp


Ignore:
Timestamp:
Aug 24, 2013, 10:10:54 AM (6 years ago)
Author:
Peng Fan <van.freenix@…>
Branches:
4.10, 4.11, master
Children:
64309e0
Parents:
5eb6604
git-author:
Peng Fan <van.freenix@…> (08/24/13 10:10:54)
git-committer:
Peng Fan <van.freenix@…> (08/29/13 11:41:49)
Message:

RA format support for rtems-ld

  1. Automatically place object files in archive files into a ra file, using new option --runtime-lib
  2. Add a new option --one-file to decide whether the collected object files should be merged into the rap file or not.

Signed-off-by: Peng Fan <van.freenix@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • linkers/rtems-ld.cpp

    r5eb6604 r37a7a7c  
    7373  { "rap-strip",   no_argument,            NULL,           'S' },
    7474  { "rpath",       required_argument,      NULL,           'R' },
     75  { "runtime-lib", required_argument,      NULL,           'P' },
     76  { "one-file",    no_argument,            NULL,           's' },
    7577  { NULL,          0,                      NULL,            0 }
    7678};
     
    115117            << " -S        : do not include file details (also --rap-strip)" << std::endl
    116118            << " -R        : include file paths (also --rpath)" << std::endl
     119            << " -P        : place objects from archives (also --runtime-lib)" << std::endl
     120            << " -s        : Include archive elf object files (also --one-file)" << std::endl
    117121            << " -Wl,opts  : link compatible flags, ignored" << std::endl
    118122            << "Output Formats:" << std::endl
     
    169173    rld::files::cache    cache;
    170174    rld::files::cache    base;
     175    rld::files::cache    cachera;
    171176    rld::files::paths    libpaths;
    172177    rld::files::paths    libs;
     
    181186    std::string          exit;
    182187    std::string          output = "a.out";
     188    std::string          outra;
    183189    std::string          base_name;
    184190    std::string          cc_name;
     
    188194    bool                 map = false;
    189195    bool                 warnings = false;
     196    bool                 one_file = false;
    190197
    191198    libpaths.push_back (".");
     
    193200    while (true)
    194201    {
    195       int opt = ::getopt_long (argc, argv, "hvwVMnb:E:o:O:L:l:a:c:e:d:u:C:W:R", rld_opts, NULL);
     202      int opt = ::getopt_long (argc, argv, "hvwVMnb:E:o:O:L:l:a:c:e:d:u:C:W:R:P", rld_opts, NULL);
    196203      if (opt < 0)
    197204        break;
     
    232239           */
    233240          libs.push_back (optarg);
     241          break;
     242
     243        case 'P':
     244          if (!outra.empty ())
     245            std::cerr << "warning: output ra alreay set" << std::endl;
     246          outra = "lib";
     247          outra += optarg;
     248          outra += ".ra";
     249          break;
     250
     251        case 's':
     252          one_file = true;
    234253          break;
    235254
     
    451470                                           dependents, cache);
    452471        else if (output_type == "rap")
     472        {
    453473          rld::outputter::application (output, entry, exit,
    454                                        dependents, cache, symbols);
     474                                       dependents, cache, symbols,
     475                                       one_file);
     476          if (!outra.empty ())
     477          {
     478            rld::files::paths ra_libs;
     479            bool ra_exist = false;
     480
     481            /**
     482             * If exist, search it, else create a new one.
     483             */
     484            if ((ra_exist = ::access (outra.c_str (), 0)) == 0)
     485            {
     486              ra_libs.push_back (outra);
     487              cachera.open ();
     488              cachera.add_libraries (ra_libs);
     489              cachera.archives_begin ();
     490            }
     491
     492            rld::outputter::archivera (outra, dependents, cachera,
     493                                       !ra_exist);
     494          }
     495        }
    455496        else
    456497          throw rld::error ("invalid output type", "output");
Note: See TracChangeset for help on using the changeset viewer.