diff options
author | Fangrui Song <i@maskray.me> | 2020-08-13 08:13:26 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2020-08-13 08:13:42 -0700 |
commit | 7f8c49b016003a1a642235b14788648736809a58 (patch) | |
tree | e6f0732c28d4e8f85b7c82c9e24c0361bf084947 /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | 1ffc299628948ee0bee3ffb7451c9085b5a80e83 (diff) | |
download | llvm-7f8c49b016003a1a642235b14788648736809a58.zip llvm-7f8c49b016003a1a642235b14788648736809a58.tar.gz llvm-7f8c49b016003a1a642235b14788648736809a58.tar.bz2 |
[llvm-objdump] Change symbol name/PLT decoding errors to warnings
If the referenced symbol of a J[U]MP_SLOT is invalid (e.g. symbol index 0), llvm-objdump -d will bail out:
```
error: 'a': st_name (0x326600) is past the end of the string table of size 0x7
```
where 0x326600 is the st_name field of the first entry past the end of .symtab
Change it to a warning to continue dumping.
`X86/plt.test` uses a prebuilt executable, so I pick `ELF/AArch64/plt.test`
which has a YAML input and can be easily modified.
Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D85623
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 320bbb5..3ce7e8d 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1394,13 +1394,23 @@ static void addPltEntries(const ObjectFile *Obj, return; if (auto *ElfObj = dyn_cast<ELFObjectFileBase>(Obj)) { for (auto PltEntry : ElfObj->getPltAddresses()) { - SymbolRef Symbol(PltEntry.first, ElfObj); - uint8_t SymbolType = getElfSymbolType(Obj, Symbol); - - StringRef Name = unwrapOrError(Symbol.getName(), Obj->getFileName()); - if (!Name.empty()) - AllSymbols[*Plt].emplace_back( - PltEntry.second, Saver.save((Name + "@plt").str()), SymbolType); + if (PltEntry.first) { + SymbolRef Symbol(*PltEntry.first, ElfObj); + uint8_t SymbolType = getElfSymbolType(Obj, Symbol); + if (Expected<StringRef> NameOrErr = Symbol.getName()) { + if (!NameOrErr->empty()) + AllSymbols[*Plt].emplace_back( + PltEntry.second, Saver.save((*NameOrErr + "@plt").str()), + SymbolType); + continue; + } else { + // The warning has been reported in disassembleObject(). + consumeError(NameOrErr.takeError()); + } + } + reportWarning("PLT entry at 0x" + Twine::utohexstr(PltEntry.second) + + " references an invalid symbol", + Obj->getFileName()); } } } @@ -1594,8 +1604,12 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, const StringRef FileName = Obj->getFileName(); const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(Obj); for (const SymbolRef &Symbol : Obj->symbols()) { - StringRef Name = unwrapOrError(Symbol.getName(), FileName); - if (Name.empty() && !(Obj->isXCOFF() && SymbolDescription)) + Expected<StringRef> NameOrErr = Symbol.getName(); + if (!NameOrErr) { + reportWarning(toString(NameOrErr.takeError()), FileName); + continue; + } + if (NameOrErr->empty() && !(Obj->isXCOFF() && SymbolDescription)) continue; if (Obj->isELF() && getElfSymbolType(Obj, Symbol) == ELF::STT_SECTION) |