Changeset b2b811c in rtems-tools for linkers


Ignore:
Timestamp:
Dec 18, 2012, 9:57:00 AM (7 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
db216fe
Parents:
53221a0
Message:

Fixes to load libbsdports on i386.

Numerous fixes to load the the libbsdport RAP file on the i386.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • linkers/rld-rap.cpp

    r53221a0 rb2b811c  
    8383       * section in the target RAP section and the RAP section of the symbol.
    8484       */
    85       relocation (const files::relocation& reloc,
    86                   const uint32_t           offset = 0,
    87                   const int                symsect = 0);
     85      relocation (const files::relocation& reloc, const uint32_t offset);
    8886    };
    8987
     
    251249       *
    252250       * @param app_objects The object files in the application.
    253        */
    254       void layout (const files::object_list& app_objects);
     251       * @param init The initialisation entry point label.
     252       * @param fini The finish entry point label.
     253       */
     254      void layout (const files::object_list& app_objects,
     255                   const std::string&        init,
     256                   const std::string&        fini);
    255257
    256258      /**
     
    263265      /**
    264266       * Write the compressed output file.
    265        */
    266       void write (compress::compressor& comp,
    267                   const std::string&    init,
    268                   const std::string&    fini);
     267       *
     268       * @param comp The compressor.
     269       */
     270      void write (compress::compressor& comp);
    269271
    270272      /**
     
    322324      std::string strtab;              //< The strings table.
    323325      uint32_t    relocs_size;         //< The relocations size.
     326      uint32_t    init_off;            //< The strtab offset to the init label.
     327      uint32_t    fini_off;            //< The strtab offset to the fini label.
    324328    };
    325329
     
    404408
    405409    relocation::relocation (const files::relocation& reloc,
    406                             const uint32_t           offset,
    407                             const int                symsect)
     410                            const uint32_t           offset)
    408411      : offset (reloc.offset + offset),
    409412        info (reloc.info),
     
    411414        symname (reloc.symname),
    412415        symtype (reloc.symtype),
    413         symsect (symsect),
     416        symsect (reloc.symsect),
    414417        symvalue (reloc.symvalue)
    415418    {
     
    508511    section_merge::operator () (const files::section& fsec)
    509512    {
     513      /*
     514       * The RAP section alignment is the largest of all sections that are
     515       * being merged. This object file section however can aligned at its
     516       * specific alignment. You see this with .const sections which can be say
     517       * 4 .eh_frame and 1 for strings.
     518       */
    510519      if (sec.align < fsec.alignment)
    511520        sec.align = fsec.alignment;
    512521
    513       uint32_t offset = align_offset (sec.size, 0, sec.align);
     522      /*
     523       * Align the size up to the next alignment boundary and use that as the
     524       * offset for this object file section.
     525       */
     526      uint32_t offset = align_offset (sec.size, 0, fsec.alignment);
    514527
    515528      if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    516         std::cout << "rap:section-merge: relocs=" << fsec.relocs.size ()
     529        std::cout << "rap:section-merge: " << fsec.name
     530                  << " relocs=" << fsec.relocs.size ()
    517531                  << " offset=" << offset
    518                   << " fsec.name=" << fsec.name
    519532                  << " fsec.size=" << fsec.size
    520533                  << " fsec.alignment=" << fsec.alignment
    521                   << "  " << obj.obj.name ().full ()  << std::endl;
     534                  << " " << obj.obj.name ().full ()  << std::endl;
    522535
    523536      /*
     
    545558                    << std::endl;
    546559
    547         if (freloc.symtype == STT_NOTYPE)
    548           sec.relocs.push_back (relocation (freloc, offset));
    549         else
    550           sec.relocs.push_back (relocation (freloc,
    551                                             offset,
    552                                             obj.find (freloc.symsect)));
     560        sec.relocs.push_back (relocation (freloc, offset));
    553561      }
    554562
     
    607615      obj.get_sections (text,   SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR);
    608616      obj.get_sections (const_, SHT_PROGBITS, SHF_ALLOC, SHF_WRITE | SHF_EXECINSTR);
    609       obj.get_sections (ctor,   ".ctors");
    610617      obj.get_sections (ctor,   ".ctors");
    611618      obj.get_sections (dtor,   ".dtors");
     
    713720
    714721    void
    715     image::layout (const files::object_list& app_objects)
     722    image::layout (const files::object_list& app_objects,
     723                   const std::string&        init,
     724                   const std::string&        fini)
    716725    {
    717726      clear ();
     
    760769      }
    761770
     771      init_off = strtab.size () + 1;
     772      strtab += '\0';
     773      strtab += init;
     774
     775      fini_off = strtab.size () + 1;
     776      strtab += '\0';
     777      strtab += fini;
     778
    762779      if (rld::verbose () >= RLD_VERBOSE_INFO)
    763780      {
     
    773790                  << " bss:" << sec_size[rap_bss]
    774791                  << " symbols:" << symtab_size << " (" << externs.size () << ')'
    775                   << " strings:" << strtab.size ()
     792                  << " strings:" << strtab.size () + 1
    776793                  << " relocs:" << relocs_size
    777794                  << std::endl;
     
    793810          if ((sym.binding () == STB_GLOBAL) || (sym.binding () == STB_WEAK))
    794811          {
    795             int      symsec = sym.section_index ();
    796             sections rap_sec = obj.find (symsec);
    797             section& sec = obj.secs[rap_sec];
     812            int         symsec = sym.section_index ();
     813            sections    rap_sec = obj.find (symsec);
     814            section&    sec = obj.secs[rap_sec];
     815            std::size_t name;
     816
     817            /*
     818             * See if the name is already in the string table.
     819             */
     820            name = strtab.find (sym.name ());
     821
     822            if (name == std::string::npos)
     823            {
     824              name = strtab.size () + 1;
     825              strtab += '\0';
     826              strtab += sym.name ();
     827            }
    798828
    799829            /*
     
    803833             * object file's section offset in the RAP section.
    804834             */
    805             externs.push_back (external (strtab.size () + 2,
     835            externs.push_back (external (name,
    806836                                         rap_sec,
    807                                          sec.offset + sec.osecs[symsec] + sym.value (),
     837                                         sec.offset + sec.osecs[symsec] +
     838                                         sym.value (),
    808839                                         sym.info ()));
    809840
    810841            symtab_size += external::rap_size;
    811             strtab += sym.name ();
    812             strtab += '\0';
    813842          }
    814843        }
     
    846875        offset (0)
    847876    {
     877      if (rld::verbose () >= RLD_VERBOSE_INFO)
     878        std::cout << "rap:output: " << section_names[sec]
     879                  << '=' << comp.transferred () << std::endl;
    848880    }
    849881
     
    877909
    878910    void
    879     image::write (compress::compressor& comp,
    880                   const std::string&    init,
    881                   const std::string&    fini)
     911    image::write (compress::compressor& comp)
    882912    {
    883913      /*
     
    889919       */
    890920
     921      if (rld::verbose () >= RLD_VERBOSE_INFO)
     922        std::cout << "rap:output: machine=" << comp.transferred () << std::endl;
     923
    891924      comp << elf::object_machine_type ()
    892925           << elf::object_datatype ()
    893926           << elf::object_class ();
    894927
    895       comp << (uint32_t) strtab.size ();
    896       strtab += init;
    897       strtab += '\0';
    898 
    899       comp << (uint32_t) strtab.size ();
    900       strtab += fini;
    901       strtab += '\0';
    902 
    903       comp << symtab_size
    904            << (uint32_t) strtab.size ()
     928      /*
     929       * The init and fini label offsets. Then the symbol table and string
     930       * table sizes.
     931       */
     932
     933      if (rld::verbose () >= RLD_VERBOSE_INFO)
     934        std::cout << "rap:output: header=" << comp.transferred () << std::endl;
     935
     936      comp << init_off
     937           << fini_off
     938           << symtab_size
     939           << (uint32_t) strtab.size () + 1
    905940           << (uint32_t) 0;
    906941
     942      /*
     943       * The sections.
     944       */
    907945      for (int s = 0; s < rap_secs; ++s)
    908946        comp << sec_size[s]
     
    912950       * Output the sections from each object file.
    913951       */
    914 
    915952      std::for_each (objs.begin (), objs.end (),
    916953                     section_writer (*this, comp, rap_text));
     
    924961                     section_writer (*this, comp, rap_data));
    925962
     963      if (rld::verbose () >= RLD_VERBOSE_INFO)
     964        std::cout << "rap:output: strtab=" << comp.transferred () << std::endl;
     965
     966      strtab += '\0';
    926967      comp << strtab;
    927968
     969      if (rld::verbose () >= RLD_VERBOSE_INFO)
     970        std::cout << "rap:output: symbols=" << comp.transferred () << std::endl;
     971
    928972      write_externals (comp);
     973
     974      if (rld::verbose () >= RLD_VERBOSE_INFO)
     975        std::cout << "rap:output: relocs=" << comp.transferred () << std::endl;
     976
    929977      write_relocations (comp);
    930978    }
     
    9661014
    9671015          if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    968             std::cout << " sec: " << sec.name
     1016            std::cout << " sec: " << sec.index << ' ' << sec.name
    9691017                      << " size=" << sec.size
    9701018                      << " offset=" << offset
     
    9941042    image::write_externals (compress::compressor& comp)
    9951043    {
     1044      int count = 0;
    9961045      for (externals::const_iterator ei = externs.begin ();
    9971046           ei != externs.end ();
    998            ++ei)
     1047           ++ei, ++count)
    9991048      {
    10001049        const external& ext = *ei;
    10011050
    10021051        if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    1003           std::cout << "rap:externs: name=" << &strtab[ext.name - 2] << " (" << ext.name << ')'
     1052          std::cout << "rap:externs: " << count
     1053                    << " name=" << &strtab[ext.name] << " (" << ext.name << ')'
    10041054                    << " section=" << section_names[ext.sec]
    10051055                    << " data=" << ext.data
     
    10261076        uint32_t header;
    10271077
    1028         if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     1078        if (rld::verbose () >= RLD_VERBOSE_TRACE)
    10291079          std::cout << "rap:relocation: section:" << section_names[s]
    10301080                    << " relocs=" << count
     
    10461096          uint32_t     rc = 0;
    10471097
    1048           if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     1098          if (rld::verbose () >= RLD_VERBOSE_TRACE)
    10491099            std::cout << " relocs=" << sec.relocs.size ()
    10501100                      << " sec.offset=" << sec.offset
     
    10681118            if (reloc.symtype == STT_SECTION)
    10691119            {
     1120              int rap_symsect = obj.find (reloc.symsect);
     1121
    10701122              /*
    10711123               * Bit 31 clear, bits 30:8 RAP section index.
    10721124               */
    1073               info |= reloc.symsect << 8;
    1074 
    1075               addend += obj.secs[reloc.symsect].offset + reloc.symvalue;
     1125              info |= rap_symsect << 8;
     1126
     1127              addend += obj.secs[rap_symsect].osecs[reloc.symsect] + reloc.symvalue;
    10761128
    10771129              write_addend = true;
    10781130
    1079               if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    1080                 std::cout << "  " << std::setw (2) << sr << '/' << std::setw (2) << rc
    1081                           <<":  rsym: sect=" << section_names[reloc.symsect]
    1082                           << " sec.offset=" << obj.secs[reloc.symsect].offset
     1131              if (rld::verbose () >= RLD_VERBOSE_TRACE)
     1132                std::cout << "  " << std::setw (2) << sr
     1133                          << '/' << std::setw (2) << rc
     1134                          <<":  rsym: sect=" << section_names[rap_symsect]
     1135                          << " rap_symsect=" << rap_symsect
     1136                          << " sec.osecs=" << obj.secs[rap_symsect].osecs[reloc.symsect]
     1137                          << " (" << obj.obj.get_section (reloc.symsect).name << ')'
    10831138                          << " reloc.symsect=" << reloc.symsect
    10841139                          << " reloc.symvalue=" << reloc.symvalue
     
    11161171            }
    11171172
    1118             if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     1173            if (rld::verbose () >= RLD_VERBOSE_TRACE)
    11191174            {
    11201175              std::cout << "  " << std::setw (2) << sr << '/'
     
    11271182                std::cout << " symname=" << reloc.symname;
    11281183              std::cout << std::hex
    1129                         << "  reloc.info=0x" << reloc.info << std::dec
     1184                        << " reloc.info=0x" << reloc.info << std::dec
    11301185                        << " reloc.offset=" << reloc.offset
    11311186                        << " reloc.symtype=" << reloc.symtype
     
    11771232      strtab.clear ();
    11781233      relocs_size = 0;
     1234      init_off = 0;
     1235      fini_off = 0;
    11791236    }
    11801237
     
    11991256      image                rap;
    12001257
    1201       rap.layout (app_objects);
    1202       rap.write (compressor, init, fini);
     1258      rap.layout (app_objects, init, fini);
     1259      rap.write (compressor);
    12031260
    12041261      compressor.flush ();
Note: See TracChangeset for help on using the changeset viewer.