Changeset b89ad2c6 in rtems-tools for linkers


Ignore:
Timestamp:
Dec 15, 2012, 11:44:58 AM (7 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
d54e81c
Parents:
f4d580b
Message:

i386 related fixes

Fix the size of the section calculated in image::lay_out. It did not
correctly adjust for alignment. Make the sections being written
correctly align.

Location:
linkers
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • linkers/rld-elf.cpp

    rf4d580b rb89ad2c6  
    187187          libelf_error ("elf_getdata: " + name_ + '(' + file_.name () + ')');
    188188      }
     189
     190      if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     191        std::cout << "elf::section: " << name ()
     192                  << " size=" << size ()
     193                  << " align=" << shdr.sh_addralign
     194                  << " flags=0x" << std::hex << flags () << std::dec
     195                  << std::endl;
    189196    }
    190197
     
    730737    {
    731738      load_sections ();
    732       filtered_secs.clear ();
    733739      for (section_table::iterator si = secs.begin ();
    734740           si != secs.end ();
     
    795801
    796802            if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    797             {
    798               std::cout << "elf:symbol: ";
    799               sym.output (std::cout);
    800               std::cout << std::endl;
    801             }
     803              std::cout << "elf:symbol: " << sym << std::endl;
    802804
    803805            symbols.push_back (sym);
     
    954956                        << std::endl;
    955957
    956             const symbols::symbol& sym = get_symbol (erel.r_info);
     958            const symbols::symbol& sym = get_symbol (GELF_R_SYM (erel.r_info));
    957959
    958960            relocation reloc (sym, erel.r_offset, erel.r_info);
  • linkers/rld-rap.cpp

    rf4d580b rb89ad2c6  
    166166                const sections sec,
    167167                const uint32_t value,
    168                 const uint32_t info);
     168                const uint32_t data);
    169169
    170170      /**
     
    269269
    270270      /**
    271        * Write the sections to the compressed output file.
     271       * Write the sections to the compressed output file. The file sections
     272       * are used to ensure the alignment. The offset is used to ensure the
     273       * alignment of the first section of the object when it is written.
     274       *
     275       * @param comp The compressor.
     276       * @param obj The object file the sections are part of.
     277       * @param secs The container of file sections to write.
     278       * @param offset The current offset in the RAP section.
    272279       */
    273280      void write (compress::compressor&  comp,
    274281                  files::object&         obj,
    275                   const files::sections& secs);
     282                  const files::sections& secs,
     283                  uint32_t&              offset);
    276284
    277285      /**
     
    430438      if (sec.size)
    431439      {
    432         if (align == 0)
     440        if (align < sec.align)
    433441          align = sec.align;
    434         else if (align != sec.align)
    435           throw rld::error ("Alignments do not match for section '" + name + "'",
    436                             "rap::section");
    437442
    438443        if (size && (align == 0))
     
    451456    section::set_alignment (const section& sec)
    452457    {
    453       if (align == 0)
     458      if (align < sec.align)
    454459        align = sec.align;
    455       else if (align != sec.align)
    456         throw rld::error ("Alignments do not match for section '" + name + "'",
    457                           "rap::section");
    458460    }
    459461
     
    506508    section_merge::operator () (const files::section& fsec)
    507509    {
    508       if (sec.align == 0)
     510      if (sec.align < fsec.alignment)
    509511        sec.align = fsec.alignment;
    510       else if (sec.align != fsec.alignment)
    511         throw rld::error ("Alignments do not match for section '" + sec.name + "'",
    512                           "rap::section");
    513512
    514513      uint32_t offset = align_offset (sec.size, 0, sec.align);
    515514
    516       if (1 || rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     515      if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    517516        std::cout << "rap:section-merge: relocs=" << fsec.relocs.size ()
    518517                  << " offset=" << offset
     
    536535        const files::relocation& freloc = *fri;
    537536
    538         if (1 || rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     537        if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    539538          std::cout << " " << std::setw (2) << sec.relocs.size ()
    540539                    << '/' << std::setw (2) << rc
     
    543542                    << " reloc.addend=" << freloc.addend
    544543                    << " reloc.symtype=" << freloc.symtype
     544                    << " reloc.symsect=" << freloc.symsect
    545545                    << std::endl;
    546546
     
    627627                     section_merge (*this, secs[rap_bss]));
    628628
    629       if (1 || rld::verbose () >= RLD_VERBOSE_TRACE)
     629      if (rld::verbose () >= RLD_VERBOSE_TRACE)
    630630      {
    631631        std::cout << "rap:object: " << obj.name ().full () << std::endl;
     
    759759      }
    760760
    761       if (1 || rld::verbose () >= RLD_VERBOSE_INFO)
     761      if (rld::verbose () >= RLD_VERBOSE_INFO)
    762762      {
    763763        uint32_t total = (sec_size[rap_text] + sec_size[rap_data] +
     
    834834      compress::compressor& comp;
    835835      sections              sec;
     836      uint32_t              offset;
    836837    };
    837838
     
    841842      : img (img),
    842843        comp (comp),
    843         sec (sec)
     844        sec (sec),
     845        offset (0)
    844846    {
    845847    }
     
    854856      {
    855857        case rap_text:
    856           img.write (comp, obj.obj, obj.text);
     858          img.write (comp, obj.obj, obj.text, offset);
    857859          break;
    858860        case rap_const:
    859           img.write (comp, obj.obj, obj.const_);
     861          img.write (comp, obj.obj, obj.const_, offset);
    860862          break;
    861863        case rap_ctor:
    862           img.write (comp, obj.obj, obj.ctor);
     864          img.write (comp, obj.obj, obj.ctor, offset);
    863865          break;
    864866        case rap_dtor:
    865           img.write (comp, obj.obj, obj.dtor);
     867          img.write (comp, obj.obj, obj.dtor, offset);
    866868          break;
    867869        case rap_data:
    868           img.write (comp, obj.obj, obj.data);
     870          img.write (comp, obj.obj, obj.data, offset);
    869871          break;
    870           default:
    871             break;
     872        default:
     873          break;
    872874      }
    873875    }
     
    930932    image::write (compress::compressor&  comp,
    931933                  files::object&         obj,
    932                   const files::sections& secs)
    933     {
    934       uint32_t offset = 0;
     934                  const files::sections& secs,
     935                  uint32_t&              offset)
     936    {
    935937      uint32_t size = 0;
    936938
     
    962964          comp.write (obj, sec.offset, sec.size);
    963965
    964         if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    965           std::cout << " offset=" << offset
    966                     << " padding=" << (offset - unaligned_offset)  << std::endl;
     966          if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     967            std::cout << " sec: " << sec.name
     968                      << " size=" << sec.size
     969                      << " offset=" << offset
     970                      << " align=" << sec.alignment
     971                      << " padding=" << (offset - unaligned_offset)  << std::endl;
    967972
    968973          size = sec.size;
    969974        }
    970975
     976        offset += size;
     977
    971978        if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    972           std::cout << " -- size=" << offset << std::endl;
     979          std::cout << " total size=" << offset << std::endl;
    973980
    974981        obj.end ();
     
    991998      {
    992999        const external& ext = *ei;
     1000
     1001        if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     1002          std::cout << "rap:externs: name=" << &strtab[ext.name - 2] << " (" << ext.name << ')'
     1003                    << " section=" << section_names[ext.sec]
     1004                    << " data=" << ext.data
     1005                    << " value=0x" << std::hex << ext.value << std::dec
     1006                    << std::endl;
     1007
     1008        if ((ext.data & 0xffff0000) != 0)
     1009          throw rld::error ("Data value has data in bits higher than 15",
     1010                            "rap::write-externs");
     1011
    9931012        comp << (uint32_t) ((ext.sec << 16) | ext.data)
    9941013             << ext.name
     
    10061025        uint32_t header;
    10071026
    1008         if (1 || rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    1009           std::cout << "rep:relocation: section:" << section_names[s]
     1027        if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     1028          std::cout << "rap:relocation: section:" << section_names[s]
    10101029                    << " relocs=" << count
     1030                    << " rela=" << (char*) (sec_rela[s] ? "yes" : "no")
    10111031                    << std::endl;
    10121032
     
    10251045          uint32_t     rc = 0;
    10261046
    1027           if (1 || rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     1047          if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    10281048            std::cout << " relocs=" << sec.relocs.size ()
    10291049                      << " sec.offset=" << sec.offset
     
    10561076              write_addend = true;
    10571077
    1058               if (1 || rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     1078              if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    10591079                std::cout << "  " << std::setw (2) << sr << '/' << std::setw (2) << rc
    10601080                          <<":  rsym: sect=" << section_names[reloc.symsect]
     
    10951115            }
    10961116
    1097             if (1 || rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     1117            if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    10981118            {
    10991119              std::cout << "  " << std::setw (2) << sr << '/'
     
    11611181    image::update_section (int index, const section& sec)
    11621182    {
     1183      sec_size[index] = align_offset (sec_size[index], 0, sec.align);
    11631184      sec_size[index] += sec.size;
    11641185      sec_align[index] = sec.align;
  • linkers/rld-resolver.cpp

    rf4d580b rb89ad2c6  
    8989          esi = symbols.find (urs.name ());
    9090          if (esi == symbols.end ())
    91             throw rld::error ("symbol referenced in '" + name +
    92                               "' not found: " + urs.name (), "resolving");
     91            throw rld::error ("symbol not found: " + urs.name (), name);
    9392          base = false;
    9493        }
  • linkers/rld-symbols.cpp

    rf4d580b rb89ad2c6  
    251251          << ' ' << binding
    252252          << ' ' << type
     253          << ' ' << std::setw(2) <<  es.st_shndx
    253254          << " 0x" << std::setw (8) << std::setfill ('0') << std::hex
    254255          << es.st_value
Note: See TracChangeset for help on using the changeset viewer.