RUN: dsymutil -o - %p/../Inputs/basic.macho.i386 -f | llvm-readobj -file-headers -program-headers -sections -symbols - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK32 RUN: dsymutil -o - -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_64 -f | llvm-readobj -file-headers -program-headers -sections -symbols - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK64 This test checks that the dSYM companion binaries generated in 32 and 64 bits are correct. The check are pretty strict (we check even the offsets and sizes of the sections) in order to test the VM address layout algorithm. As the debug sections are generated, this is a bit risky, but I don't expect dsymutil's output to change much for these tiny C programs so this should be OK. The 32bits version doesn't have object files, thus it has basically no debug sections. CHECK32: Format: Mach-O 32-bit i386 CHECK32: Arch: i386 CHECK32: AddressSize: 32bit CHECK64: Format: Mach-O 64-bit x86-64 CHECK64: Arch: x86_64 CHECK64: AddressSize: 64bit CHECK: MachHeader { CHECK32: Magic: Magic (0xFEEDFACE) CHECK32: CpuType: X86 (0x7) CHECK32: CpuSubType: CPU_SUBTYPE_I386_ALL (0x3) CHECK64: Magic: Magic64 (0xFEEDFACF) CHECK64: CpuType: X86-64 (0x1000007) CHECK64: CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3) CHECK: FileType: DWARFSymbol (0xA) CHECK: NumOfLoadCommands: 7 CHECK: Flags [ (0x0) CHECK: } CHECK: Sections [ CHECK: Section { CHECK: Name: __text CHECK: Segment: __TEXT CHECK32: Address: 0x1E90 CHECK32: Size: 0x11A CHECK64: Address: 0x100000EA0 CHECK64: Size: 0x109 CHECK: Offset: 0 CHECK: Alignment: 4 CHECK: RelocationOffset: 0x0 CHECK: RelocationCount: 0 CHECK: Type: 0x0 CHECK: Attributes [ (0x800004) CHECK: PureInstructions (0x800000) CHECK: SomeInstructions (0x4) CHECK: ] CHECK: Reserved1: 0x0 CHECK: Reserved2: 0x0 CHECK: } CHECK: Section { CHECK: Name: __unwind_info CHECK: Segment: __TEXT CHECK32: Address: 0x1FAC CHECK64: Address: 0x100000FAC CHECK: Size: 0x48 CHECK: Offset: 0 CHECK: Alignment: 2 CHECK: RelocationOffset: 0x0 CHECK: RelocationCount: 0 CHECK: Type: 0x0 CHECK: Attributes [ (0x0) CHECK: ] CHECK: Reserved1: 0x0 CHECK: Reserved2: 0x0 CHECK: } CHECK32: Section { CHECK32: Name: __nl_symbol_ptr CHECK32: Segment: __DATA CHECK32: Address: 0x2000 CHECK32: Size: 0x4 CHECK32: Offset: 0 CHECK32: Alignment: 2 CHECK32: RelocationOffset: 0x0 CHECK32: RelocationCount: 0 CHECK32: Type: 0x6 CHECK32: Attributes [ (0x0) CHECK32: ] CHECK32: Reserved1: 0x0 CHECK32: Reserved2: 0x0 CHECK32: } CHECK: Section { CHECK: Name: __data CHECK: Segment: __DATA CHECK32: Address: 0x2004 CHECK64: Address: 0x100001000 CHECK: Size: 0x4 CHECK: Offset: 0 CHECK: Alignment: 2 CHECK: RelocationOffset: 0x0 CHECK: RelocationCount: 0 CHECK: Type: 0x0 CHECK: Attributes [ (0x0) CHECK: ] CHECK: Reserved1: 0x0 CHECK: Reserved2: 0x0 CHECK: } CHECK: Section { CHECK: Name: __common CHECK: Segment: __DATA CHECK32: Address: 0x2008 CHECK64: Address: 0x100001004 CHECK: Size: 0x4 CHECK: Offset: 0 CHECK: Alignment: 2 CHECK: RelocationOffset: 0x0 CHECK: RelocationCount: 0 CHECK: Type: LocReloc (0x1) CHECK: Attributes [ (0x0) CHECK: ] CHECK: Reserved1: 0x0 CHECK: Reserved2: 0x0 CHECK: } CHECK: Section { CHECK: Name: __bss CHECK: Segment: __DATA CHECK32: Address: 0x200C CHECK64: Address: 0x100001008 CHECK: Size: 0x4 CHECK: Offset: 0 CHECK: Alignment: 2 CHECK: RelocationOffset: 0x0 CHECK: RelocationCount: 0 CHECK: Type: LocReloc (0x1) CHECK: Attributes [ (0x0) CHECK: ] CHECK: Reserved1: 0x0 CHECK: Reserved2: 0x0 CHECK: } CHECK64: Section { CHECK64: Name: __debug_line CHECK64: Segment: __DWARF CHECK64: Address: 0x100003000 CHECK64: Size: 0xEA CHECK64: Offset: 8192 CHECK64: Alignment: 0 CHECK64: RelocationOffset: 0x0 CHECK64: RelocationCount: 0 CHECK64: Type: 0x0 CHECK64: Attributes [ (0x0) CHECK64: ] CHECK64: Reserved1: 0x0 CHECK64: Reserved2: 0x0 CHECK64: } CHECK64: Section { CHECK64: Name: __debug_pubnames CHECK64: Segment: __DWARF CHECK64: Address: 0x1000030EA CHECK64: Size: 0x7F CHECK64: Offset: 8426 CHECK64: Alignment: 0 CHECK64: RelocationOffset: 0x0 CHECK64: RelocationCount: 0 CHECK64: Type: 0x0 CHECK64: Attributes [ (0x0) CHECK64: ] CHECK64: Reserved1: 0x0 CHECK64: Reserved2: 0x0 CHECK64: } CHECK64: Section { CHECK64: Name: __debug_pubtypes CHECK64: Segment: __DWARF CHECK64: Address: 0x100003169 CHECK64: Size: 0x57 CHECK64: Offset: 8553 CHECK64: Alignment: 0 CHECK64: RelocationOffset: 0x0 CHECK64: RelocationCount: 0 CHECK64: Type: 0x0 CHECK64: Attributes [ (0x0) CHECK64: ] CHECK64: Reserved1: 0x0 CHECK64: Reserved2: 0x0 CHECK64: } CHECK64: Section { CHECK64: Name: __debug_aranges CHECK64: Segment: __DWARF CHECK64: Address: 0x1000031C0 CHECK64: Size: 0xB0 CHECK64: Offset: 8640 CHECK64: Alignment: 0 CHECK64: RelocationOffset: 0x0 CHECK64: RelocationCount: 0 CHECK64: Type: 0x0 CHECK64: Attributes [ (0x0) CHECK64: ] CHECK64: Reserved1: 0x0 CHECK64: Reserved2: 0x0 CHECK64: } CHECK64: Section { CHECK64: Name: __debug_info CHECK64: Segment: __DWARF CHECK64: Address: 0x100003270 CHECK64: Size: 0x1BC CHECK64: Offset: 8816 CHECK64: Alignment: 0 CHECK64: RelocationOffset: 0x0 CHECK64: RelocationCount: 0 CHECK64: Type: 0x0 CHECK64: Attributes [ (0x0) CHECK64: ] CHECK64: Reserved1: 0x0 CHECK64: Reserved2: 0x0 CHECK64: } CHECK: Section { CHECK: Name: __debug_abbrev CHECK: Segment: __DWARF CHECK32: Address: 0x4000 CHECK32: Size: 0x1 CHECK32: Offset: 8192 CHECK64: Address: 0x10000342C CHECK64: Size: 0x8F CHECK64: Offset: 9260 CHECK: Alignment: 0 CHECK: RelocationOffset: 0x0 CHECK: RelocationCount: 0 CHECK: Type: 0x0 CHECK: Attributes [ (0x0) CHECK: ] CHECK: Reserved1: 0x0 CHECK: Reserved2: 0x0 CHECK: } CHECK: Section { CHECK: Name: __debug_str CHECK: Segment: __DWARF CHECK32: Address: 0x4001 CHECK32: Size: 0x1 CHECK32: Offset: 8193 CHECK64: Address: 0x1000034BB CHECK64: Size: 0x9F CHECK64: Offset: 9403 CHECK: Alignment: 0 CHECK: RelocationOffset: 0x0 CHECK: RelocationCount: 0 CHECK: Type: 0x0 CHECK: Attributes [ (0x0) CHECK: ] CHECK: Reserved1: 0x0 CHECK: Reserved2: 0x0 CHECK: } CHECK: ] CHECK: Symbols [ CHECK: Symbol { CHECK: Name: _inc (2) CHECK: Type: Section (0xE) CHECK: Section: __text CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x0) CHECK: ] CHECK32: Value: 0x1F20 CHECK64: Value: 0x100000F20 CHECK: } CHECK: Symbol { CHECK: Name: _inc (2) CHECK: Type: Section (0xE) CHECK: Section: __text CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x0) CHECK: ] CHECK32: Value: 0x1F90 CHECK64: Value: 0x100000F90 CHECK: } CHECK: Symbol { CHECK: Name: _baz (7) CHECK: Type: Section (0xE) CHECK: Section: __data CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x0) CHECK: ] CHECK32: Value: 0x2004 CHECK64: Value: 0x100001000 CHECK: } CHECK: Symbol { CHECK: Name: _private_int (12) CHECK: Type: Section (0xE) CHECK: Section: __bss CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x0) CHECK: ] CHECK32: Value: 0x200C CHECK64: Value: 0x100001008 CHECK: } CHECK: Symbol { CHECK: Name: __mh_execute_header (25) CHECK: Extern CHECK: Type: Section (0xE) CHECK: Section: __text CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x10) CHECK: ReferencedDynamically (0x10) CHECK: ] CHECK32: Value: 0x1000 CHECK64: Value: 0x100000000 CHECK: } CHECK: Symbol { CHECK: Name: _bar (45) CHECK: Extern CHECK: Type: Section (0xE) CHECK: Section: __text CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x0) CHECK: ] CHECK32: Value: 0x1F40 CHECK64: Value: 0x100000F40 CHECK: } CHECK: Symbol { CHECK: Name: _foo (50) CHECK: Extern CHECK: Type: Section (0xE) CHECK: Section: __text CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x0) CHECK: ] CHECK32: Value: 0x1EC0 CHECK64: Value: 0x100000ED0 CHECK: } CHECK: Symbol { CHECK: Name: _main (55) CHECK: Extern CHECK: Type: Section (0xE) CHECK: Section: __text CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x0) CHECK: ] CHECK32: Value: 0x1E90 CHECK64: Value: 0x100000EA0 CHECK: } CHECK: Symbol { CHECK: Name: _val (61) CHECK: Extern CHECK: Type: Section (0xE) CHECK: Section: __common CHECK: RefType: UndefinedNonLazy (0x0) CHECK: Flags [ (0x0) CHECK: ] CHECK32: Value: 0x2008 CHECK64: Value: 0x100001004 CHECK: } CHECK: ]