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:
parent
d44769e77f
commit
942fd33165
226
test/ObjectYAML/MachO/virtual_section.yaml
Normal file
226
test/ObjectYAML/MachO/virtual_section.yaml
Normal 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
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user