| Index: src/IceELFObjectWriter.cpp
|
| diff --git a/src/IceELFObjectWriter.cpp b/src/IceELFObjectWriter.cpp
|
| index 9e1d44ed7352f2567ca82910ed6a03616d96b18c..74568565ca60313cb6835bb99fcfd12b67468757 100644
|
| --- a/src/IceELFObjectWriter.cpp
|
| +++ b/src/IceELFObjectWriter.cpp
|
| @@ -105,10 +105,9 @@ T *ELFObjectWriter::createSection(const IceString &Name, Elf64_Word ShType,
|
|
|
| ELFRelocationSection *
|
| ELFObjectWriter::createRelocationSection(const ELFSection *RelatedSection) {
|
| - // Choice of RELA vs REL is actually separate from elf64 vs elf32,
|
| - // but in practice we've only had .rela for elf64 (x86-64).
|
| - // In the future, the two properties may need to be decoupled
|
| - // and the ShEntSize can vary more.
|
| + // Choice of RELA vs REL is actually separate from elf64 vs elf32, but in
|
| + // practice we've only had .rela for elf64 (x86-64). In the future, the two
|
| + // properties may need to be decoupled and the ShEntSize can vary more.
|
| const Elf64_Word ShType = ELF64 ? SHT_RELA : SHT_REL;
|
| IceString RelPrefix = ELF64 ? ".rela" : ".rel";
|
| IceString RelSectionName = RelPrefix + RelatedSection->getName();
|
| @@ -158,8 +157,8 @@ void ELFObjectWriter::assignRelLinkNum(SizeT SymTabNumber,
|
| }
|
|
|
| void ELFObjectWriter::assignSectionNumbersInfo(SectionList &AllSections) {
|
| - // Go through each section, assigning them section numbers and
|
| - // and fill in the size for sections that aren't incrementally updated.
|
| + // Go through each section, assigning them section numbers and and fill in
|
| + // the size for sections that aren't incrementally updated.
|
| assert(!SectionNumbersAssigned);
|
| SizeT CurSectionNumber = 0;
|
| NullSection->setNumber(CurSectionNumber++);
|
| @@ -233,8 +232,8 @@ void ELFObjectWriter::writeFunctionCode(const IceString &FuncName,
|
| RelSection = RelTextSections[0];
|
| }
|
| RelocOffsetT OffsetInSection = Section->getCurrentSize();
|
| - // Function symbols are set to 0 size in the symbol table,
|
| - // in contrast to data symbols which have a proper size.
|
| + // Function symbols are set to 0 size in the symbol table, in contrast to
|
| + // data symbols which have a proper size.
|
| SizeT SymbolSize = 0;
|
| Section->appendData(Str, Asm->getBufferView());
|
| uint8_t SymbolType;
|
| @@ -268,9 +267,8 @@ classifyGlobalSection(const VariableDeclaration *Var) {
|
| return ELFObjectWriter::BSS;
|
| }
|
|
|
| -// Partition the Vars list by SectionType into VarsBySection.
|
| -// If TranslateOnly is non-empty, then only the TranslateOnly variable
|
| -// is kept for emission.
|
| +// Partition the Vars list by SectionType into VarsBySection. If TranslateOnly
|
| +// is non-empty, then only the TranslateOnly variable is kept for emission.
|
| void partitionGlobalsBySection(const VariableDeclarationList &Vars,
|
| VariableDeclarationList VarsBySection[],
|
| const IceString &TranslateOnly) {
|
| @@ -440,8 +438,8 @@ template <bool IsELF64>
|
| void ELFObjectWriter::writeELFHeaderInternal(Elf64_Off SectionHeaderOffset,
|
| SizeT SectHeaderStrIndex,
|
| SizeT NumSections) {
|
| - // Write the e_ident: magic number, class, etc.
|
| - // The e_ident is byte order and ELF class independent.
|
| + // Write the e_ident: magic number, class, etc. The e_ident is byte order and
|
| + // ELF class independent.
|
| Str.writeBytes(llvm::StringRef(ElfMagic, strlen(ElfMagic)));
|
| Str.write8(IsELF64 ? ELFCLASS64 : ELFCLASS32);
|
| Str.write8(ELFDATA2LSB);
|
| @@ -451,21 +449,21 @@ void ELFObjectWriter::writeELFHeaderInternal(Elf64_Off SectionHeaderOffset,
|
| Str.write8(ELF_ABIVersion);
|
| Str.writeZeroPadding(EI_NIDENT - EI_PAD);
|
|
|
| - // TODO(jvoung): Handle and test > 64K sections. See the generic ABI doc:
|
| - // https://refspecs.linuxbase.org/elf/gabi4+/ch4.eheader.html
|
| - // e_shnum should be 0 and then actual number of sections is
|
| - // stored in the sh_size member of the 0th section.
|
| + // TODO(jvoung): Handle and test > 64K sections. See the generic ABI doc:
|
| + // https://refspecs.linuxbase.org/elf/gabi4+/ch4.eheader.html e_shnum should
|
| + // be 0 and then actual number of sections is stored in the sh_size member of
|
| + // the 0th section.
|
| assert(NumSections < SHN_LORESERVE);
|
| assert(SectHeaderStrIndex < SHN_LORESERVE);
|
|
|
| const TargetArch Arch = Ctx.getFlags().getTargetArch();
|
| - // Write the rest of the file header, which does depend on byte order
|
| - // and ELF class.
|
| + // Write the rest of the file header, which does depend on byte order and ELF
|
| + // class.
|
| Str.writeLE16(ET_REL); // e_type
|
| Str.writeLE16(getELFMachine(Ctx.getFlags().getTargetArch())); // e_machine
|
| Str.writeELFWord<IsELF64>(1); // e_version
|
| - // Since this is for a relocatable object, there is no entry point,
|
| - // and no program headers.
|
| + // Since this is for a relocatable object, there is no entry point, and no
|
| + // program headers.
|
| Str.writeAddrOrOffset<IsELF64>(0); // e_entry
|
| Str.writeAddrOrOffset<IsELF64>(0); // e_phoff
|
| Str.writeAddrOrOffset<IsELF64>(SectionHeaderOffset); // e_shoff
|
| @@ -505,8 +503,8 @@ template <typename ConstType> void ELFObjectWriter::writeConstantPool(Type Ty) {
|
| SecStrBuf.str(), SHT_PROGBITS, ShFlags, Align, WriteAmt);
|
| RODataSections.push_back(Section);
|
| SizeT OffsetInSection = 0;
|
| - // The symbol table entry doesn't need to know the defined symbol's
|
| - // size since this is in a section with a fixed Entry Size.
|
| + // The symbol table entry doesn't need to know the defined symbol's size
|
| + // since this is in a section with a fixed Entry Size.
|
| const SizeT SymbolSize = 0;
|
| Section->setFileOffset(alignFileOffset(Align));
|
|
|
| @@ -541,11 +539,11 @@ template <typename ConstType> void ELFObjectWriter::writeConstantPool(Type Ty) {
|
| Section->setSize(OffsetInSection);
|
| }
|
|
|
| -// Instantiate known needed versions of the template, since we are
|
| -// defining the function in the .cpp file instead of the .h file.
|
| -// We may need to instantiate constant pools for integers as well
|
| -// if we do constant-pooling of large integers to remove them
|
| -// from the instruction stream (fewer bytes controlled by an attacker).
|
| +// Instantiate known needed versions of the template, since we are defining the
|
| +// function in the .cpp file instead of the .h file. We may need to instantiate
|
| +// constant pools for integers as well if we do constant-pooling of large
|
| +// integers to remove them from the instruction stream (fewer bytes controlled
|
| +// by an attacker).
|
| template void ELFObjectWriter::writeConstantPool<ConstantFloat>(Type Ty);
|
|
|
| template void ELFObjectWriter::writeConstantPool<ConstantDouble>(Type Ty);
|
|
|