Changeset 2553 in CLRX


Ignore:
Timestamp:
Nov 10, 2016, 6:57:11 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: ElfBinGen?: Add tentative support for dynamic table.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdbin/ElfBinaries.h

    r2552 r2553  
    658658    { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
    659659                ".note", SHT_NOTE, 0); }
     660   
     661    /// get dynamic
     662    static ElfRegionTemplate dynamicSection(uint16_t link)
     663    { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
     664                ".dynamic", SHT_DYNAMIC, SHF_ALLOC|SHF_WRITE, link); }
    660665};
    661666
     
    769774    std::vector<ElfSymbolTemplate<Types> > dynSymbols;
    770775    std::vector<ElfNote> notes;
     776    std::vector<int32_t> dynamics;
     777    std::unique_ptr<typename Types::Word[]> dynamicValues;
    771778    uint32_t bucketsNum;
    772779    std::unique_ptr<uint32_t[]> hashCodes;
     
    806813    void addNote(const ElfNote& note)
    807814    { notes.push_back(note); }
     815    /// add dynamic
     816    void addDynamic(int32_t dynamicTag)
     817    { dynamics.push_back(dynamicTag); }
     818    /// add dynamic
     819    void addDynamics(size_t dynamicsNum, const int32_t* dynTags)
     820    { dynamics.insert(dynamics.end(), dynTags, dynTags + dynamicsNum); }
     821   
    808822    /// count size of binary
    809823    uint64_t countSize();
  • CLRadeonExtender/trunk/amdbin/ElfBinaries.cpp

    r2552 r2553  
    457457{ progHeaders.push_back(progHeader); }
    458458
     459static const size_t dynTableSize = DT_NUM;
     460
    459461template<typename Types>
    460462void ElfBinaryGenTemplate<Types>::computeSize()
     
    471473    sectionsNum = addNullSection; // if add null section
    472474    cxuint hashSymSectionIdx = UINT_MAX;
     475    bool haveDynamic = false;
    473476    for (const auto& region: regions)
    474477        if (region.type == ElfRegionType::SECTION)
    475478        {
    476             if (region.section.type==SHT_HASH &&
    477                 ::strcmp(region.section.name, ".hash")==0)
     479            if (region.section.type==SHT_HASH)
    478480                hashSymSectionIdx = region.section.link;
     481            else if (region.section.type==SHT_DYNAMIC)
     482                haveDynamic = true;
    479483            sectionsNum++;
    480484        }
     
    514518    sectionCount = addNullSection;
    515519    typename Types::Word address = 0;
     520    std::unique_ptr<typename Types::Word[]> dynValTable;
     521    if (haveDynamic)
     522    {   // prepare dynamic structures
     523        dynamicValues.reset(new typename Types::Word[dynamics.size()]);
     524        dynValTable.reset(new typename Types::Word[dynTableSize]);
     525    }
    516526   
    517527    for (const auto& sym: symbols)
     
    561571            if (region.section.link >= sectionsNum)
    562572                throw Exception("Section link out of range");
     573           
     574            if (haveDynamic)
     575            {
     576                switch(region.section.type)
     577                {
     578                    case SHT_DYNSYM:
     579                        dynValTable[DT_SYMTAB] = regionAddresses[i];
     580                        dynValTable[DT_SYMENT] = sizeof(typename Types::Sym);
     581                        break;
     582                    case SHT_STRTAB:
     583                        if (::strcmp(region.section.name, ".dynstr")==0)
     584                            dynValTable[DT_STRTAB] = regionAddresses[i];
     585                        break;
     586                    case SHT_HASH:
     587                        dynValTable[DT_HASH] = regionAddresses[i];
     588                        break;
     589                }
     590            }
    563591           
    564592            if (region.section.type != SHT_NOBITS && region.size != 0)
     
    582610                    size += 4*(bucketsNum + hashSymbols.size()+addNullHashSym + 2);
    583611                }
     612                else if (region.section.type == SHT_DYNAMIC)
     613                    size += (dynamics.size()+1) * sizeof(typename Types::Dyn);
    584614                else if (region.section.type == SHT_NOTE)
    585615                {
     
    629659                address += region.size;
    630660           
     661            if (haveDynamic)
     662            {
     663                if (region.section.type == SHT_STRTAB)
     664                    dynValTable[DT_STRSZ] = region.size;
     665            }
     666           
    631667            if (::strcmp(region.section.name, ".strtab") == 0)
    632668                strTab = sectionCount;
     
    638674            sectionCount++;
    639675        }
     676    }
     677   
     678    if (haveDynamic)
     679    {   // set dynamic values
     680        for (size_t i = 0; i < dynamics.size(); i++)
     681            if (dynamics[i] >= 0 && dynamics[i] < dynTableSize)
     682                dynamicValues[i] = dynValTable[dynamics[i]];
    640683    }
    641684   
     
    897940                        region2.section.type == SHT_DYNSYM)
    898941                        SLEV(shdr.sh_entsize, sizeof(typename Types::Sym));
     942                    else if (region2.section.type == SHT_DYNAMIC)
     943                        SLEV(shdr.sh_entsize, sizeof(typename Types::Dyn));
    899944                    else
    900945                        SLEV(shdr.sh_entsize, region2.section.entSize);
     
    9631008                    }
    9641009                }
     1010                else if (region.section.type == SHT_DYNAMIC)
     1011                {   // dynamic table
     1012                    typename Types::Dyn dyn;
     1013                    for (size_t k = 0; k < dynamics.size(); k++)
     1014                    {
     1015                        SLEV(dyn.d_tag, dynamics[k]);
     1016                        SLEV(dyn.d_un.d_val, dynamicValues[k]);
     1017                        fob.writeObject(dyn);
     1018                    }
     1019                    SLEV(dyn.d_tag, DT_NULL);
     1020                    SLEV(dyn.d_un.d_val, 0U);
     1021                    fob.writeObject(dyn);
     1022                }
    9651023                else if (region.section.type == SHT_HASH)
    9661024                {
    967                     if (::strcmp(region.section.name, ".hash") != 0)
    968                         continue;
    969                    
    9701025                    const std::vector<ElfSymbolTemplate<Types> >& hashSymbols =
    9711026                        (isHashDynSym) ? dynSymbols : symbols;
Note: See TracChangeset for help on using the changeset viewer.