## This file contains test cases for generating sections in Mach-O object files. ## a) Test that yaml2obj emits sections and obj2yaml converts them back. # RUN: yaml2obj --docnum=1 %s | obj2yaml | FileCheck %s --- !mach-o FileHeader: magic: 0xFEEDFACF cputype: 0x01000007 cpusubtype: 0x80000003 filetype: 0x00000002 ncmds: 16 sizeofcmds: 1408 flags: 0x00218085 reserved: 0x00000000 LoadCommands: - cmd: LC_SEGMENT_64 cmdsize: 72 segname: __PAGEZERO vmaddr: 0 vmsize: 4294967296 fileoff: 0 filesize: 0 maxprot: 0 initprot: 0 nsects: 0 flags: 0 - cmd: LC_SEGMENT_64 cmdsize: 552 segname: __TEXT vmaddr: 4294967296 vmsize: 8192 fileoff: 0 filesize: 8192 maxprot: 7 initprot: 5 nsects: 6 flags: 0 Sections: - sectname: __text segname: __TEXT addr: 0x0000000100001160 size: 3099 offset: 0x00001160 align: 4 reloff: 0x00000000 nreloc: 0 flags: 0x80000400 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 - sectname: __stubs segname: __TEXT addr: 0x0000000100001D7C size: 90 offset: 0x00001D7C align: 1 reloff: 0x00000000 nreloc: 0 flags: 0x80000408 reserved1: 0x00000000 reserved2: 0x00000006 reserved3: 0x00000000 - sectname: __stub_helper segname: __TEXT addr: 0x0000000100001DD8 size: 166 offset: 0x00001DD8 align: 2 reloff: 0x00000000 nreloc: 0 flags: 0x80000400 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 - sectname: __gcc_except_tab segname: __TEXT addr: 0x0000000100001E80 size: 240 offset: 0x00001E80 align: 2 reloff: 0x00000000 nreloc: 0 flags: 0x00000000 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 - sectname: __cstring segname: __TEXT addr: 0x0000000100001F70 size: 15 offset: 0x00001F70 align: 0 reloff: 0x00000000 nreloc: 0 flags: 0x00000002 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 - sectname: __unwind_info segname: __TEXT addr: 0x0000000100001F80 size: 120 offset: 0x00001F80 align: 2 reloff: 0x00000000 nreloc: 0 flags: 0x00000000 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 - cmd: LC_SEGMENT_64 cmdsize: 312 segname: __DATA vmaddr: 4294975488 vmsize: 4096 fileoff: 8192 filesize: 4096 maxprot: 7 initprot: 3 nsects: 3 flags: 0 Sections: - sectname: __got segname: __DATA addr: 0x0000000100002000 size: 24 offset: 0x00002000 align: 3 reloff: 0x00000000 nreloc: 0 flags: 0x00000006 reserved1: 0x0000000F reserved2: 0x00000000 reserved3: 0x00000000 - sectname: __nl_symbol_ptr segname: __DATA addr: 0x0000000100002018 size: 16 offset: 0x00002018 align: 3 reloff: 0x00000000 nreloc: 0 flags: 0x00000006 reserved1: 0x00000012 reserved2: 0x00000000 reserved3: 0x00000000 - sectname: __la_symbol_ptr segname: __DATA addr: 0x0000000100002028 size: 120 offset: 0x00002028 align: 3 reloff: 0x00000000 nreloc: 0 flags: 0x00000007 reserved1: 0x00000014 reserved2: 0x00000000 reserved3: 0x00000000 - cmd: LC_SEGMENT_64 cmdsize: 72 segname: __LINKEDIT vmaddr: 4294979584 vmsize: 4096 fileoff: 12288 filesize: 2508 maxprot: 7 initprot: 1 nsects: 0 flags: 0 - cmd: LC_DYLD_INFO_ONLY cmdsize: 48 rebase_off: 12288 rebase_size: 8 bind_off: 12296 bind_size: 96 weak_bind_off: 0 weak_bind_size: 0 lazy_bind_off: 12392 lazy_bind_size: 624 export_off: 13016 export_size: 48 - cmd: LC_SYMTAB cmdsize: 24 symoff: 13080 nsyms: 30 stroff: 13700 strsize: 1096 - cmd: LC_DYSYMTAB cmdsize: 80 ilocalsym: 0 nlocalsym: 9 iextdefsym: 9 nextdefsym: 2 iundefsym: 11 nundefsym: 19 tocoff: 0 ntoc: 0 modtaboff: 0 nmodtab: 0 extrefsymoff: 0 nextrefsyms: 0 indirectsymoff: 13560 nindirectsyms: 35 extreloff: 0 nextrel: 0 locreloff: 0 nlocrel: 0 - cmd: LC_LOAD_DYLINKER cmdsize: 32 name: 12 - cmd: LC_UUID cmdsize: 24 uuid: 461A1B28-822F-3F38-B670-645419E636F5 - cmd: LC_VERSION_MIN_MACOSX cmdsize: 16 version: 658176 sdk: 658176 - cmd: LC_SOURCE_VERSION cmdsize: 16 version: 0 - cmd: LC_MAIN cmdsize: 24 entryoff: 4448 stacksize: 0 - cmd: LC_LOAD_DYLIB cmdsize: 48 dylib: name: 24 timestamp: 2 current_version: 7864576 compatibility_version: 65536 - cmd: LC_LOAD_DYLIB cmdsize: 56 dylib: name: 24 timestamp: 2 current_version: 80349697 compatibility_version: 65536 - cmd: LC_FUNCTION_STARTS cmdsize: 16 dataoff: 13064 datasize: 16 - cmd: LC_DATA_IN_CODE cmdsize: 16 dataoff: 13080 datasize: 0 ... #CHECK: - cmd: LC_SEGMENT_64 #CHECK: segname: __PAGEZERO #CHECK: - cmd: LC_SEGMENT_64 #CHECK: segname: __TEXT #CHECK: Sections: #CHECK: - sectname: __text #CHECK: segname: __TEXT #CHECK: addr: 0x100001160 #CHECK: size: 3099 #CHECK: offset: 0x1160 #CHECK: align: 4 #CHECK: reloff: 0x0 #CHECK: nreloc: 0 #CHECK: flags: 0x80000400 #CHECK: reserved1: 0x0 #CHECK: reserved2: 0x0 #CHECK: reserved3: 0x0 #CHECK: - sectname: __stubs #CHECK: segname: __TEXT #CHECK: - sectname: __stub_helper #CHECK: segname: __TEXT #CHECK: - sectname: __gcc_except_tab #CHECK: segname: __TEXT #CHECK: - sectname: __cstring #CHECK: segname: __TEXT #CHECK: - sectname: __unwind_info #CHECK: segname: __TEXT #CHECK: - cmd: LC_SEGMENT_64 #CHECK: segname: __DATA #CHECK: Sections: #CHECK: - sectname: __got #CHECK: segname: __DATA #CHECK: - sectname: __nl_symbol_ptr #CHECK: segname: __DATA #CHECK: - sectname: __la_symbol_ptr #CHECK: segname: __DATA ## b) Test that yaml2obj emits an error message if we specify an offset that ## makes the current section and the previous one overlap. # RUN: not yaml2obj --docnum=2 %s -o %t2.macho 2>&1 | FileCheck %s --check-prefix=OVERLAP # OVERLAP: yaml2obj: error: wrote too much data somewhere, section offsets in section __sec2 for segment __SEC don't line up: [cursor=0x121], [fileStart=0x0], [sectionOffset=0x1] --- !mach-o FileHeader: magic: 0xFEEDFACF cputype: 0x01000007 cpusubtype: 0x80000003 filetype: 0x00000002 ncmds: 1 sizeofcmds: 1024 flags: 0x00000000 reserved: 0x00000000 LoadCommands: - cmd: LC_SEGMENT_64 cmdsize: 0xff segname: __SEC vmaddr: 0 vmsize: 0 fileoff: 0 filesize: 0 maxprot: 0 initprot: 0 nsects: 2 flags: 0 Sections: - sectname: __sec1 segname: __SEC addr: 0x0000000000000000 size: 2 offset: 0x00000000 align: 0 reloff: 0x00000000 nreloc: 0 flags: 0x00000000 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 - sectname: __sec2 segname: __SEC addr: 0x0000000000000000 size: 2 offset: 0x00000001 ## Specify an offset that makes __sec1 and __sec2 overlap. align: 1 reloff: 0x00000000 nreloc: 0 flags: 0x00000000 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000