llvm/llvm/test/tools/llvm-objcopy/MachO/add-multiple-sections.test

## This test verifies that llvm-objcopy can add multiple sections to a Mach-O binary.

# RUN: yaml2obj %s -o %t
# RUN: echo -n FOOabcdefg > %t.foo.data
# RUN: echo -n BARabcdefg > %t.bar.data

## Case 1: Add a new section twice into an existing segment.
# RUN: llvm-objcopy --add-section __TEXT,__foo=%t.foo.data %t %t.foo.1
# RUN: llvm-objcopy --add-section __TEXT,__bar=%t.bar.data %t.foo.1 %t.foo.bar.1
# RUN: llvm-readobj --sections --section-data %t.foo.bar.1 \
# RUN:   | FileCheck %s -check-prefix=CASE1

## Case 2: Add two new sections into an existing segment.
# RUN: llvm-objcopy --add-section __TEXT,__foo=%t.foo.data --add-section __TEXT,__bar=%t.bar.data %t %t.foo.bar.2
# RUN: llvm-readobj --sections --section-data %t.foo.bar.2 \
# RUN:   | FileCheck %s -check-prefix=CASE1

## Case 3: Add two new sections into two different segments.
# RUN: llvm-objcopy --add-section __FOO,__foo=%t.foo.data --add-section __BAR,__bar=%t.bar.data %t %t.foo.bar.3
# RUN: llvm-readobj --sections --section-data %t.foo.bar.3 \
# RUN:   | FileCheck %s -check-prefix=CASE3

--- !mach-o
FileHeader:
  magic:           0xFEEDFACF
  cputype:         0x01000007
  cpusubtype:      0x00000003
  filetype:        0x00000001
  ncmds:           1
  sizeofcmds:      152
  flags:           0x00002000
  reserved:        0x00000000
LoadCommands:
  - cmd:             LC_SEGMENT_64
    cmdsize:         152
    segname:         __TEXT
    vmaddr:          0
    vmsize:          4
    fileoff:         184
    filesize:        4
    maxprot:         7
    initprot:        7
    nsects:          1
    flags:           0
    Sections:
      - sectname:        __text
        segname:         __TEXT
        addr:            0x0000000000000000
        content:         'AABBCCDD'
        size:            4
        offset:          184
        align:           0
        reloff:          0x00000000
        nreloc:          0
        flags:           0x80000400
        reserved1:       0x00000000
        reserved2:       0x00000000
        reserved3:       0x00000000

# CASE1:        Sections [
# CASE1-NEXT:    Section {
# CASE1-NEXT:      Index: 0
# CASE1-NEXT:      Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
# CASE1-NEXT:      Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
# CASE1-NEXT:      Address: 0x0
# CASE1-NEXT:      Size: 0x4
# CASE1-NEXT:      Offset: 344
# CASE1-NEXT:      Alignment: 0
# CASE1-NEXT:      RelocationOffset: 0x0
# CASE1-NEXT:      RelocationCount: 0
# CASE1-NEXT:      Type: Regular (0x0)
# CASE1-NEXT:      Attributes [ (0x800004)
# CASE1-NEXT:        PureInstructions (0x800000)
# CASE1-NEXT:        SomeInstructions (0x4)
# CASE1-NEXT:      ]
# CASE1-NEXT:      Reserved1: 0x0
# CASE1-NEXT:      Reserved2: 0x0
# CASE1-NEXT:      Reserved3: 0x0
# CASE1-NEXT:      SectionData (
# CASE1-NEXT:        0000: AABBCCDD                             |....|
# CASE1-NEXT:      )
# CASE1-NEXT:    }
# CASE1-NEXT:    Section {
# CASE1-NEXT:      Index: 1
# CASE1-NEXT:      Name: __foo (5F 5F 66 6F 6F 00 00 00 00 00 00 00 00 00 00 00)
# CASE1-NEXT:      Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
# CASE1-NEXT:      Address: 0x4
# CASE1-NEXT:      Size: 0xA
# CASE1-NEXT:      Offset: 348
# CASE1-NEXT:      Alignment: 0
# CASE1-NEXT:      RelocationOffset: 0x0
# CASE1-NEXT:      RelocationCount: 0
# CASE1-NEXT:      Type: Regular (0x0)
# CASE1-NEXT:      Attributes [ (0x0)
# CASE1-NEXT:      ]
# CASE1-NEXT:      Reserved1: 0x0
# CASE1-NEXT:      Reserved2: 0x0
# CASE1-NEXT:      Reserved3: 0x0
# CASE1-NEXT:      SectionData (
# CASE1-NEXT:        0000: 464F4F61 62636465 6667               |FOOabcdefg|
# CASE1-NEXT:      )
# CASE1-NEXT:    }
# CASE1-NEXT:    Section {
# CASE1-NEXT:      Index: 2
# CASE1-NEXT:      Name: __bar (5F 5F 62 61 72 00 00 00 00 00 00 00 00 00 00 00)
# CASE1-NEXT:      Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
# CASE1-NEXT:      Address: 0xE
# CASE1-NEXT:      Size: 0xA
# CASE1-NEXT:      Offset: 358
# CASE1-NEXT:      Alignment: 0
# CASE1-NEXT:      RelocationOffset: 0x0
# CASE1-NEXT:      RelocationCount: 0
# CASE1-NEXT:      Type: Regular (0x0)
# CASE1-NEXT:      Attributes [ (0x0)
# CASE1-NEXT:      ]
# CASE1-NEXT:      Reserved1: 0x0
# CASE1-NEXT:      Reserved2: 0x0
# CASE1-NEXT:      Reserved3: 0x0
# CASE1-NEXT:      SectionData (
# CASE1-NEXT:        0000: 42415261 62636465 6667               |BARabcdefg|
# CASE1-NEXT:      )
# CASE1-NEXT:    }
# CASE1-NEXT:  ]

