Ignore:
Timestamp:
Feb 14, 2018, 5:57:36 PM (22 months ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCmBinGen: Tentative version with gotSymbols and its relocations.

File:
1 edited

Legend:

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

    r3784 r3793  
    19361936}
    19371937
     1938/* ROCm section generators */
     1939
     1940class CLRX_INTERNAL ROCmGotGen: public ElfRegionContent
     1941{
     1942private:
     1943    const ROCmInput* input;
     1944public:
     1945    explicit ROCmGotGen(const ROCmInput* _input) : input(_input)
     1946    { }
     1947   
     1948    void operator()(FastOutputBuffer& fob) const
     1949    {
     1950        fob.fill(input->gotSymbols.size()*8, 0);
     1951    }
     1952};
     1953
     1954class CLRX_INTERNAL ROCmRelaDynGen: public ElfRegionContent
     1955{
     1956private:
     1957    size_t gotOffset;
     1958    const ROCmInput* input;
     1959public:
     1960    explicit ROCmRelaDynGen(const ROCmInput* _input) : gotOffset(0), input(_input)
     1961    { }
     1962   
     1963    void setGotOffset(size_t _gotOffset)
     1964    { gotOffset = _gotOffset; }
     1965   
     1966    void operator()(FastOutputBuffer& fob) const
     1967    {
     1968        for (size_t i = 0; i < input->gotSymbols.size(); i++)
     1969        {
     1970            size_t symIndex = input->gotSymbols[i];
     1971            Elf64_Rela rela{};
     1972            SLEV(rela.r_offset, gotOffset + 8*i);
     1973            SLEV(rela.r_info, ELF64_R_INFO(input->symbols.size() + symIndex + 1, 3));
     1974            rela.r_addend = 0;
     1975            fob.writeObject(rela);
     1976        }
     1977    }
     1978};
     1979
    19381980/*
    19391981 * ROCm Binary Generator
     
    19441986
    19451987ROCmBinGenerator::ROCmBinGenerator(const ROCmInput* rocmInput)
    1946         : manageable(false), input(rocmInput)
     1988        : manageable(false), input(rocmInput), rocmGotGen(nullptr), rocmRelaDynGen(nullptr)
    19471989{ }
    19481990
     
    19501992        uint32_t archMinor, uint32_t archStepping, size_t codeSize, const cxbyte* code,
    19511993        size_t globalDataSize, const cxbyte* globalData,
    1952         const std::vector<ROCmSymbolInput>& symbols)
     1994        const std::vector<ROCmSymbolInput>& symbols) :
     1995        rocmGotGen(nullptr), rocmRelaDynGen(nullptr)
    19531996{
    19541997    input = new ROCmInput{ deviceType, archMinor, archStepping, 0, false,
     
    19592002        uint32_t archMinor, uint32_t archStepping, size_t codeSize, const cxbyte* code,
    19602003        size_t globalDataSize, const cxbyte* globalData,
    1961         std::vector<ROCmSymbolInput>&& symbols)
     2004        std::vector<ROCmSymbolInput>&& symbols) :
     2005        rocmGotGen(nullptr), rocmRelaDynGen(nullptr)
    19622006{
    19632007    input = new ROCmInput{ deviceType, archMinor, archStepping, 0, false,
     
    19692013    if (manageable)
    19702014        delete input;
     2015    if (rocmGotGen!=nullptr)
     2016        delete (ROCmGotGen*)rocmGotGen;
     2017    if (rocmRelaDynGen!=nullptr)
     2018        delete (ROCmRelaDynGen*)rocmRelaDynGen;
    19712019}
    19722020
     
    19902038                cxuint elfSectId)
    19912039{ builtinTable[elfSectId - ELFSECTID_START] = sectionsNum++; }
    1992 
    1993 // TODO: add GLOBAL OFFSET TABLE dynamic and (static?) relocations
    19942040
    19952041void ROCmBinGenerator::prepareBinaryGen()
     
    20332079    addMainSectionToTable(mainSectionsNum, mainBuiltinSectTable, ROCMSECTID_HASH);
    20342080    addMainSectionToTable(mainSectionsNum, mainBuiltinSectTable, ELFSECTID_DYNSTR);
     2081    if (!input->gotSymbols.empty())
     2082        addMainSectionToTable(mainSectionsNum, mainBuiltinSectTable, ROCMSECTID_RELADYN);
    20352083    const cxuint execProgHeaderRegionIndex = mainSectionsNum;
    20362084    addMainSectionToTable(mainSectionsNum, mainBuiltinSectTable, ELFSECTID_TEXT);
    20372085    addMainSectionToTable(mainSectionsNum, mainBuiltinSectTable, ROCMSECTID_DYNAMIC);
     2086    if (!input->gotSymbols.empty())
     2087        addMainSectionToTable(mainSectionsNum, mainBuiltinSectTable, ROCMSECTID_GOT);
    20382088    if (!input->newBinFormat)
    20392089    {
     
    20582108    elfBinGen64->addProgramHeader({ PT_LOAD, PF_R|PF_X, execProgHeaderRegionIndex, 1,
    20592109                    true, Elf64Types::nobase, Elf64Types::nobase, 0 });
    2060     elfBinGen64->addProgramHeader({ PT_LOAD, PF_R|PF_W, execProgHeaderRegionIndex+1, 1,
     2110    elfBinGen64->addProgramHeader({ PT_LOAD, PF_R|PF_W, execProgHeaderRegionIndex+1,
     2111                    cxuint(1 + (!input->gotSymbols.empty())),
    20612112                    true, Elf64Types::nobase, Elf64Types::nobase, 0 });
    20622113    elfBinGen64->addProgramHeader({ PT_DYNAMIC, PF_R|PF_W, execProgHeaderRegionIndex+1, 1,
    20632114                    true, Elf64Types::nobase, Elf64Types::nobase, 0, 8 });
    2064     elfBinGen64->addProgramHeader({ PT_GNU_RELRO, PF_R, execProgHeaderRegionIndex+1, 1,
     2115    elfBinGen64->addProgramHeader({ PT_GNU_RELRO, PF_R, execProgHeaderRegionIndex+1,
     2116                    cxuint(1 + (!input->gotSymbols.empty())),
    20652117                    true, Elf64Types::nobase, Elf64Types::nobase, 0, 1 });
    20662118    elfBinGen64->addProgramHeader({ PT_GNU_STACK, PF_R|PF_W, PHREGION_FILESTART, 0,
     
    21432195    elfBinGen64->addRegion(ElfRegion64(0, (const cxbyte*)nullptr, 1, ".dynstr", SHT_STRTAB,
    21442196                SHF_ALLOC, 0, 0, Elf64Types::nobase));
     2197    if (!input->gotSymbols.empty())
     2198    {
     2199        rocmRelaDynGen = new ROCmRelaDynGen(input);
     2200        elfBinGen64->addRegion(ElfRegion64(input->gotSymbols.size()*sizeof(Elf64_Rela),
     2201                (ElfRegionContent*)rocmRelaDynGen, 8, "rela.dyn",
     2202                SHT_RELA, SHF_ALLOC, 0, 0,
     2203                mainBuiltinSectTable[ELFSECTID_DYNSYM-ELFSECTID_START], 0,
     2204                Elf64Types::nobase, sizeof(Elf64_Rela)));
     2205    }
    21452206    // '.text' with alignment=4096
    21462207    elfBinGen64->addRegion(ElfRegion64(input->codeSize, (const cxbyte*)input->code,
     
    21512212                mainBuiltinSectTable[ELFSECTID_DYNSTR-ELFSECTID_START], 0,
    21522213                Elf64Types::nobase, 0, false, 8));
     2214    if (!input->gotSymbols.empty())
     2215    {
     2216        rocmGotGen = new ROCmGotGen(input);
     2217        elfBinGen64->addRegion(ElfRegion64(input->gotSymbols.size()*8,
     2218                (ElfRegionContent*)rocmGotGen, 8, ".got", SHT_PROGBITS,
     2219                SHF_ALLOC|SHF_WRITE, 0, 0, Elf64Types::nobase));
     2220    }
    21532221    if (!input->newBinFormat)
    21542222    {
     
    21712239    updateSymbols();
    21722240    binarySize = elfBinGen64->countSize();
     2241   
     2242    if (rocmRelaDynGen != nullptr)
     2243        ((ROCmRelaDynGen*)rocmRelaDynGen)->setGotOffset(
     2244                elfBinGen64->getRegionOffset(
     2245                        mainBuiltinSectTable[ROCMSECTID_GOT - ELFSECTID_START]));
    21732246}
    21742247
     
    22552328    elfBinGen64->generate(bos);
    22562329    assert(bos.getWritten() == binarySize);
     2330   
     2331    if (rocmGotGen != nullptr)
     2332    {
     2333        delete (ROCmGotGen*)rocmGotGen;
     2334        rocmGotGen = nullptr;
     2335    }
     2336    if (rocmRelaDynGen != nullptr)
     2337    {
     2338        delete (ROCmGotGen*)rocmRelaDynGen;
     2339        rocmRelaDynGen = nullptr;
     2340    }
    22572341    }
    22582342    catch(...)
Note: See TracChangeset for help on using the changeset viewer.