[llvm] r363525 - [yaml2obj][MachO] Don't fill dummy data for virtual sections

Seiya Nuta via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 16 19:07:20 PDT 2019


Author: seiya
Date: Sun Jun 16 19:07:20 2019
New Revision: 363525

URL: http://llvm.org/viewvc/llvm-project?rev=363525&view=rev
Log:
[yaml2obj][MachO] Don't fill dummy data for virtual sections

Summary:
Currently, MachOWriter::writeSectionData writes dummy data (0xdeadbeef) to fill section data areas in the file even if the section is a virtual one. Since virtual sections don't occupy any space in the file, writing dummy data could results the  "OS.tell() - fileStart <= Sec.offset" assertion failure.

This patch fixes the bug by simply not writing any dummy data for virtual sections.

Reviewers: beanz, jhenderson, rupprecht, alexshap

Reviewed By: alexshap

Subscribers: compnerd, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D62991

Added:
    llvm/trunk/test/ObjectYAML/MachO/virtual_section.yaml
Modified:
    llvm/trunk/tools/yaml2obj/yaml2macho.cpp

Added: llvm/trunk/test/ObjectYAML/MachO/virtual_section.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ObjectYAML/MachO/virtual_section.yaml?rev=363525&view=auto
==============================================================================
--- llvm/trunk/test/ObjectYAML/MachO/virtual_section.yaml (added)
+++ llvm/trunk/test/ObjectYAML/MachO/virtual_section.yaml Sun Jun 16 19:07:20 2019
@@ -0,0 +1,226 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !mach-o
+FileHeader:
+  magic:           0xFEEDFACE
+  cputype:         0x00000007
+  cpusubtype:      0x00000003
+  filetype:        0x00000001
+  ncmds:           4
+  sizeofcmds:      660
+  flags:           0x00002000
+LoadCommands:
+  - cmd:             LC_SEGMENT
+    cmdsize:         532
+    segname:         ''
+    vmaddr:          0
+    vmsize:          175
+    fileoff:         688
+    filesize:        160
+    maxprot:         7
+    initprot:        7
+    nsects:          7
+    flags:           0
+    Sections:
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x0000000000000000
+        size:            72
+        offset:          0x000002B0
+        align:           4
+        reloff:          0x00000350
+        nreloc:          7
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __data
+        segname:         __DATA
+        addr:            0x0000000000000048
+        size:            4
+        offset:          0x000002F8
+        align:           2
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000000
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __bss
+        segname:         __DATA
+        addr:            0x00000000000000A0
+        size:            8
+        offset:          0x00000000
+        align:           2
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000001
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __thread_bss
+        segname:         __DATA
+        addr:            0x00000000000000A8
+        size:            7
+        offset:          0x00000000
+        align:           0
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x00000012
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+      - sectname:        __thread_vars
+        segname:         __DATA
+        addr:            0x000000000000004C
+        size:            12
+        offset:          0x000002FC
+        align:           0
+        reloff:          0x00000388
+        nreloc:          2
+        flags:           0x00000013
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_BUILD_VERSION
+    cmdsize:         24
+    platform:        1
+    minos:           658944
+    sdk:             0
+    ntools:          0
+  - cmd:             LC_SYMTAB
+    cmdsize:         24
+    symoff:          928
+    nsyms:           7
+    stroff:          1012
+    strsize:         48
+  - cmd:             LC_DYSYMTAB
+    cmdsize:         80
+    ilocalsym:       0
+    nlocalsym:       4
+    iextdefsym:      4
+    nextdefsym:      2
+    iundefsym:       6
+    nundefsym:       1
+    tocoff:          0
+    ntoc:            0
+    modtaboff:       0
+    nmodtab:         0
+    extrefsymoff:    0
+    nextrefsyms:     0
+    indirectsymoff:  0
+    nindirectsyms:   0
+    extreloff:       0
+    nextrel:         0
+    locreloff:       0
+    nlocrel:         0
+LinkEditData:
+  NameList:
+    - n_strx:          44
+      n_type:          0x0E
+      n_sect:          2
+      n_desc:          0
+      n_value:         72
+    - n_strx:          41
+      n_type:          0x0E
+      n_sect:          3
+      n_desc:          0
+      n_value:         160
+    - n_strx:          38
+      n_type:          0x0E
+      n_sect:          3
+      n_desc:          0
+      n_value:         164
+    - n_strx:          1
+      n_type:          0x0E
+      n_sect:          4
+      n_desc:          0
+      n_value:         168
+    - n_strx:          35
+      n_type:          0x0F
+      n_sect:          5
+      n_desc:          0
+      n_value:         76
+    - n_strx:          29
+      n_type:          0x0F
+      n_sect:          1
+      n_desc:          0
+      n_value:         0
+    - n_strx:          13
+      n_type:          0x01
+      n_sect:          0
+      n_desc:          0
+      n_value:         0
+  StringTable:
+    - ''
+    - '_d$tlv$init'
+    - __tlv_bootstrap
+    - _main
+    - _d
+    - _c
+    - _b
+    - _a
+    - ''
+...
+
+# CHECK:         Sections:
+# CHECK-NEXT:      - sectname:        __text
+# CHECK-NEXT:        segname:         __TEXT
+# CHECK-NEXT:        addr:            0x0000000000000000
+# CHECK-NEXT:        size:            72
+# CHECK-NEXT:        offset:          0x000002B0
+# CHECK-NEXT:        align:           4
+# CHECK-NEXT:        reloff:          0x00000350
+# CHECK-NEXT:        nreloc:          7
+# CHECK-NEXT:        flags:           0x80000400
+# CHECK-NEXT:        reserved1:       0x00000000
+# CHECK-NEXT:        reserved2:       0x00000000
+# CHECK-NEXT:        reserved3:       0x00000000
+# CHECK-NEXT:      - sectname:        __data
+# CHECK-NEXT:        segname:         __DATA
+# CHECK-NEXT:        addr:            0x0000000000000048
+# CHECK-NEXT:        size:            4
+# CHECK-NEXT:        offset:          0x000002F8
+# CHECK-NEXT:        align:           2
+# CHECK-NEXT:        reloff:          0x00000000
+# CHECK-NEXT:        nreloc:          0
+# CHECK-NEXT:        flags:           0x00000000
+# CHECK-NEXT:        reserved1:       0x00000000
+# CHECK-NEXT:        reserved2:       0x00000000
+# CHECK-NEXT:        reserved3:       0x00000000
+# CHECK-NEXT:      - sectname:        __bss
+# CHECK-NEXT:        segname:         __DATA
+# CHECK-NEXT:        addr:            0x00000000000000A0
+# CHECK-NEXT:        size:            8
+# CHECK-NEXT:        offset:          0x00000000
+# CHECK-NEXT:        align:           2
+# CHECK-NEXT:        reloff:          0x00000000
+# CHECK-NEXT:        nreloc:          0
+# CHECK-NEXT:        flags:           0x00000001
+# CHECK-NEXT:        reserved1:       0x00000000
+# CHECK-NEXT:        reserved2:       0x00000000
+# CHECK-NEXT:        reserved3:       0x00000000
+# CHECK-NEXT:      - sectname:        __thread_bss
+# CHECK-NEXT:        segname:         __DATA
+# CHECK-NEXT:        addr:            0x00000000000000A8
+# CHECK-NEXT:        size:            7
+# CHECK-NEXT:        offset:          0x00000000
+# CHECK-NEXT:        align:           0
+# CHECK-NEXT:        reloff:          0x00000000
+# CHECK-NEXT:        nreloc:          0
+# CHECK-NEXT:        flags:           0x00000012
+# CHECK-NEXT:        reserved1:       0x00000000
+# CHECK-NEXT:        reserved2:       0x00000000
+# CHECK-NEXT:        reserved3:       0x00000000
+# CHECK-NEXT:      - sectname:        __thread_vars
+# CHECK-NEXT:        segname:         __DATA
+# CHECK-NEXT:        addr:            0x000000000000004C
+# CHECK-NEXT:        size:            12
+# CHECK-NEXT:        offset:          0x000002FC
+# CHECK-NEXT:        align:           0
+# CHECK-NEXT:        reloff:          0x00000388
+# CHECK-NEXT:        nreloc:          2
+# CHECK-NEXT:        flags:           0x00000013
+# CHECK-NEXT:        reserved1:       0x00000000
+# CHECK-NEXT:        reserved2:       0x00000000
+# CHECK-NEXT:        reserved3:       0x00000000

