mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[COFFObjectFile] Ignore broken symbol table
When binaries are compressed by UPX, information about symbol table offset and symbol count remain unchanged (but became invalid due to compression). This causes failure in the constructor and the rest of the binary cannot be processed. Instead, reset symbol related information (symbol/string table pointers, sizes) - this should disable the related iterators and functions while the rest of the binary can still be processed. Patch by Bandzi Michal! llvm-svn: 280147
This commit is contained in:
parent
f56c60c3dd
commit
7622ad4008
@ -699,13 +699,18 @@ public:
|
||||
return COFFBigObjHeader->PointerToSymbolTable;
|
||||
llvm_unreachable("no COFF header!");
|
||||
}
|
||||
uint32_t getNumberOfSymbols() const {
|
||||
uint32_t getRawNumberOfSymbols() const {
|
||||
if (COFFHeader)
|
||||
return COFFHeader->isImportLibrary() ? 0 : COFFHeader->NumberOfSymbols;
|
||||
if (COFFBigObjHeader)
|
||||
return COFFBigObjHeader->NumberOfSymbols;
|
||||
llvm_unreachable("no COFF header!");
|
||||
}
|
||||
uint32_t getNumberOfSymbols() const {
|
||||
if (!SymbolTable16 && !SymbolTable32)
|
||||
return 0;
|
||||
return getRawNumberOfSymbols();
|
||||
}
|
||||
protected:
|
||||
void moveSymbolNext(DataRefImpl &Symb) const override;
|
||||
Expected<StringRef> getSymbolName(DataRefImpl Symb) const override;
|
||||
|
@ -729,8 +729,12 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
|
||||
|
||||
// Initialize the pointer to the symbol table.
|
||||
if (getPointerToSymbolTable() != 0) {
|
||||
if ((EC = initSymbolTablePtr()))
|
||||
return;
|
||||
if ((EC = initSymbolTablePtr())) {
|
||||
SymbolTable16 = nullptr;
|
||||
SymbolTable32 = nullptr;
|
||||
StringTable = nullptr;
|
||||
StringTableSize = 0;
|
||||
}
|
||||
} else {
|
||||
// We had better not have any symbols if we don't have a symbol table.
|
||||
if (getNumberOfSymbols() != 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user