]> granicus.if.org Git - llvm/commitdiff
[dwarfdump] Skip 'stripped' sections
authorJonas Devlieghere <jonas@devlieghere.com>
Tue, 26 Sep 2017 14:22:35 +0000 (14:22 +0000)
committerJonas Devlieghere <jonas@devlieghere.com>
Tue, 26 Sep 2017 14:22:35 +0000 (14:22 +0000)
When dsymutil generates the companion file, its strips all unnecessary
sections by omitting their body and setting the offset in their
corresponding load command to zero.

One such section is the .eh_frame section, as it contains runtime
information rather than debug information and is part of the __TEXT
segment. When reading this section, we would just read the number of
bytes specified in the load command, starting from offset 0 (i.e. the
beginning of the file).

Rather than trying to parse this obviously invalid section, dwarfdump
now skips this.

Differential revision: https://reviews.llvm.org/D38135

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314208 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/MachO.h
include/llvm/Object/ObjectFile.h
lib/DebugInfo/DWARF/DWARFContext.cpp
lib/Object/MachOObjectFile.cpp
lib/Object/ObjectFile.cpp
test/tools/llvm-dwarfdump/X86/Inputs/empty.dSYM [new file with mode: 0644]
test/tools/llvm-dwarfdump/X86/stripped.test [new file with mode: 0644]

index a4ecc51a6fa45c848cddf3d3dd3e607a47fe12b0..03fd52fb482f482a7066b174564deb17ab8f8c22 100644 (file)
@@ -310,6 +310,16 @@ public:
   bool isSectionBSS(DataRefImpl Sec) const override;
   bool isSectionVirtual(DataRefImpl Sec) const override;
   bool isSectionBitcode(DataRefImpl Sec) const override;
+
+  /// When dsymutil generates the companion file, it strips all unnecessary
+  /// sections (e.g. everything in the _TEXT segment) by omitting their body
+  /// and setting the offset in their corresponding load command to zero.
+  ///
+  /// While the load command itself is valid, reading the section corresponds
+  /// to reading the number of bytes specified in the load command, starting
+  /// from offset 0 (i.e. the Mach-O header at the beginning of the file).
+  bool isSectionStripped(DataRefImpl Sec) const override;
+
   relocation_iterator section_rel_begin(DataRefImpl Sec) const override;
   relocation_iterator section_rel_end(DataRefImpl Sec) const override;
 
index 867c218c2a9501f5194b50cde999928a18f06570..57496373973c836870df70a3d0cdadaf598a721f 100644 (file)
@@ -109,6 +109,7 @@ public:
   bool isBSS() const;
   bool isVirtual() const;
   bool isBitcode() const;
+  bool isStripped() const;
 
   bool containsSymbol(SymbolRef S) const;
 
@@ -236,6 +237,7 @@ protected:
   // A section is 'virtual' if its contents aren't present in the object image.
   virtual bool isSectionVirtual(DataRefImpl Sec) const = 0;
   virtual bool isSectionBitcode(DataRefImpl Sec) const;
+  virtual bool isSectionStripped(DataRefImpl Sec) const;
   virtual relocation_iterator section_rel_begin(DataRefImpl Sec) const = 0;
   virtual relocation_iterator section_rel_end(DataRefImpl Sec) const = 0;
   virtual section_iterator getRelocatedSection(DataRefImpl Sec) const;
@@ -442,6 +444,10 @@ inline bool SectionRef::isBitcode() const {
   return OwningObject->isSectionBitcode(SectionPimpl);
 }
 
+inline bool SectionRef::isStripped() const {
+  return OwningObject->isSectionStripped(SectionPimpl);
+}
+
 inline relocation_iterator SectionRef::relocation_begin() const {
   return OwningObject->section_rel_begin(SectionPimpl);
 }
index 59cf636e60439dd59d2307c3a9eb8e207f43279f..156c65ad92a149dd36680df3d31eb62d4da6593c 100644 (file)
@@ -1135,6 +1135,10 @@ public:
       if (Section.isBSS() || Section.isVirtual())
         continue;
 
+      // Skip sections stripped by dsymutil.
+      if (Section.isStripped())
+        continue;
+
       StringRef Data;
       section_iterator RelocatedSection = Section.getRelocatedSection();
       // Try to obtain an already relocated version of this section.
index b943c4063d6982f8e6b2b85b4304781842404680..7b4be973a097d515f94d21fa1e7923930ec6de39 100644 (file)
@@ -1928,6 +1928,12 @@ bool MachOObjectFile::isSectionBitcode(DataRefImpl Sec) const {
   return false;
 }
 
+bool MachOObjectFile::isSectionStripped(DataRefImpl Sec) const {
+  if (is64Bit())
+    return getSection64(Sec).offset == 0;
+  return getSection(Sec).offset == 0;
+}
+
 relocation_iterator MachOObjectFile::section_rel_begin(DataRefImpl Sec) const {
   DataRefImpl Ret;
   Ret.d.a = Sec.d.a;
index 67818409986570189dda7cc829e75ba9fb74ff73..2b80d0bf538fb572cabca7189ac8bd1ab6274c92 100644 (file)
@@ -75,6 +75,8 @@ bool ObjectFile::isSectionBitcode(DataRefImpl Sec) const {
   return false;
 }
 
+bool ObjectFile::isSectionStripped(DataRefImpl Sec) const { return false; }
+
 section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const {
   return section_iterator(SectionRef(Sec, this));
 }
diff --git a/test/tools/llvm-dwarfdump/X86/Inputs/empty.dSYM b/test/tools/llvm-dwarfdump/X86/Inputs/empty.dSYM
new file mode 100644 (file)
index 0000000..5f7962d
Binary files /dev/null and b/test/tools/llvm-dwarfdump/X86/Inputs/empty.dSYM differ
diff --git a/test/tools/llvm-dwarfdump/X86/stripped.test b/test/tools/llvm-dwarfdump/X86/stripped.test
new file mode 100644 (file)
index 0000000..1eaf192
--- /dev/null
@@ -0,0 +1,11 @@
+RUN: llvm-dwarfdump -debug-frame %S/Inputs/empty.dSYM | FileCheck %s
+
+You can generate an empty dSYM companion file by invoking dsymutil on any
+object file.
+
+CHECK: .debug_frame contents:
+CHECK-NOT: CIE
+CHECK-NOT: FDE
+CHECK: .eh_frame contents:
+CHECK-NOT: CIE
+CHECK-NOT: FDE