summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSeiya Nuta <nuta@seiya.me>2019-06-17 02:07:20 +0000
committerSeiya Nuta <nuta@seiya.me>2019-06-17 02:07:20 +0000
commit4f15732067602c38f5280899971bb24f43612dd4 (patch)
tree3c1596f24f2e98caabe4c8c5eb07b3dcbb7cfe4b
parent13de174b4c4847255f1d510dc6dafeb5294753ef (diff)
downloadbcm5719-llvm-4f15732067602c38f5280899971bb24f43612dd4.tar.gz
bcm5719-llvm-4f15732067602c38f5280899971bb24f43612dd4.zip
[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
-rw-r--r--llvm/test/ObjectYAML/MachO/virtual_section.yaml226
-rw-r--r--llvm/tools/yaml2obj/yaml2macho.cpp18
2 files changed, 241 insertions, 3 deletions
diff --git a/llvm/test/ObjectYAML/MachO/virtual_section.yaml b/llvm/test/ObjectYAML/MachO/virtual_section.yaml
new file mode 100644
index 00000000000..f0aec166472
--- /dev/null
+++ b/llvm/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/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp
index 2df03fd3901..9dcc7d1d759 100644
--- a/llvm/tools/yaml2obj/yaml2macho.cpp
+++ b/llvm/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;
OpenPOWER on IntegriCloud