# CASE3:        Sections [
# CASE3-NEXT:    Section {
# CASE3-NEXT:      Index: 0
# CASE3-NEXT:      Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
# CASE3-NEXT:      Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
# CASE3-NEXT:      Address: 0x0
# CASE3-NEXT:      Size: 0x4
# CASE3-NEXT:      Offset: 488
# CASE3-NEXT:      Alignment: 0
# CASE3-NEXT:      RelocationOffset: 0x0
# CASE3-NEXT:      RelocationCount: 0
# CASE3-NEXT:      Type: Regular (0x0)
# CASE3-NEXT:      Attributes [ (0x800004)
# CASE3-NEXT:        PureInstructions (0x800000)
# CASE3-NEXT:        SomeInstructions (0x4)
# CASE3-NEXT:      ]
# CASE3-NEXT:      Reserved1: 0x0
# CASE3-NEXT:      Reserved2: 0x0
# CASE3-NEXT:      Reserved3: 0x0
# CASE3-NEXT:      SectionData (
# CASE3-NEXT:        0000: AABBCCDD                             |....|
# CASE3-NEXT:      )
# CASE3-NEXT:    }
# CASE3-NEXT:    Section {
# CASE3-NEXT:      Index: 1
# CASE3-NEXT:      Name: __foo (5F 5F 66 6F 6F 00 00 00 00 00 00 00 00 00 00 00)
# CASE3-NEXT:      Segment: __FOO (5F 5F 46 4F 4F 00 00 00 00 00 00 00 00 00 00 00)
# CASE3-NEXT:      Address: 0xB8
# CASE3-NEXT:      Size: 0xA
# CASE3-NEXT:      Offset: 492
# CASE3-NEXT:      Alignment: 0
# CASE3-NEXT:      RelocationOffset: 0x0
# CASE3-NEXT:      RelocationCount: 0
# CASE3-NEXT:      Type: Regular (0x0)
# CASE3-NEXT:      Attributes [ (0x0)
# CASE3-NEXT:      ]
# CASE3-NEXT:      Reserved1: 0x0
# CASE3-NEXT:      Reserved2: 0x0
# CASE3-NEXT:      Reserved3: 0x0
# CASE3-NEXT:      SectionData (
# CASE3-NEXT:        0000: 464F4F61 62636465 6667               |FOOabcdefg|
# CASE3-NEXT:      )
# CASE3-NEXT:    }
# CASE3-NEXT:    Section {
# CASE3-NEXT:      Index: 2
# CASE3-NEXT:      Name: __bar (5F 5F 62 61 72 00 00 00 00 00 00 00 00 00 00 00)
# CASE3-NEXT:      Segment: __BAR (5F 5F 42 41 52 00 00 00 00 00 00 00 00 00 00 00)
# CASE3-NEXT:      Address: 0x40B8
# CASE3-NEXT:      Size: 0xA
# CASE3-NEXT:      Offset: 502
# CASE3-NEXT:      Alignment: 0
# CASE3-NEXT:      RelocationOffset: 0x0
# CASE3-NEXT:      RelocationCount: 0
# CASE3-NEXT:      Type: Regular (0x0)
# CASE3-NEXT:      Attributes [ (0x0)
# CASE3-NEXT:      ]
# CASE3-NEXT:      Reserved1: 0x0
# CASE3-NEXT:      Reserved2: 0x0
# CASE3-NEXT:      Reserved3: 0x0
# CASE3-NEXT:      SectionData (
# CASE3-NEXT:        0000: 42415261 62636465 6667               |BARabcdefg|
# CASE3-NEXT:      )
# CASE3-NEXT:    }
# CASE3-NEXT:  ]