summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-04-05 15:15:22 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-04-05 15:15:22 +0000
commitf16c2bb320f4d5b33dfaf8df8865f547e6d66005 (patch)
tree551e576e9809d1729da4aaadc72b33fa1d5fb8bb
parent332edeb1dc9e6aed5229091bb56a914e78f177c2 (diff)
downloadllvm-f16c2bb320f4d5b33dfaf8df8865f547e6d66005.tar.gz
llvm-f16c2bb320f4d5b33dfaf8df8865f547e6d66005.tar.bz2
llvm-f16c2bb320f4d5b33dfaf8df8865f547e6d66005.tar.xz
Don't fetch pointers from a InMemoryStruct.
InMemoryStruct is extremely dangerous as it returns data from an internal buffer when the endiannes doesn't match. This should fix the tests on big endian hosts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178875 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Object/MachO.h8
-rw-r--r--lib/Object/MachOObjectFile.cpp27
-rw-r--r--test/tools/llvm-readobj/sections-ext.test4
-rw-r--r--test/tools/llvm-readobj/sections.test8
-rw-r--r--tools/llvm-objdump/MachODump.cpp5
-rw-r--r--tools/llvm-objdump/llvm-objdump.cpp7
-rw-r--r--tools/llvm-readobj/MachODumper.cpp23
7 files changed, 43 insertions, 39 deletions
diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h
index ed7aabd2c8..83e9c013ca 100644
--- a/include/llvm/Object/MachO.h
+++ b/include/llvm/Object/MachO.h
@@ -15,6 +15,7 @@
#ifndef LLVM_OBJECT_MACHO_H
#define LLVM_OBJECT_MACHO_H
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Object/MachOObject.h"
#include "llvm/Object/ObjectFile.h"
@@ -47,7 +48,12 @@ public:
// In a MachO file, sections have a segment name. This is used in the .o
// files. They have a single segment, but this field specifies which segment
// a section should be put in in the final object.
- error_code getSectionFinalSegmentName(DataRefImpl Sec, StringRef &Res) const;
+ StringRef getSectionFinalSegmentName(DataRefImpl Sec) const;
+
+ // Names are stored as 16 bytes. These returns the raw 16 bytes without
+ // interpreting them as a C string.
+ ArrayRef<char> getSectionRawName(DataRefImpl Sec) const;
+ ArrayRef<char>getSectionRawFinalSegmentName(DataRefImpl Sec) const;
MachOObject *getObject() { return MachOObj.get(); }
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index 6501df9fb9..9ab3599e2d 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/lib/Object/MachOObjectFile.cpp
@@ -481,8 +481,7 @@ static StringRef parseSegmentOrSectionName(const char *P) {
return StringRef(P, 16);
}
-error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
- StringRef &Result) const {
+ArrayRef<char> MachOObjectFile::getSectionRawName(DataRefImpl DRI) const {
if (is64BitLoadCommand(MachOObj.get(), DRI)) {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
unsigned SectionOffset = LCI.Offset + sizeof(macho::Segment64LoadCommand) +
@@ -490,7 +489,7 @@ error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section64));
const macho::Section64 *sec =
reinterpret_cast<const macho::Section64*>(Data.data());
- Result = parseSegmentOrSectionName(sec->Name);
+ return ArrayRef<char>(sec->Name, 16);
} else {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
unsigned SectionOffset = LCI.Offset + sizeof(macho::SegmentLoadCommand) +
@@ -498,13 +497,19 @@ error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section));
const macho::Section *sec =
reinterpret_cast<const macho::Section*>(Data.data());
- Result = parseSegmentOrSectionName(sec->Name);
+ return ArrayRef<char>(sec->Name, 16);
}
+}
+
+error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
+ StringRef &Result) const {
+ ArrayRef<char> Raw = getSectionRawName(DRI);
+ Result = parseSegmentOrSectionName(Raw.data());
return object_error::success;
}
-error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec,
- StringRef &Res) const {
+ArrayRef<char>
+MachOObjectFile::getSectionRawFinalSegmentName(DataRefImpl Sec) const {
if (is64BitLoadCommand(MachOObj.get(), Sec)) {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a);
unsigned SectionOffset = LCI.Offset + sizeof(macho::Segment64LoadCommand) +
@@ -512,7 +517,7 @@ error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec,
StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section64));
const macho::Section64 *sec =
reinterpret_cast<const macho::Section64*>(Data.data());
- Res = parseSegmentOrSectionName(sec->SegmentName);
+ return ArrayRef<char>(sec->SegmentName, 16);
} else {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a);
unsigned SectionOffset = LCI.Offset + sizeof(macho::SegmentLoadCommand) +
@@ -520,9 +525,13 @@ error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec,
StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section));
const macho::Section *sec =
reinterpret_cast<const macho::Section*>(Data.data());
- Res = parseSegmentOrSectionName(sec->SegmentName);
+ return ArrayRef<char>(sec->SegmentName);
}
- return object_error::success;
+}
+
+StringRef MachOObjectFile::getSectionFinalSegmentName(DataRefImpl DRI) const {
+ ArrayRef<char> Raw = getSectionRawFinalSegmentName(DRI);
+ return parseSegmentOrSectionName(Raw.data());
}
error_code MachOObjectFile::getSectionAddress(DataRefImpl DRI,
diff --git a/test/tools/llvm-readobj/sections-ext.test b/test/tools/llvm-readobj/sections-ext.test
index 3254040c05..a972c9ab51 100644
--- a/test/tools/llvm-readobj/sections-ext.test
+++ b/test/tools/llvm-readobj/sections-ext.test
@@ -135,8 +135,8 @@ ELF-NEXT: }
MACHO: Sections [
MACHO-NEXT: Section {
MACHO-NEXT: Index: 0
-MACHO-NEXT: Name: __text (5F 5F 74 65 78 74 00
-MACHO-NEXT: Segment:
+MACHO-NEXT: Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
+MACHO-NEXT: Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
MACHO-NEXT: Address: 0x0
MACHO-NEXT: Size: 0x22
MACHO-NEXT: Offset: 324
diff --git a/test/tools/llvm-readobj/sections.test b/test/tools/llvm-readobj/sections.test
index e5c6c063b2..84154d759c 100644
--- a/test/tools/llvm-readobj/sections.test
+++ b/test/tools/llvm-readobj/sections.test
@@ -79,8 +79,8 @@ ELF-NEXT: }
MACHO: Sections [
MACHO-NEXT: Section {
MACHO-NEXT: Index: 0
-MACHO-NEXT: Name: __text (
-MACHO-NEXT: Segment:
+MACHO-NEXT: Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
+MACHO-NEXT: Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
MACHO-NEXT: Address: 0x0
MACHO-NEXT: Size: 0x22
MACHO-NEXT: Offset: 324
@@ -97,8 +97,8 @@ MACHO-NEXT: Reserved2: 0x0
MACHO-NEXT: }
MACHO-NEXT: Section {
MACHO-NEXT: Index: 1
-MACHO-NEXT: Name: __cstring (
-MACHO-NEXT: Segment:
+MACHO-NEXT: Name: __cstring (5F 5F 63 73 74 72 69 6E 67 00 00 00 00 00 00 00)
+MACHO-NEXT: Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
MACHO-NEXT: Address: 0x22
MACHO-NEXT: Size: 0xD
MACHO-NEXT: Offset: 358
diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp
index c324ff13a6..e9d2b3b1a8 100644
--- a/tools/llvm-objdump/MachODump.cpp
+++ b/tools/llvm-objdump/MachODump.cpp
@@ -337,10 +337,9 @@ void llvm::DisassembleInputMachO(StringRef Filename) {
SectName != "__text")
continue; // Skip non-text sections
- StringRef SegmentName;
DataRefImpl DR = Sections[SectIdx].getRawDataRefImpl();
- if (MachOOF->getSectionFinalSegmentName(DR, SegmentName) ||
- SegmentName != "__TEXT")
+ StringRef SegmentName = MachOOF->getSectionFinalSegmentName(DR);
+ if (SegmentName != "__TEXT")
continue;
// Insert the functions from the function starts segment into our map.
diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp
index 7832cf0dff..9a36e8253d 100644
--- a/tools/llvm-objdump/llvm-objdump.cpp
+++ b/tools/llvm-objdump/llvm-objdump.cpp
@@ -257,8 +257,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
StringRef SegmentName = "";
if (const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(Obj)) {
DataRefImpl DR = i->getRawDataRefImpl();
- if (error(MachO->getSectionFinalSegmentName(DR, SegmentName)))
- break;
+ SegmentName = MachO->getSectionFinalSegmentName(DR);
}
StringRef name;
if (error(i->getName(name))) break;
@@ -593,10 +592,8 @@ static void PrintSymbolTable(const ObjectFile *o) {
outs() << "*UND*";
else {
if (const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(o)) {
- StringRef SegmentName;
DataRefImpl DR = Section->getRawDataRefImpl();
- if (error(MachO->getSectionFinalSegmentName(DR, SegmentName)))
- SegmentName = "";
+ StringRef SegmentName = MachO->getSectionFinalSegmentName(DR);
outs() << SegmentName << ",";
}
StringRef SectionName;
diff --git a/tools/llvm-readobj/MachODumper.cpp b/tools/llvm-readobj/MachODumper.cpp
index 798c941772..0354e767ba 100644
--- a/tools/llvm-readobj/MachODumper.cpp
+++ b/tools/llvm-readobj/MachODumper.cpp
@@ -157,14 +157,6 @@ namespace {
};
}
-static StringRef parseSegmentOrSectionName(ArrayRef<char> P) {
- if (P[15] == 0)
- // Null terminated.
- return StringRef(P.data());
- // Not null terminated, so this is a 16 char string.
- return StringRef(P.data(), 16);
-}
-
static bool is64BitLoadCommand(const MachOObject *MachOObj, DataRefImpl DRI) {
LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
if (LCI.Command.Type == macho::LCT_Segment64)
@@ -181,8 +173,6 @@ static void getSection(const MachOObject *MachOObj,
InMemoryStruct<macho::Section64> Sect;
MachOObj->ReadSection64(LCI, DRI.d.b, Sect);
- Section.Name = ArrayRef<char>(Sect->Name);
- Section.SegmentName = ArrayRef<char>(Sect->SegmentName);
Section.Address = Sect->Address;
Section.Size = Sect->Size;
Section.Offset = Sect->Offset;
@@ -196,8 +186,6 @@ static void getSection(const MachOObject *MachOObj,
InMemoryStruct<macho::Section> Sect;
MachOObj->ReadSection(LCI, DRI.d.b, Sect);
- Section.Name = Sect->Name;
- Section.SegmentName = Sect->SegmentName;
Section.Address = Sect->Address;
Section.Size = Sect->Size;
Section.Offset = Sect->Offset;
@@ -270,15 +258,20 @@ void MachODumper::printSections() {
MachOSection Section;
getSection(MachO, SecI->getRawDataRefImpl(), Section);
+ DataRefImpl DR = SecI->getRawDataRefImpl();
+
StringRef Name;
if (error(SecI->getName(Name)))
Name = "";
+ ArrayRef<char> RawName = Obj->getSectionRawName(DR);
+ StringRef SegmentName = Obj->getSectionFinalSegmentName(DR);
+ ArrayRef<char> RawSegmentName = Obj->getSectionRawFinalSegmentName(DR);
+
DictScope SectionD(W, "Section");
W.printNumber("Index", SectionIndex);
- W.printBinary("Name", Name, Section.Name);
- W.printBinary("Segment", parseSegmentOrSectionName(Section.SegmentName),
- Section.SegmentName);
+ W.printBinary("Name", Name, RawName);
+ W.printBinary("Segment", SegmentName, RawSegmentName);
W.printHex ("Address", Section.Address);
W.printHex ("Size", Section.Size);
W.printNumber("Offset", Section.Offset);