aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump/llvm-objdump.cpp
diff options
context:
space:
mode:
authorYuanfang Chen <yuanfang.chen@sony.com>2019-07-24 16:55:30 +0000
committerYuanfang Chen <yuanfang.chen@sony.com>2019-07-24 16:55:30 +0000
commitfac3900c512023b8befc4ba7ffb72e59f2f94728 (patch)
treef0ea68948bab5297893bf44b2579f2831710ced8 /llvm/tools/llvm-objdump/llvm-objdump.cpp
parent3f01c7197f065d34c1d5e166e47193a6b39c5fbd (diff)
downloadllvm-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.cpp37
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);