Changeset 2547 in CLRX


Ignore:
Timestamp:
Nov 7, 2016, 9:41:04 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: Tentative support for notes in ElfBinaryGen?.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r2546 r2547  
    632632    { return ElfRegionTemplate(0, (const cxbyte*)nullptr, sizeof(typename Types::Word),
    633633                ".hash", SHT_HASH, SHF_ALLOC, link); }
     634   
     635    /// get note section
     636    static ElfRegionTemplate noteSection()
     637    { return ElfRegionTemplate(0, (const cxbyte*)nullptr, 4, ".note", SHT_NOTE, 0); }
     638};
     639
     640struct ElfNote
     641{
     642    const char* name;
     643    size_t descSize;
     644    const cxbyte* desc;
     645    uint32_t type;
    634646};
    635647
     
    728740    std::vector<ElfSymbolTemplate<Types> > symbols;
    729741    std::vector<ElfSymbolTemplate<Types> > dynSymbols;
     742    std::vector<ElfNote> notes;
    730743    uint32_t bucketsNum;
    731744    std::unique_ptr<uint32_t[]> hashCodes;
     
    762775    void addDynSymbol(const ElfSymbolTemplate<Types>& symbol)
    763776    { dynSymbols.push_back(symbol); }
    764    
     777    /// add note
     778    void addNote(const ElfNote& note)
     779    { notes.push_back(note); }
    765780    /// count size of binary
    766781    uint64_t countSize();
  • CLRadeonExtender/trunk/amdbin/ElfBinaries.cpp

    r2546 r2547  
    564564                           addNullHashSym, hashCodes.get());
    565565                    size += 4*(bucketsNum + hashSymbols.size()+addNullHashSym + 2);
     566                }
     567                else if (region.section.type == SHT_NOTE)
     568                {
     569                    for (const ElfNote& note: notes)
     570                    {   // note size with data
     571                        size_t nameSize = ::strlen(note.name)+1;
     572                        if ((nameSize&3)!=0)
     573                            nameSize += 4 - (nameSize&3);
     574                        size_t descSize = note.descSize;
     575                        if ((descSize&3)!=0)
     576                            descSize += 4 - (descSize&3);
     577                        size += sizeof(typename Types::Nhdr) + nameSize + descSize;
     578                    }
    566579                }
    567580                else if (region.section.type == SHT_STRTAB)
     
    946959                    fob.writeArray(hashTable.size(), hashTable.data());
    947960                }
     961                else if (region.section.type == SHT_NOTE)
     962                {
     963                    for (const ElfNote& note: notes)
     964                    {
     965                        typename Types::Nhdr nhdr;
     966                        size_t nameSize = ::strlen(note.name)+1;
     967                        size_t descSize = note.descSize;
     968                        SLEV(nhdr.n_namesz, nameSize);
     969                        SLEV(nhdr.n_descsz, descSize);
     970                        SLEV(nhdr.n_type, note.type);
     971                        fob.writeObject(nhdr);
     972                        fob.writeString(note.name);
     973                        if ((nameSize&3) != 0)
     974                            fob.fill(4 - (nameSize&3), 0);
     975                        fob.writeArray(descSize, note.desc);
     976                        if ((descSize&3) != 0)
     977                            fob.fill(4 - (descSize&3), 0);
     978                    }
     979                }
    948980                else if (region.section.type == SHT_STRTAB)
    949981                {
Note: See TracChangeset for help on using the changeset viewer.