mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-25 21:42:53 +08:00
Improve elf encoder
This change: * adds functions for setting members of ElfSymbol, and ElfRela. * simplifies string section creation in ElfEncoder. * adds function to query index of section in ElfEncoder. Signed-off-by: Krystian Chmielewski <krystian.chmielewski@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
7463e1970b
commit
359dfc301f
@@ -20,9 +20,7 @@ ElfEncoder<NumBits>::ElfEncoder(bool addUndefSectionHeader, bool addHeaderSectio
|
||||
: addUndefSectionHeader(addUndefSectionHeader), addHeaderSectionNamesSection(addHeaderSectionNamesSection), defaultDataAlignment(defaultDataAlignemnt) {
|
||||
// add special strings
|
||||
UNRECOVERABLE_IF(defaultDataAlignment == 0);
|
||||
stringTable.push_back('\0');
|
||||
specialStringsOffsets.undef = 0U;
|
||||
specialStringsOffsets.shStrTab = this->appendSectionName(SpecialSectionNames::shStrTab);
|
||||
shStrTabNameOffset = this->appendSectionName(SpecialSectionNames::shStrTab);
|
||||
|
||||
if (addUndefSectionHeader) {
|
||||
ElfSectionHeader<NumBits> undefSection;
|
||||
@@ -63,6 +61,13 @@ void ElfEncoder<NumBits>::appendSegment(const ElfProgramHeader<NumBits> &program
|
||||
}
|
||||
}
|
||||
|
||||
template <ELF_IDENTIFIER_CLASS NumBits>
|
||||
uint32_t ElfEncoder<NumBits>::getSectionHeaderIndex(const ElfSectionHeader<NumBits> §ionHeader) {
|
||||
UNRECOVERABLE_IF(§ionHeader < sectionHeaders.begin());
|
||||
UNRECOVERABLE_IF(§ionHeader >= sectionHeaders.begin() + sectionHeaders.size());
|
||||
return static_cast<uint32_t>(§ionHeader - &*sectionHeaders.begin());
|
||||
}
|
||||
|
||||
template <ELF_IDENTIFIER_CLASS NumBits>
|
||||
ElfSectionHeader<NumBits> &ElfEncoder<NumBits>::appendSection(SECTION_HEADER_TYPE sectionType, ConstStringRef sectionLabel, const ArrayRef<const uint8_t> sectionData) {
|
||||
ElfSectionHeader<NumBits> section = {};
|
||||
@@ -109,15 +114,10 @@ void ElfEncoder<NumBits>::appendProgramHeaderLoad(size_t sectionId, uint64_t vAd
|
||||
|
||||
template <ELF_IDENTIFIER_CLASS NumBits>
|
||||
uint32_t ElfEncoder<NumBits>::appendSectionName(ConstStringRef str) {
|
||||
if (str.empty() || (false == addHeaderSectionNamesSection)) {
|
||||
return specialStringsOffsets.undef;
|
||||
if (false == addHeaderSectionNamesSection) {
|
||||
return strSecBuilder.undef();
|
||||
}
|
||||
uint32_t offset = static_cast<uint32_t>(stringTable.size());
|
||||
stringTable.insert(stringTable.end(), str.begin(), str.end());
|
||||
if (str[str.size() - 1] != '\0') {
|
||||
stringTable.push_back('\0');
|
||||
}
|
||||
return offset;
|
||||
return strSecBuilder.appendString(str);
|
||||
}
|
||||
|
||||
template <ELF_IDENTIFIER_CLASS NumBits>
|
||||
@@ -137,13 +137,13 @@ std::vector<uint8_t> ElfEncoder<NumBits>::encode() const {
|
||||
auto alignedDataSize = alignUp(data.size(), static_cast<size_t>(defaultDataAlignment));
|
||||
dataPaddingBeforeSectionNames = alignedDataSize - data.size();
|
||||
sectionHeaderNamesSection.type = SHT_STRTAB;
|
||||
sectionHeaderNamesSection.name = specialStringsOffsets.shStrTab;
|
||||
sectionHeaderNamesSection.name = shStrTabNameOffset;
|
||||
sectionHeaderNamesSection.offset = static_cast<decltype(sectionHeaderNamesSection.offset)>(alignedDataSize);
|
||||
sectionHeaderNamesSection.size = static_cast<decltype(sectionHeaderNamesSection.size)>(stringTable.size());
|
||||
sectionHeaderNamesSection.size = static_cast<decltype(sectionHeaderNamesSection.size)>(strSecBuilder.data().size());
|
||||
sectionHeaderNamesSection.addralign = static_cast<decltype(sectionHeaderNamesSection.addralign)>(defaultDataAlignment);
|
||||
elfFileHeader.shStrNdx = static_cast<decltype(elfFileHeader.shStrNdx)>(sectionHeaders.size());
|
||||
sectionHeaders.push_back(sectionHeaderNamesSection);
|
||||
alignedSectionNamesDataSize = alignUp(stringTable.size(), static_cast<size_t>(sectionHeaderNamesSection.addralign));
|
||||
alignedSectionNamesDataSize = alignUp(strSecBuilder.data().size(), static_cast<size_t>(sectionHeaderNamesSection.addralign));
|
||||
}
|
||||
|
||||
elfFileHeader.phNum = static_cast<decltype(elfFileHeader.phNum)>(programHeaders.size());
|
||||
@@ -192,7 +192,10 @@ std::vector<uint8_t> ElfEncoder<NumBits>::encode() const {
|
||||
ret.resize(dataOffset, 0U);
|
||||
ret.insert(ret.end(), data.begin(), data.end());
|
||||
ret.resize(ret.size() + dataPaddingBeforeSectionNames, 0U);
|
||||
ret.insert(ret.end(), reinterpret_cast<const uint8_t *>(stringTable.data()), reinterpret_cast<const uint8_t *>(stringTable.data() + static_cast<size_t>(sectionHeaderNamesSection.size)));
|
||||
if (alignedSectionNamesDataSize > 0U) {
|
||||
auto sectionNames = strSecBuilder.data();
|
||||
ret.insert(ret.end(), sectionNames.begin(), sectionNames.end());
|
||||
}
|
||||
ret.resize(ret.size() + alignedSectionNamesDataSize - static_cast<size_t>(sectionHeaderNamesSection.size), 0U);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user