Ignore:
Timestamp:
Jun 20, 2012, 9:50:34 AM (12 years ago)
Author:
karaoui
Message:

Deleting unused folders
All ELF file have the extension *.elf
Must objetc file are now dumped in the build directory

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/mover/src/mover.cpp

    r160 r161  
    55 * This file is part of SoCLib, GNU LGPLv2.1.
    66 *
    7  * SoCLib is free software; you can redistribute vs and/or modify vs
     7 * SoCLib is free software; you can redistribute vSO and/or modify vSO
    88 * under the terms of the GNU Lesser General Public License as published
    99 * by the Free Software Foundation; version 2.1 of the License.
    1010 *
    11  * SoCLib is distributed in the hope that vs will be useful, but
     11 * SoCLib is distributed in the hope that vSO will be useful, but
    1212 * WITHOUT ANY WARRANTY; without even the implied warranty of
    1313 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     
    4040
    4141
    42 //#define MOVER_DEBUG
     42#define MOVER_DEBUG
    4343
    4444Mover::Mover( const std::string &filename,
    4545        const size_t pageSize)
    4646        :m_path(filename),
    47         m_pathh(filename),
     47        m_pathHandler(filename),
    4848        m_ginit(false),
    4949        m_generator(new elfpp::object())
    5050{
    51     //m_generator = new elfpp::object();
    52    
    53     //m_pathh =
    54  
     51   
    5552    PSeg::setPageSize(pageSize);
    5653
    5754    load_bin(m_path);
     55
    5856#ifdef MOVER_DEBUG
    5957    std::cout << "Binary file path: " << m_path << std::endl;
     
    9492}
    9593
     94//TODO:delete
    9695elfpp::section* Mover::get_sect_by_addr(elfpp::object *loader, unsigned int addr)
    9796{
     
    103102            continue;
    104103        if(sect->get_load_address() == addr) //load_addr ?
     104        {
     105            return (&*sect);
     106        }
     107    }
     108    return NULL;
     109}
     110elfpp::section* Mover::get_sect_by_name(elfpp::object *loader, std::string name)
     111{
     112#ifdef MOVER_DEBUG
     113    std::cout << "get_sect_by_name " << name << std::endl;
     114#endif
     115    FOREACH( sect, loader->get_section_table() )
     116    {
     117        assert(&*sect != NULL);
     118        elfpp::sh_flags_e eflags = sect->get_flags();
     119        if ( !(eflags & elfpp::SHF_ALLOC) )
     120            continue;
     121
     122#ifdef MOVER_DEBUG
     123        std::cout << "Trying " << sect->get_name() << std::endl;
     124#endif
     125        if(!(sect->get_name()).compare(name))
    105126        {
    106127            return (&*sect);
     
    208229    mapping_vspace_t*   vspace  = get_vspace_base ( header );;
    209230    mapping_vseg_t*         vseg    = get_vseg_base ( header );
     231    mapping_vobj_t*         vobj    = get_vobj_base ( header );
    210232
    211233    // header
     
    240262         << " + ident = " << (bool)vseg[vseg_id].ident << std::endl
    241263         << " + psegname" << pseg[vseg[vseg_id].psegid].name << std::endl;
    242         //TODO print vobjs
    243         /*
    244         for ( vobj_id = vseg[vseg_id].vobj_offset ; vobj_id < vseg[vseg_id].vobj_offset + vseg[vseg_id].vobjs ; vobj_id++ )
    245         {
    246             _tty_printf("\t vobjs     = \"%s\"\n",     vobj[vobj_id].name);
    247             _tty_printf("\t name     = \"%s\"\n",     vobj[vobj_id].name);
    248             _tty_printf("\t type     = \"%s\" \n", vobj[vobj_id].type);
    249             _tty_printf("\t length   = \"0x%x\" \n",   vobj[vobj_id].length);
    250             _tty_printf("\t align    = \"%d\" \n",   vobj[vobj_id].align);
    251             _tty_printf("\t binpath  = \"%s\" \n",   vobj[vobj_id].binpath);
    252             _tty_printf("\t \n");
    253         }*/
     264        for(size_t vobj_id = vseg[vseg_id].vobj_offset ; vobj_id < vseg[vseg_id].vobj_offset + vseg[vseg_id].vobjs ; vobj_id++ )
     265        {
     266            std::cout << "\t vobjs     = "<<     vobj[vobj_id].name << std::endl;
     267            std::cout<<"\t name     =" << vobj[vobj_id].name <<std::endl;
     268            std::cout<<"\t type     =" << vobj[vobj_id].type <<std::endl;
     269            std::cout<<"\t length   =" << vobj[vobj_id].length <<std::endl;
     270            std::cout<<"\t align    =" << vobj[vobj_id].align <<std::endl;
     271            std::cout<<"\t binpath  =" << vobj[vobj_id].binpath <<std::endl;
     272            std::cout<<"\t \n";
     273        }
    254274    }
    255275
     
    274294             << " + ident = " <<  (bool)vseg[vseg_id].ident  << std::endl
    275295             << " + psegname = " << pseg[vseg[vseg_id].psegid].name  << std::endl << std::endl;
    276         //TODO print vobjs
    277         /*
    278             for ( vobj_id = vseg[vseg_id].vobj_offset ; vobj_id < vseg[vseg_id].vobj_offset + vseg[vseg_id].vobjs ; vobj_id++ )
     296            for(size_t vobj_id = vseg[vseg_id].vobj_offset ; vobj_id < vseg[vseg_id].vobj_offset + vseg[vseg_id].vobjs ; vobj_id++ )
    279297            {
    280                 _tty_printf("\t\t vobjs     = \"%s\"\n",     vobj[vobj_id].name);
    281                 _tty_printf("\t\t name     = \"%s\"\n",     vobj[vobj_id].name);
    282                 _tty_printf("\t\t type     = \"%s\" \n", vobj[vobj_id].type);
    283                 _tty_printf("\t\t length   = \"0x%x\" \n",   vobj[vobj_id].length);
    284                 _tty_printf("\t\t align    = \"%d\" \n",   vobj[vobj_id].align);
    285                 _tty_printf("\t\t binpath  = \"%s\" \n\n",   vobj[vobj_id].binpath);
     298                std::cout<<"\t\t vobjs     =" << vobj[vobj_id].name <<std::endl;
     299                std::cout<<"\t\t name     =" << vobj[vobj_id].name <<std::endl;
     300                std::cout<<"\t\t type     =" << vobj[vobj_id].type <<std::endl;
     301                std::cout<<"\t\t length   =" << vobj[vobj_id].length <<std::endl;
     302                std::cout<<"\t\t align    =" << vobj[vobj_id].align <<std::endl;
     303                std::cout<<"\t\t binpath  =" << vobj[vobj_id].binpath <<std::endl;
    286304            }
    287         */
    288305        }
    289306
     
    311328    bool aligned = false;
    312329
    313     VSeg     * vs = new VSeg;
    314     std::string s(vseg->name);
    315     vs->m_name = s;
    316 
    317     vs->m_vma = vseg->vbase;
     330    VSeg   *vSO = new VSeg;
     331
     332    vSO->m_name = std::string(vseg->name);
     333    vSO->m_vma = vseg->vbase;
     334    vSO->m_lma = ps->nextLma();
    318335
    319336    cur_vaddr = vseg->vbase;
    320337    cur_paddr = ps->nextLma();
    321    
    322     vs->m_length = 0;
     338
    323339    mapping_vobj_t* cur_vobj;
    324 
    325340    size_t simple_size = 0; //for debug
    326341   
    327342#ifdef MOVER_DEBUG
    328     std::cout << "--------------------vseg_map---------------------" << std::endl;
     343    std::cout << "--------------------vseg_map "<< vseg->name <<"---------------------" << std::endl;
    329344#endif
    330345   
     
    334349
    335350#ifdef MOVER_DEBUG
    336         std::cout << "cur vobj("<< vobj_id <<"): " << cur_vobj->name << " (" <<cur_vobj->vaddr << ")"
    337                         << " size "<< cur_vobj->length << " type " <<  cur_vobj->type << std::endl;
     351        std::cout << "current vobj("<< vobj_id <<"): " << cur_vobj->name << " (" <<cur_vobj->vaddr << ")"
     352                        << " size: "<< cur_vobj->length << " type: " <<  cur_vobj->type << std::endl;
    338353#endif
    339354
    340355        if(cur_vobj->type == ELF)
    341356        {
    342 
    343357            if(!first)
    344358                throw soclib::exception::RunTimeError(std::string("elf vobj type, must be placed first in a vseg"));
    345359
    346             std::string f(m_pathh.getFullName(std::string(cur_vobj->binpath)));
    347360            size_t elf_size;
    348 #ifdef MOVER_DEBUG
    349             std::cout << "Handling: " << f << " ..." << std::endl;
    350 #endif
    351             if(!f.compare(m_path))    //local blob: map_info
     361            std::string filePath(m_pathHandler.getFullPath(std::string(cur_vobj->binpath)));
     362#ifdef MOVER_DEBUG
     363            std::cout << "Handling: " << filePath << " ..." << std::endl;
     364#endif
     365            if(!filePath.compare(m_path))    //local blob: map_info
    352366            {
    353                 /**creating a new session */
     367#ifdef MOVER_DEBUG
     368                std::cout << "Found the vseg of the mapping info" << std::endl;
     369#endif
     370                /**creating a new section */
    354371                sect = new elfpp::section(*m_generator, elfpp::SHT_PROGBITS);
    355372
    356                 sect->set_name(std::string("seg_mapping_info"));
     373                sect->set_name(std::string(cur_vobj->name));
    357374                sect->set_flags(elfpp::SHF_ALLOC | elfpp::SHF_WRITE);
    358375                sect->set_size(this->m_size);
    359 
    360                 sect->set_content(m_data);               
     376                sect->set_content(this->m_data);               
    361377
    362378                elf_size = this->m_size;       
    363                 assert((elf_size >0) and "MAPINFO file empty !?");
     379                assert((elf_size >0) and "MAPPING INFO file is empty !?");
    364380            }
    365381            else
    366382            {
    367383#ifdef MOVER_DEBUG
    368                 std::cout << "ELF vseg found " << std::endl;
    369 #endif
    370                 if(m_loaders.count(f) == 0 )
    371                     m_loaders[f] = new elfpp::object(f);
    372                 elfpp::object* loader = m_loaders[f];
    373                 //elfpp::object* loader = (new elfpp::object(f));//TODO:free!
    374 
     384                std::cout << "Found an ELF vseg" << std::endl;
     385#endif
     386                if(m_loaders.count(filePath) == 0 )
     387                    m_loaders[filePath] = new elfpp::object(filePath);
     388                elfpp::object* loader = m_loaders[filePath];//TODO:free!?
     389
     390                //sect =  get_sect_by_name(loader, std::string(cur_vobj->name));
     391                //assert(( sect->get_vaddr() == cur_vaddr) and "Vaddr doesn't match!");
    375392                sect =  get_sect_by_addr(loader, cur_vaddr);
    376393                assert(sect and "No section found");
    377394
     395                sect->set_name(std::string(cur_vobj->name));
     396
    378397                elf_size = sect->get_size();
    379 
    380398                assert((elf_size >0) and "ELF section empty ?");
     399
    381400                if(!m_ginit)
    382401                {
    383                     //we suppose the header is the same for the all the bins
     402                    /** Initailising the header of the generator from the first binary
     403                    * we suppose the header is the same for all the binarys
     404                    * */
    384405                    m_generator->copy_info(*loader);
    385406                    m_ginit=true;
    386407                }
    387408            }
    388             cur_vobj->length = elf_size;//set the actual size
     409
    389410            if(elf_size > cur_vobj->length)
    390                std::cout << "Warning, specified elf type vobj ("<< cur_vobj->name  <<") size is "<< cur_vobj->length
    391                          << ", the actual size is "  << elf_size  << std::endl;
    392 
    393             vs->m_file = f;
    394             vs->m_loadable = true;       
     411                std::cout << "Warning, specified elf type vobj ("<<
     412                cur_vobj->name  <<") size is "<< cur_vobj->length << ", the actual size is "
     413                << elf_size  << std::endl;
     414
     415            cur_vobj->length = elf_size;//set the true size of this ELF vobj
     416
     417            vSO->m_file = filePath;
     418            vSO->m_loadable = true;       
    395419        }
    396420        first = false;
    397421
     422        //aligning the vobj->paddr if necessary
    398423        if(cur_vobj->align)
    399424        {
     
    401426            aligned = true;
    402427        }
    403 
    404428
    405429        cur_vaddr += cur_vobj->length;
     
    411435    assert((cur_paddr >= ps->nextLma() ));
    412436
    413     vs->m_length = (cur_paddr - ps->nextLma()); //pageAlign is done by the psegs
     437    vSO->m_length = (cur_paddr - ps->nextLma()); //pageAlign is done by the psegs
    414438
    415439#ifdef MOVER_DEBUG
    416440    if(aligned)
    417441    {
    418         std::cout << "vseg base "<< std::hex << ps->nextLma() <<(ps->nextLma()+simple_size)  <<" size " << std::dec << simple_size << std::endl;
    419         std::cout << "vseg aligned to: base: " << std::hex << ps->nextLma()
    420             <<" to "<< std::hex << ps->nextLma()+vs->m_length<< " size " << std::dec << vs->m_length << std::endl;
     442        std::cout << "vseg base "<< std::hex << ps->nextLma()
     443        <<(ps->nextLma()+simple_size)  <<" size " << std::dec << simple_size <<
     444        std::endl;
     445
     446        std::cout << "vseg aligned to: base: " << std::hex << ps->nextLma()
     447        <<" to "<< std::hex << ps->nextLma()+vSO->m_length<< " size " << std::dec <<
     448        vSO->m_length << std::endl;
    421449    }
    422450#endif
    423451     
    424     vs->m_ident = vseg->ident;     
     452    vSO->m_ident = vseg->ident;     
    425453
    426454    //set the lma
    427455    if ( vseg->ident != 0 )            // identity mapping required
    428         ps->addIdent( *vs );
     456        ps->addIdent( *vSO );
    429457    else
    430         ps->add( *vs );
     458        ps->add( *vSO );
    431459   
    432460    if(!sect)
    433461        return;
    434462
    435     //std::cout << "section: "<< *sect <<"\n seted to: " << (*vs) << std::endl;
    436     sect->set_vaddr((*vs).lma());
     463    //std::cout << "section: "<< *sect <<"\n seted to: " << (*vSO) << std::endl;
     464    sect->set_vaddr((*vSO).lma());
    437465    m_generator->add_section(*(new elfpp::section(*sect)));
    438466
Note: See TracChangeset for help on using the changeset viewer.