[PATCH] D65491: [llvm-objdump] Fix jumptable detection when disassembling Mach-O binaries
Kuba (Brecka) Mracek via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 30 17:10:58 PDT 2019
kubamracek created this revision.
kubamracek added reviewers: mtrent, ab, steven_wu.
kubamracek added a project: LLVM.
Herald added subscribers: rupprecht, dexonsmith.
1. Add LC_SEGMENT_64 handling in getSectionsAndSymbols to be able to find the base segment address from 64-bit Mach-O binaries.
2. Add "data in code" detection into the `!symbolTableWorked` case, extract it into a separate function.
3. Fix uninitialized variable usage on BaseSegmentAddress (initialize to 0).
Repository:
rL LLVM
https://reviews.llvm.org/D65491
Files:
tools/llvm-objdump/MachODump.cpp
Index: tools/llvm-objdump/MachODump.cpp
===================================================================
--- tools/llvm-objdump/MachODump.cpp
+++ tools/llvm-objdump/MachODump.cpp
@@ -393,10 +393,40 @@
BaseSegmentAddressSet = true;
BaseSegmentAddress = SLC.vmaddr;
}
+ } else if (Command.C.cmd == MachO::LC_SEGMENT_64) {
+ MachO::segment_command_64 SLC = MachOObj->getSegment64LoadCommand(Command);
+ StringRef SegName = SLC.segname;
+ if (!BaseSegmentAddressSet && SegName != "__PAGEZERO") {
+ BaseSegmentAddressSet = true;
+ BaseSegmentAddress = SLC.vmaddr;
+ }
}
}
}
+static bool DumpAndSkipDataInCode(uint64_t PC, const uint8_t *bytes,
+ DiceTable &Dices, uint64_t &InstSize) {
+ // Check the data in code table here to see if this is data not an
+ // instruction to be disassembled.
+ DiceTable Dice;
+ Dice.push_back(std::make_pair(PC, DiceRef()));
+ dice_table_iterator DTI =
+ std::search(Dices.begin(), Dices.end(), Dice.begin(), Dice.end(),
+ compareDiceTableEntries);
+ if (DTI != Dices.end()) {
+ uint16_t Length;
+ DTI->second.getLength(Length);
+ uint16_t Kind;
+ DTI->second.getKind(Kind);
+ InstSize = DumpDataInCode(bytes, Length, Kind);
+ if ((Kind == MachO::DICE_KIND_JUMP_TABLE8) &&
+ (PC == (DTI->first + Length - 1)) && (Length & 1))
+ InstSize++;
+ return true;
+ }
+ return false;
+}
+
static void printRelocationTargetName(const MachOObjectFile *O,
const MachO::any_relocation_info &RE,
raw_string_ostream &Fmt) {
@@ -7203,7 +7233,7 @@
std::vector<SectionRef> Sections;
std::vector<SymbolRef> Symbols;
SmallVector<uint64_t, 8> FoundFns;
- uint64_t BaseSegmentAddress;
+ uint64_t BaseSegmentAddress = 0;
getSectionsAndSymbols(MachOOF, Sections, Symbols, FoundFns,
BaseSegmentAddress);
@@ -7496,24 +7526,8 @@
if (!NoShowRawInsn || Arch == Triple::arm)
outs() << "\t";
- // Check the data in code table here to see if this is data not an
- // instruction to be disassembled.
- DiceTable Dice;
- Dice.push_back(std::make_pair(PC, DiceRef()));
- dice_table_iterator DTI =
- std::search(Dices.begin(), Dices.end(), Dice.begin(), Dice.end(),
- compareDiceTableEntries);
- if (DTI != Dices.end()) {
- uint16_t Length;
- DTI->second.getLength(Length);
- uint16_t Kind;
- DTI->second.getKind(Kind);
- Size = DumpDataInCode(Bytes.data() + Index, Length, Kind);
- if ((Kind == MachO::DICE_KIND_JUMP_TABLE8) &&
- (PC == (DTI->first + Length - 1)) && (Length & 1))
- Size++;
+ if (DumpAndSkipDataInCode(PC, Bytes.data() + Index, Dices, Size))
continue;
- }
SmallVector<char, 64> AnnotationsBytes;
raw_svector_ostream Annotations(AnnotationsBytes);
@@ -7588,6 +7602,10 @@
MCInst Inst;
uint64_t PC = SectAddress + Index;
+
+ if (DumpAndSkipDataInCode(PC, Bytes.data() + Index, Dices, InstSize))
+ continue;
+
SmallVector<char, 64> AnnotationsBytes;
raw_svector_ostream Annotations(AnnotationsBytes);
if (DisAsm->getInstruction(Inst, InstSize, Bytes.slice(Index), PC,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65491.212474.patch
Type: text/x-patch
Size: 3450 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190731/79cf63d2/attachment.bin>
More information about the llvm-commits
mailing list