Changeset 2563 in CLRX


Ignore:
Timestamp:
Nov 16, 2016, 3:50:33 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: ElfBinaries?: Fixing segfaults while handling PHREGION_FILESTART and creating hash table.

File:
1 edited

Legend:

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

    r2562 r2563  
    570570            for (const auto& progHdr: progHeaders)
    571571            {
    572                 if (progHdr.regionStart >= regions.size())
     572                if (progHdr.regionStart!=PHREGION_FILESTART &&
     573                            progHdr.regionStart >= regions.size())
    573574                    throw Exception("Region start out of range");
    574                 if (uint64_t(progHdr.regionStart) + progHdr.regionsNum > regions.size())
     575                if ((progHdr.regionStart==PHREGION_FILESTART &&
     576                     progHdr.regionsNum > regions.size()) ||
     577                    (progHdr.regionStart!=PHREGION_FILESTART &&
     578                     uint64_t(progHdr.regionStart) + progHdr.regionsNum > regions.size()))
    575579                    throw Exception("Region end out of range");
    576580            }
     
    851855                        (progHeader.regionStart==PHREGION_FILESTART) ? startRegion :
    852856                        regions[progHeader.regionStart];
     857                const cxuint rstart = (progHeader.regionStart!=PHREGION_FILESTART) ?
     858                            progHeader.regionStart : 0;
     859                const typename Types::Word sroffset =
     860                        (progHeader.regionStart!=PHREGION_FILESTART) ?
     861                            regionOffsets[progHeader.regionStart] : 0;
     862                const typename Types::Word sraddress =
     863                        (progHeader.regionStart!=PHREGION_FILESTART) ?
     864                            regionAddresses[progHeader.regionStart] : 0;
     865               
    853866                bool zeroOffset = sregion.type == ElfRegionType::SECTION &&
    854867                        sregion.section.zeroOffset;
    855                 SLEV(phdr.p_offset, !zeroOffset ?
    856                         regionOffsets[progHeader.regionStart] : 0);
     868                SLEV(phdr.p_offset, !zeroOffset ? sroffset : 0);
    857869                if (progHeader.align==0)
    858870                {
     
    869881                 * from ELF header */
    870882                if (progHeader.paddrBase == Types::nobase)
    871                     SLEV(phdr.p_paddr, regionAddresses[progHeader.regionStart]);
     883                    SLEV(phdr.p_paddr, sraddress);
    872884                else if (progHeader.paddrBase != 0)
    873                     SLEV(phdr.p_paddr, progHeader.paddrBase +
    874                                 regionAddresses[progHeader.regionStart]);
     885                    SLEV(phdr.p_paddr, progHeader.paddrBase + sraddress);
    875886                else if (header.paddrBase != 0)
    876                     SLEV(phdr.p_paddr, header.paddrBase +
    877                                 regionAddresses[progHeader.regionStart]);
     887                    SLEV(phdr.p_paddr, header.paddrBase + sraddress);
    878888                else
    879889                    SLEV(phdr.p_paddr, 0);
    880890               
    881891                if (progHeader.vaddrBase == Types::nobase)
    882                     SLEV(phdr.p_vaddr, regionAddresses[progHeader.regionStart]);
     892                    SLEV(phdr.p_vaddr, sraddress);
    883893                else if (progHeader.vaddrBase != 0)
    884                     SLEV(phdr.p_vaddr, progHeader.vaddrBase +
    885                                 regionAddresses[progHeader.regionStart]);
     894                    SLEV(phdr.p_vaddr, progHeader.vaddrBase + sraddress);
    886895                else if (header.vaddrBase != 0)
    887                     SLEV(phdr.p_vaddr, header.vaddrBase +
    888                                 regionAddresses[progHeader.regionStart]);
     896                    SLEV(phdr.p_vaddr, header.vaddrBase + sraddress);
    889897                else
    890898                    SLEV(phdr.p_vaddr, 0);
    891899               
    892900                // last region size for file - if nobits section then we assume zero size
    893                 const auto& lastReg = regions[progHeader.regionStart+
    894                             progHeader.regionsNum-1];
    895                 uint64_t fileLastRegSize =(lastReg.type!=ElfRegionType::SECTION ||
    896                     lastReg.section.type!=SHT_NOBITS) ? lastReg.size : 0;
    897                 /// fileSize - add offset of first region to simulate region alignment
    898                 const typename Types::Word fileSize = regionOffsets[progHeader.regionStart+
    899                         progHeader.regionsNum-1] + fileLastRegSize -
    900                         regionOffsets[progHeader.regionStart];
    901                 const typename Types::Word phSize = regionAddresses[progHeader.regionStart+
    902                         progHeader.regionsNum-1]+regions[progHeader.regionStart+
    903                         progHeader.regionsNum-1].size -
    904                         regionAddresses[progHeader.regionStart];
    905                 SLEV(phdr.p_filesz, phSize);
    906                
    907                 if (progHeader.haveMemSize)
     901                if (progHeader.regionsNum!=0)
    908902                {
    909                     if (progHeader.memSize != 0)
    910                         SLEV(phdr.p_memsz, progHeader.memSize);
     903                    const auto& lastReg = regions[rstart + progHeader.regionsNum-1];
     904                    uint64_t fileLastRegSize =(lastReg.type!=ElfRegionType::SECTION ||
     905                        lastReg.section.type!=SHT_NOBITS) ? lastReg.size : 0;
     906                    /// fileSize - add offset of first region to simulate region alignment
     907                    const typename Types::Word fileSize = regionOffsets[rstart+
     908                            progHeader.regionsNum-1] + fileLastRegSize - sroffset;
     909                    const typename Types::Word phSize = regionAddresses[rstart+
     910                            progHeader.regionsNum-1]+regions[rstart+
     911                            progHeader.regionsNum-1].size - sraddress;
     912                   
     913                    if (progHeader.haveMemSize)
     914                    {
     915                        if (progHeader.memSize != 0)
     916                            SLEV(phdr.p_memsz, progHeader.memSize);
     917                        else
     918                            SLEV(phdr.p_memsz, phSize);
     919                    }
    911920                    else
    912                         SLEV(phdr.p_memsz, phSize);
     921                        SLEV(phdr.p_memsz, 0);
     922                    SLEV(phdr.p_filesz, fileSize);
    913923                }
    914924                else
     925                {
    915926                    SLEV(phdr.p_memsz, 0);
    916                 SLEV(phdr.p_filesz, fileSize);
     927                    SLEV(phdr.p_filesz, 0);
     928                }
    917929                fob.writeObject(phdr);
    918930            }
     
    10481060                        (isHashDynSym) ? dynSymbols : symbols;
    10491061                    bool addNullHashSym = (isHashDynSym) ? addNullDynSym : addNullSym;
    1050                     Array<uint32_t> hashTable(2 + hashSymbols.size() + addNullHashSym);
     1062                    Array<uint32_t> hashTable(2 + hashSymbols.size() + addNullHashSym +
     1063                                bucketsNum);
    10511064                    createHashTable(bucketsNum, hashSymbols.size()+addNullHashSym,
    10521065                                addNullHashSym, hashCodes.get(), hashTable.data());
Note: See TracChangeset for help on using the changeset viewer.