1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

[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
This commit is contained in:
Seiya Nuta 2019-06-17 02:07:20 +00:00
parent d44769e77f
commit 942fd33165
2 changed files with 241 additions and 3 deletions

View File

@ -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

View File

@ -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;