diff options
author | Petr Hosek <phosek@chromium.org> | 2017-09-13 03:04:50 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2017-09-13 03:04:50 +0000 |
commit | c113577d1599c79019eed054676ced9c41f2e7ca (patch) | |
tree | 9caa60cbf79ce74e13f734401ab63aa65a704802 /llvm/tools/llvm-objcopy/Object.cpp | |
parent | a2aa64760d79d32c35f60632d266f61e5a00ca7d (diff) | |
download | bcm5719-llvm-c113577d1599c79019eed054676ced9c41f2e7ca.tar.gz bcm5719-llvm-c113577d1599c79019eed054676ced9c41f2e7ca.zip |
[llvm-objcopy] Add e_machine validity check for reserved section indexes
As discussed on llvm-commits it was decided it would be best to check
e_machine before declaring that a reserved section index is valid. The
only special e_machine value that matters here is EM_HEXAGON. This
change adds a special check for EM_HEXAGON.
Patch by Jake Ehrlich
Differential Revision: https://reviews.llvm.org/D37767
llvm-svn: 313114
Diffstat (limited to 'llvm/tools/llvm-objcopy/Object.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/Object.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/llvm/tools/llvm-objcopy/Object.cpp b/llvm/tools/llvm-objcopy/Object.cpp index cad97b93c3f..ef780d3ddb0 100644 --- a/llvm/tools/llvm-objcopy/Object.cpp +++ b/llvm/tools/llvm-objcopy/Object.cpp @@ -90,18 +90,22 @@ void StringTableSection::writeSection(FileOutputBuffer &Out) const { StrTabBuilder.write(Out.getBufferStart() + Offset); } -static bool isValidReservedSectionIndex(uint16_t Index) { +static bool isValidReservedSectionIndex(uint16_t Index, uint16_t Machine) { switch (Index) { case SHN_ABS: case SHN_COMMON: - case SHN_HEXAGON_SCOMMON: - case SHN_HEXAGON_SCOMMON_2: - case SHN_HEXAGON_SCOMMON_4: - case SHN_HEXAGON_SCOMMON_8: return true; - default: - return false; } + if (Machine == EM_HEXAGON) { + switch (Index) { + case SHN_HEXAGON_SCOMMON: + case SHN_HEXAGON_SCOMMON_2: + case SHN_HEXAGON_SCOMMON_4: + case SHN_HEXAGON_SCOMMON_8: + return true; + } + } + return false; } uint16_t Symbol::getShndx() const { @@ -133,7 +137,7 @@ void SymbolTableSection::addSymbol(StringRef Name, uint8_t Bind, uint8_t Type, Sym.Type = Type; Sym.DefinedIn = DefinedIn; if (DefinedIn == nullptr) { - if (isValidReservedSectionIndex(Shndx)) + if (Shndx >= SHN_LORESERVE) Sym.ShndxType = static_cast<SymbolShndxType>(Shndx); else Sym.ShndxType = SYMBOL_SIMPLE_INDEX; @@ -289,7 +293,7 @@ void Object<ELFT>::initSymbolTable(const llvm::object::ELFFile<ELFT> &ElfFile, SectionBase *DefSection = nullptr; StringRef Name = unwrapOrError(Sym.getName(StrTabData)); if (Sym.st_shndx >= SHN_LORESERVE) { - if (!isValidReservedSectionIndex(Sym.st_shndx)) { + if (!isValidReservedSectionIndex(Sym.st_shndx, Machine)) { error( "Symbol '" + Name + "' has unsupported value greater than or equal to SHN_LORESERVE: " + |