Ignore:
Timestamp:
Feb 14, 2018, 8:29:33 PM (22 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmROCm: Set value of data symbol as file offset. Add GOT symbols support to ROCm reader and ROCm disassembler.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r3793 r3794  
    13881388    newBinFormat = (gpuConfigIndex == SHN_UNDEF);
    13891389   
     1390    cxuint relaDynIndex = SHN_UNDEF;
     1391    try
     1392    { relaDynIndex = getSectionIndex(".rela.dyn"); }
     1393    catch(const Exception& ex)
     1394    { } // ignore failed
     1395   
     1396    cxuint gotIndex = SHN_UNDEF;
     1397    try
     1398    { gotIndex = getSectionIndex(".got"); }
     1399    catch(const Exception& ex)
     1400    { } // ignore failed
     1401   
    13901402    // counts regions (symbol or kernel)
    13911403    regionsNum = 0;
     
    14551467        else
    14561468            region.size = std::min(regSize, region.size);
     1469    }
     1470   
     1471    // load got symbols
     1472    if (relaDynIndex != SHN_UNDEF && gotIndex != SHN_UNDEF)
     1473    {
     1474        const Elf64_Shdr& relaShdr = getSectionHeader(relaDynIndex);
     1475        const Elf64_Shdr& gotShdr = getSectionHeader(gotIndex);
     1476       
     1477        size_t relaEntrySize = ULEV(relaShdr.sh_entsize);
     1478        if (relaEntrySize==0)
     1479            relaEntrySize = sizeof(Elf64_Rela);
     1480        const size_t relaEntriesNum = ULEV(relaShdr.sh_size)/relaEntrySize;
     1481        const size_t gotEntriesNum = ULEV(gotShdr.sh_size) >> 3;
     1482        if (gotEntriesNum != relaEntriesNum)
     1483            throw BinException("RelaDyn entries number and GOT entries "
     1484                        "number doesn't match!");
     1485       
     1486        // initialize GOT symbols table
     1487        gotSymbols.resize(gotEntriesNum);
     1488        const cxbyte* relaDyn = getSectionContent(relaDynIndex);
     1489        for (size_t i = 0; i < relaEntriesNum; i++)
     1490        {
     1491            const Elf64_Rela& rela = *reinterpret_cast<const Elf64_Rela*>(
     1492                            relaDyn + relaEntrySize*i);
     1493            // check rela entry fields
     1494            if (ULEV(rela.r_offset) != ULEV(gotShdr.sh_offset) + i*8)
     1495                throw BinException("Wrong dyn relocation offset");
     1496            if (ULEV(rela.r_addend) != 0ULL)
     1497                throw BinException("Wrong dyn relocation addend");
     1498            size_t symIndex = ELF64_R_SYM(ULEV(rela.r_info));
     1499            if (symIndex >= getDynSymbolsNum())
     1500                throw BinException("Dyn relocation symbol index out of range");
     1501            // just set in gotSymbols
     1502            gotSymbols[i] = symIndex;
     1503        }
    14571504    }
    14581505   
     
    19712018            Elf64_Rela rela{};
    19722019            SLEV(rela.r_offset, gotOffset + 8*i);
    1973             SLEV(rela.r_info, ELF64_R_INFO(input->symbols.size() + symIndex + 1, 3));
     2020            SLEV(rela.r_info, ELF64_R_INFO(symIndex + 1, 3));
    19742021            rela.r_addend = 0;
    19752022            fob.writeObject(rela);
Note: See TracChangeset for help on using the changeset viewer.