--- /dev/null
+# 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
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) {
} 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;