]> granicus.if.org Git - llvm/commitdiff
[yaml2obj][MachO] Don't fill dummy data for virtual sections
authorSeiya Nuta <nuta@seiya.me>
Mon, 17 Jun 2019 02:07:20 +0000 (02:07 +0000)
committerSeiya Nuta <nuta@seiya.me>
Mon, 17 Jun 2019 02:07:20 +0000 (02:07 +0000)
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

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

test/ObjectYAML/MachO/virtual_section.yaml [new file with mode: 0644]
tools/yaml2obj/yaml2macho.cpp

diff --git a/test/ObjectYAML/MachO/virtual_section.yaml b/test/ObjectYAML/MachO/virtual_section.yaml
new file mode 100644 (file)
index 0000000..f0aec16
--- /dev/null
@@ -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
index 2df03fd390128a950661adc31b27ce2c6a2e1644..9dcc7d1d759da7239a31ecbf848cbdfa1cdf89c9 100644 (file)
@@ -262,6 +262,12 @@ Error MachOWriter::writeLoadCommands(raw_ostream &OS) {
   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_ostream &OS) {
           } 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;