[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