From f16c2bb320f4d5b33dfaf8df8865f547e6d66005 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 5 Apr 2013 15:15:22 +0000 Subject: 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 --- tools/llvm-readobj/MachODumper.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) (limited to 'tools/llvm-readobj') diff --git a/tools/llvm-readobj/MachODumper.cpp b/tools/llvm-readobj/MachODumper.cpp index 798c941..0354e76 100644 --- a/tools/llvm-readobj/MachODumper.cpp +++ b/tools/llvm-readobj/MachODumper.cpp @@ -157,14 +157,6 @@ namespace { }; } -static StringRef parseSegmentOrSectionName(ArrayRef 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 Sect; MachOObj->ReadSection64(LCI, DRI.d.b, Sect); - Section.Name = ArrayRef(Sect->Name); - Section.SegmentName = ArrayRef(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 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 RawName = Obj->getSectionRawName(DR); + StringRef SegmentName = Obj->getSectionFinalSegmentName(DR); + ArrayRef 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); -- cgit v1.1