Modified: llvm/trunk/tools/yaml2obj/yaml2macho.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2macho.cpp?rev=363525&r1=363524&r2=363525&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2macho.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2macho.cpp Sun Jun 16 19:07:20 2019
@@ -262,6 +262,12 @@ Error MachOWriter::writeLoadCommands(raw
   return Error::success();
 }
 
+static bool isVirtualSection(uint8_t type) {
+  return (type == MachO::S_ZEROFILL ||
+          type == MachO::S_GB_ZEROFILL ||
+          type == MachO::S_THREAD_LOCAL_ZEROFILL);
+}
+
 Error MachOWriter::writeSectionData(raw_ostream &OS) {
   bool FoundLinkEditSeg = false;
   for (auto &LC : Obj.LoadCommands) {
@@ -300,10 +306,16 @@ Error MachOWriter::writeSectionData(raw_
           } else if (0 == strncmp(&Sec.sectname[0], "__debug_line", 16)) {
             DWARFYAML::EmitDebugLine(OS, Obj.DWARF);
           }
-        } else {
-          // Fills section data with 0xDEADBEEF
-          Fill(OS, Sec.size, 0xDEADBEEFu);
+
+          continue;
         }
+
+        // Skip if it's a virtual section.
+        if (isVirtualSection(Sec.flags & MachO::SECTION_TYPE))
+          continue;
+
+        // Fill section data with 0xDEADBEEF
+        Fill(OS, Sec.size, 0xDEADBEEFu);
       }
       uint64_t segSize = is64Bit ? LC.Data.segment_command_64_data.filesize
                                  : LC.Data.segment_command_data.filesize;




More information about the llvm-commits mailing list