diff options
author | Yuanfang Chen <yuanfang.chen@sony.com> | 2019-07-24 16:55:30 +0000 |
---|---|---|
committer | Yuanfang Chen <yuanfang.chen@sony.com> | 2019-07-24 16:55:30 +0000 |
commit | fac3900c512023b8befc4ba7ffb72e59f2f94728 (patch) | |
tree | f0ea68948bab5297893bf44b2579f2831710ced8 /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | 3f01c7197f065d34c1d5e166e47193a6b39c5fbd (diff) | |
download | llvm-fac3900c512023b8befc4ba7ffb72e59f2f94728.zip llvm-fac3900c512023b8befc4ba7ffb72e59f2f94728.tar.gz llvm-fac3900c512023b8befc4ba7ffb72e59f2f94728.tar.bz2 |
[llvm-objdump] Emit warning if --start-address/--stop-address specify range outside file's address range.
NB: the warning is about the input file itself regardless of the options used
such as `-r`, `-s` etc..
https://bugs.llvm.org/show_bug.cgi?id=41911
Reviewers: jhenderson, grimar, MaskRay, rupprecht
Reviewed by: MaskRay, jhenderson
Differential Revision: https://reviews.llvm.org/D64779
llvm-svn: 366923
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 58981203..042c485a 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -2010,6 +2010,40 @@ static void printArchiveChild(StringRef Filename, const Archive::Child &C) { outs() << Name << "\n"; } +// For ELF only now. +static bool shouldWarnForInvalidStartStopAddress(ObjectFile *Obj) { + if (const auto *Elf = dyn_cast<ELFObjectFileBase>(Obj)) { + if (Elf->getEType() != ELF::ET_REL) + return true; + } + return false; +} + +static void checkForInvalidStartStopAddress(ObjectFile *Obj, + uint64_t Start, uint64_t Stop) { + if (!shouldWarnForInvalidStartStopAddress(Obj)) + return; + + for (const SectionRef &Section : Obj->sections()) + if (ELFSectionRef(Section).getFlags() & ELF::SHF_ALLOC) { + uint64_t BaseAddr = Section.getAddress(); + uint64_t Size = Section.getSize(); + if ((Start < BaseAddr + Size) && Stop > BaseAddr) + return; + } + + if (StartAddress.getNumOccurrences() == 0) + warn("no section has address less than 0x" + + Twine::utohexstr(Stop) + " specified by --stop-address"); + else if (StopAddress.getNumOccurrences() == 0) + warn("no section has address greater than or equal to 0x" + + Twine::utohexstr(Start) + " specified by --start-address"); + else + warn("no section overlaps the range [0x" + + Twine::utohexstr(Start) + ",0x" + Twine::utohexstr(Stop) + + ") specified by --start-address/--stop-address"); +} + static void dumpObject(ObjectFile *O, const Archive *A = nullptr, const Archive::Child *C = nullptr) { // Avoid other output when using a raw option. @@ -2022,6 +2056,9 @@ static void dumpObject(ObjectFile *O, const Archive *A = nullptr, outs() << ":\tfile format " << O->getFileFormatName() << "\n\n"; } + if (StartAddress.getNumOccurrences() || StopAddress.getNumOccurrences()) + checkForInvalidStartStopAddress(O, StartAddress, StopAddress); + StringRef ArchiveName = A ? A->getFileName() : ""; if (FileHeaders) printFileHeaders(O); |