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 --- include/llvm/Object/MachO.h | 8 +++++++- lib/Object/MachOObjectFile.cpp | 27 ++++++++++++++++++--------- test/tools/llvm-readobj/sections-ext.test | 4 ++-- test/tools/llvm-readobj/sections.test | 8 ++++---- tools/llvm-objdump/MachODump.cpp | 5 ++--- tools/llvm-objdump/llvm-objdump.cpp | 7 ++----- tools/llvm-readobj/MachODumper.cpp | 23 ++++++++--------------- 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 getSectionRawName(DataRefImpl Sec) const; + ArrayRefgetSectionRawFinalSegmentName(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 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(Data.data()); - Result = parseSegmentOrSectionName(sec->Name); + return ArrayRef(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(Data.data()); - Result = parseSegmentOrSectionName(sec->Name); + return ArrayRef(sec->Name, 16); } +} + +error_code MachOObjectFile::getSectionName(DataRefImpl DRI, + StringRef &Result) const { + ArrayRef Raw = getSectionRawName(DRI); + Result = parseSegmentOrSectionName(Raw.data()); return object_error::success; } -error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec, - StringRef &Res) const { +ArrayRef +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(Data.data()); - Res = parseSegmentOrSectionName(sec->SegmentName); + return ArrayRef(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(Data.data()); - Res = parseSegmentOrSectionName(sec->SegmentName); + return ArrayRef(sec->SegmentName); } - return object_error::success; +} + +StringRef MachOObjectFile::getSectionFinalSegmentName(DataRefImpl DRI) const { + ArrayRef 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(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(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 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.2.3