aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Object/MachO.h32
-rw-r--r--lib/Object/MachOObjectFile.cpp23
2 files changed, 51 insertions, 4 deletions
diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h
index d6abaf1be2..8543ecc829 100644
--- a/include/llvm/Object/MachO.h
+++ b/include/llvm/Object/MachO.h
@@ -85,6 +85,34 @@ namespace MachOFormat {
support::ulittle32_t StringTableOffset;
support::ulittle32_t StringTableSize;
};
+
+ struct SegmentLoadCommand {
+ support::ulittle32_t Type;
+ support::ulittle32_t Size;
+ char Name[16];
+ support::ulittle32_t VMAddress;
+ support::ulittle32_t VMSize;
+ support::ulittle32_t FileOffset;
+ support::ulittle32_t FileSize;
+ support::ulittle32_t MaxVMProtection;
+ support::ulittle32_t InitialVMProtection;
+ support::ulittle32_t NumSections;
+ support::ulittle32_t Flags;
+ };
+
+ struct Segment64LoadCommand {
+ support::ulittle32_t Type;
+ support::ulittle32_t Size;
+ char Name[16];
+ support::ulittle64_t VMAddress;
+ support::ulittle64_t VMSize;
+ support::ulittle64_t FileOffset;
+ support::ulittle64_t FileSize;
+ support::ulittle32_t MaxVMProtection;
+ support::ulittle32_t InitialVMProtection;
+ support::ulittle32_t NumSections;
+ support::ulittle32_t Flags;
+ };
}
typedef MachOObject::LoadCommandInfo LoadCommandInfo;
@@ -204,6 +232,10 @@ private:
const MachOFormat::RelocationEntry *getRelocation(DataRefImpl Rel) const;
const MachOFormat::SymtabLoadCommand *
getSymtabLoadCommand(LoadCommandInfo LCI) const;
+ const MachOFormat::SegmentLoadCommand *
+ getSegmentLoadCommand(LoadCommandInfo LCI) const;
+ const MachOFormat::Segment64LoadCommand *
+ getSegment64LoadCommand(LoadCommandInfo LCI) const;
std::size_t getSectionIndex(DataRefImpl Sec) const;
void printRelocationTargetName(const MachOFormat::RelocationEntry *RE,
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index e2b0468b9a..1eb14f31ff 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/lib/Object/MachOObjectFile.cpp
@@ -68,6 +68,21 @@ MachOObjectFile::getSymtabLoadCommand(LoadCommandInfo LCI) const {
return reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Data.data());
}
+const MachOFormat::SegmentLoadCommand *
+MachOObjectFile::getSegmentLoadCommand(LoadCommandInfo LCI) const {
+ StringRef Data = MachOObj->getData(LCI.Offset,
+ sizeof(MachOFormat::SegmentLoadCommand));
+ return reinterpret_cast<const MachOFormat::SegmentLoadCommand*>(Data.data());
+}
+
+const MachOFormat::Segment64LoadCommand *
+MachOObjectFile::getSegment64LoadCommand(LoadCommandInfo LCI) const {
+ StringRef Data = MachOObj->getData(LCI.Offset,
+ sizeof(MachOFormat::Segment64LoadCommand));
+ return
+ reinterpret_cast<const MachOFormat::Segment64LoadCommand*>(Data.data());
+}
+
void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const {
uint32_t LoadCommandCount = MachOObj->getHeader().NumLoadCommands;
while (DRI.d.a < LoadCommandCount) {
@@ -436,13 +451,13 @@ void MachOObjectFile::moveToNextSection(DataRefImpl &DRI) const {
while (DRI.d.a < LoadCommandCount) {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
if (LCI.Command.Type == macho::LCT_Segment) {
- InMemoryStruct<macho::SegmentLoadCommand> SegmentLoadCmd;
- MachOObj->ReadSegmentLoadCommand(LCI, SegmentLoadCmd);
+ const MachOFormat::SegmentLoadCommand *SegmentLoadCmd =
+ getSegmentLoadCommand(LCI);
if (DRI.d.b < SegmentLoadCmd->NumSections)
return;
} else if (LCI.Command.Type == macho::LCT_Segment64) {
- InMemoryStruct<macho::Segment64LoadCommand> Segment64LoadCmd;
- MachOObj->ReadSegment64LoadCommand(LCI, Segment64LoadCmd);
+ const MachOFormat::Segment64LoadCommand *Segment64LoadCmd =
+ getSegment64LoadCommand(LCI);
if (DRI.d.b < Segment64LoadCmd->NumSections)
return;
}