Index: llvm/test/ObjectYAML/MachO/virtual_section.yaml =================================================================== --- /dev/null +++ llvm/test/ObjectYAML/MachO/virtual_section.yaml @@ -0,0 +1,204 @@ +# RUN: yaml2obj %s | obj2yaml | FileCheck %s + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x00000003 + filetype: 0x00000001 + ncmds: 4 + sizeofcmds: 600 + flags: 0x00002000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 472 + segname: '' + vmaddr: 0 + vmsize: 128 + fileoff: 632 + filesize: 120 + maxprot: 7 + initprot: 7 + nsects: 5 + flags: 0 + Sections: + - sectname: __text + segname: __TEXT + addr: 0x0000000000000000 + size: 18 + offset: 0x00000278 + align: 4 + reloff: 0x000002F0 + nreloc: 2 + flags: 0x80000400 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __common + segname: __DATA + addr: 0x0000000000000078 + size: 4 + offset: 0x00000000 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000001 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __bss + segname: __DATA + addr: 0x000000000000007C + size: 4 + offset: 0x00000000 + align: 2 + reloff: 0x00000000 + nreloc: 0 + flags: 0x00000001 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __compact_unwind + segname: __LD + addr: 0x0000000000000018 + size: 32 + offset: 0x00000290 + align: 3 + reloff: 0x00000300 + nreloc: 1 + flags: 0x02000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __eh_frame + segname: __TEXT + addr: 0x0000000000000038 + size: 64 + offset: 0x000002B0 + align: 3 + reloff: 0x00000000 + nreloc: 0 + flags: 0x6800000B + 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: 776 + nsyms: 3 + stroff: 824 + strsize: 12 + - cmd: LC_DYSYMTAB + cmdsize: 80 + ilocalsym: 0 + nlocalsym: 1 + iextdefsym: 1 + nextdefsym: 2 + iundefsym: 3 + nundefsym: 0 + 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: 4 + n_type: 0x0E + n_sect: 3 + n_desc: 0 + n_value: 124 + - n_strx: 7 + n_type: 0x0F + n_sect: 2 + n_desc: 0 + n_value: 120 + - n_strx: 1 + n_type: 0x0F + n_sect: 1 + n_desc: 0 + n_value: 0 + StringTable: + - '' + - _f + - _b + - _a + - '' + - '' +... + +# CHECK: Sections: +# CHECK-NEXT: - sectname: __text +# CHECK-NEXT: segname: __TEXT +# CHECK-NEXT: addr: 0x0000000000000000 +# CHECK-NEXT: size: 18 +# CHECK-NEXT: offset: 0x00000278 +# CHECK-NEXT: align: 4 +# CHECK-NEXT: reloff: 0x000002F0 +# CHECK-NEXT: nreloc: 2 +# CHECK-NEXT: flags: 0x80000400 +# CHECK-NEXT: reserved1: 0x00000000 +# CHECK-NEXT: reserved2: 0x00000000 +# CHECK-NEXT: reserved3: 0x00000000 +# CHECK-NEXT: - sectname: __common +# CHECK-NEXT: segname: __DATA +# CHECK-NEXT: addr: 0x0000000000000078 +# CHECK-NEXT: size: 4 +# 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: __bss +# CHECK-NEXT: segname: __DATA +# CHECK-NEXT: addr: 0x000000000000007C +# CHECK-NEXT: size: 4 +# 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: __compact_unwind +# CHECK-NEXT: segname: __LD +# CHECK-NEXT: addr: 0x0000000000000018 +# CHECK-NEXT: size: 32 +# CHECK-NEXT: offset: 0x00000290 +# CHECK-NEXT: align: 3 +# CHECK-NEXT: reloff: 0x00000300 +# CHECK-NEXT: nreloc: 1 +# CHECK-NEXT: flags: 0x02000000 +# CHECK-NEXT: reserved1: 0x00000000 +# CHECK-NEXT: reserved2: 0x00000000 +# CHECK-NEXT: reserved3: 0x00000000 +# CHECK-NEXT: - sectname: __eh_frame +# CHECK-NEXT: segname: __TEXT +# CHECK-NEXT: addr: 0x0000000000000038 +# CHECK-NEXT: size: 64 +# CHECK-NEXT: offset: 0x000002B0 +# CHECK-NEXT: align: 3 +# CHECK-NEXT: reloff: 0x00000000 +# CHECK-NEXT: nreloc: 0 +# CHECK-NEXT: flags: 0x6800000B +# CHECK-NEXT: reserved1: 0x00000000 +# CHECK-NEXT: reserved2: 0x00000000 +# CHECK-NEXT: reserved3: 0x00000000 \ No newline at end of file Index: llvm/tools/yaml2obj/yaml2macho.cpp =================================================================== --- llvm/tools/yaml2obj/yaml2macho.cpp +++ llvm/tools/yaml2obj/yaml2macho.cpp @@ -262,6 +262,12 @@ 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 @@ } 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;