From 942fd3316549b9379e7edc4ce847350df2c25c8e Mon Sep 17 00:00:00 2001 From: Seiya Nuta Date: Mon, 17 Jun 2019 02:07:20 +0000 Subject: [PATCH] [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 llvm-svn: 363525 --- test/ObjectYAML/MachO/virtual_section.yaml | 226 +++++++++++++++++++++ tools/yaml2obj/yaml2macho.cpp | 18 +- 2 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 test/ObjectYAML/MachO/virtual_section.yaml diff --git a/test/ObjectYAML/MachO/virtual_section.yaml b/test/ObjectYAML/MachO/virtual_section.yaml new file mode 100644 index 00000000000..f0aec166472 --- /dev/null +++ b/test/ObjectYAML/MachO/virtual_section.yaml @@ -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 diff --git a/tools/yaml2obj/yaml2macho.cpp b/tools/yaml2obj/yaml2macho.cpp index 2df03fd3901..9dcc7d1d759 100644 --- a/tools/yaml2obj/yaml2macho.cpp +++ b/tools/yaml2obj/yaml2macho.cpp @@ -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;