llvm/llvm/test/tools/llvm-objcopy/MachO/symbol-table.test

## This test is based on a trimmed down version of the binary built as follows:
## a.c:
## __attribute__((used)) static int PrivateSymbol;
## __attribute__((visibility("hidden"))) int PrivateExternalSymbol;
## __attribute__((used)) int CommonSymbol;
## extern int UndefinedExternalSymbol;
## // Defined external symbol
## int main() {
##   return PrivateSymbol + PrivateExternalSymbol + CommonSymbol +
##          UndefinedExternalSymbol;
## }
## build command:
##   clang -g -fno-exceptions -fno-unwind-tables -undefined dynamic_lookup \
##   a.c -o a.exe
## All the load commands except the symbol table and its transitive dependencies
## have been removed.

# RUN: yaml2obj %s -o %t
# RUN: llvm-objcopy %t %t.copy
# RUN: cmp %t %t.copy

## Verify that the binary is valid and check its symbol table.
# RUN: llvm-readobj --symbols %t.copy | FileCheck %s

# CHECK: Symbols [
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _PrivateSymbol (170)
# CHECK-NEXT:     Type: Section (0xE)
# CHECK-NEXT:     Section: __bss (0x4)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x100001008
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _PrivateExternalSymbol (122)
# CHECK-NEXT:     PrivateExtern
# CHECK-NEXT:     Type: Section (0xE)
# CHECK-NEXT:     Section: __common (0x5)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x100001010
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: /Users/aaaaaaaa/ (192)
# CHECK-NEXT:     Type: SymDebugTable (0x64)
# CHECK-NEXT:     Section:  (0x0)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x0
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: main.c (185)
# CHECK-NEXT:     Type: SymDebugTable (0x64)
# CHECK-NEXT:     Section:  (0x0)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x0
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: /var/folders/1d/zyfdpp7j2995h5hqspjy28bc0000gn/T/main-c5ac21.o (39)
# CHECK-NEXT:     Type: SymDebugTable (0x66)
# CHECK-NEXT:     Section:  (0x3)
# CHECK-NEXT:     RefType: ReferenceFlagUndefinedLazy (0x1)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x5EA74C81
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name:  (208)
# CHECK-NEXT:     Type: SymDebugTable (0x2E)
# CHECK-NEXT:     Section:  (0x1)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x100000F80
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _main (102)
# CHECK-NEXT:     Type: SymDebugTable (0x24)
# CHECK-NEXT:     Section:  (0x1)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x100000F80
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name:  (208)
# CHECK-NEXT:     Type: SymDebugTable (0x24)
# CHECK-NEXT:     Section:  (0x0)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x2D
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name:  (208)
# CHECK-NEXT:     Type: SymDebugTable (0x4E)
# CHECK-NEXT:     Section:  (0x1)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x2D
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _PrivateSymbol (170)
# CHECK-NEXT:     Type: SymDebugTable (0x26)
# CHECK-NEXT:     Section:  (0x4)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x100001008
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _CommonSymbol (108)
# CHECK-NEXT:     Type: SymDebugTable (0x20)
# CHECK-NEXT:     Section:  (0x0)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x0
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _PrivateExternalSymbol (122)
# CHECK-NEXT:     Type: SymDebugTable (0x20)
# CHECK-NEXT:     Section:  (0x0)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x0
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name:  (208)
# CHECK-NEXT:     Type: SymDebugTable (0x64)
# CHECK-NEXT:     Section:  (0x1)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x0
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _CommonSymbol (108)
# CHECK-NEXT:     Extern
# CHECK-NEXT:     Type: Section (0xE)
# CHECK-NEXT:     Section: __common (0x5)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x10000100C
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: __mh_execute_header (19)
# CHECK-NEXT:     Extern
# CHECK-NEXT:     Type: Section (0xE)
# CHECK-NEXT:     Section: __text (0x1)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x10)
# CHECK-NEXT:       ReferencedDynamically (0x10)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x100000000
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _main (102)
# CHECK-NEXT:     Extern
# CHECK-NEXT:     Type: Section (0xE)
# CHECK-NEXT:     Section: __text (0x1)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x0)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x100000F80
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: _UndefinedExternalSymbol (145)
# CHECK-NEXT:     Extern
# CHECK-NEXT:     Type: Undef (0x0)
# CHECK-NEXT:     Section:  (0x0)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0xFE00)
# CHECK-NEXT:       AltEntry (0x200)
# CHECK-NEXT:       ColdFunc (0x400)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x0
# CHECK-NEXT:   }
# CHECK-NEXT:   Symbol {
# CHECK-NEXT:     Name: dyld_stub_binder (2)
# CHECK-NEXT:     Extern
# CHECK-NEXT:     Type: Undef (0x0)
# CHECK-NEXT:     Section:  (0x0)
# CHECK-NEXT:     RefType: UndefinedNonLazy (0x0)
# CHECK-NEXT:     Flags [ (0x100)
# CHECK-NEXT:       SymbolResolver (0x100)
# CHECK-NEXT:     ]
# CHECK-NEXT:     Value: 0x0
# CHECK-NEXT:   }
# CHECK-NEXT: ]

--- !mach-o
FileHeader:
  magic:           0xFEEDFACF
  cputype:         0x01000007
  cpusubtype:      0x80000003
  filetype:        0x00000002
  ncmds:           5
  sizeofcmds:      720
  flags:           0x00200085
  reserved:        0x00000000
LoadCommands:
  - cmd:             LC_SEGMENT_64
    cmdsize:         232
    segname:         __TEXT
    vmaddr:          4294967296
    vmsize:          4096
    fileoff:         0
    filesize:        4096
    maxprot:         5
    initprot:        5
    nsects:          2
    flags:           0
    Sections:
      - sectname:        __text
        segname:         __TEXT
        addr:            0x0000000100000F80
        size:            45
        offset:          0x00000F80
        align:           4
        reloff:          0x00000000
        nreloc:          0
        flags:           0x80000400
        reserved1:       0x00000000
        reserved2:       0x00000000
        reserved3:       0x00000000
        content:         554889E5488B0575000000488D0D7A000000C745FC000000008B156900000003156B0000000311031089D05DC3
      - sectname:        __unwind_info
        segname:         __TEXT
        addr:            0x0000000100000FB0
        size:            72
        offset:          0x00000FB0
        align:           2
        reloff:          0x00000000
        nreloc:          0
        flags:           0x00000000
        reserved1:       0x00000000
        reserved2:       0x00000000
        reserved3:       0x00000000
        content:         010000001C000000000000001C000000000000001C00000002000000800F00003400000034000000AE0F00000000000034000000030000000C000100100001000000000000000000
  - cmd:             LC_SEGMENT_64
    cmdsize:         312
    segname:         __DATA
    vmaddr:          4294971392
    vmsize:          4096
    fileoff:         4096
    filesize:        4096
    maxprot:         3
    initprot:        3
    nsects:          3
    flags:           0
    Sections:
      - sectname:        __got
        segname:         __DATA
        addr:            0x0000000100001000
        size:            8
        offset:          0x00001000
        align:           3
        reloff:          0x00000000
        nreloc:          0
        flags:           0x00000006
        reserved1:       0x00000000
        reserved2:       0x00000000
        reserved3:       0x00000000
        content:         '0000000000000000'
      - sectname:        __bss
        segname:         __DATA
        addr:            0x0000000100001008
        size:            4
        offset:          0x00000000
        align:           2
        reloff:          0x00000000
        nreloc:          0
        flags:           0x00000001
        reserved1:       0x00000000
        reserved2:       0x00000000
        reserved3:       0x00000000
      - sectname:        __common
        segname:         __DATA
        addr:            0x000000010000100C
        size:            8
        offset:          0x00000000
        align:           2
        reloff:          0x00000000
        nreloc:          0
        flags:           0x00000001
        reserved1:       0x00000000
        reserved2:       0x00000000
        reserved3:       0x00000000
  - cmd:             LC_SEGMENT_64
    cmdsize:         72
    segname:         __LINKEDIT
    vmaddr:          4294975488
    vmsize:          4096
    fileoff:         8192
    filesize:        508
    maxprot:         1
    initprot:        1
    nsects:          0
    flags:           0
  - cmd:             LC_SYMTAB
    cmdsize:         24
    symoff:          8192
    nsyms:           18
    stroff:          8484
    strsize:         216
  - cmd:             LC_DYSYMTAB
    cmdsize:         80
    ilocalsym:       0
    nlocalsym:       13
    iextdefsym:      13
    nextdefsym:      3
    iundefsym:       16
    nundefsym:       2
    tocoff:          0
    ntoc:            0
    modtaboff:       0
    nmodtab:         0
    extrefsymoff:    0
    nextrefsyms:     0
    indirectsymoff:  8480
    nindirectsyms:   1
    extreloff:       0
    nextrel:         0
    locreloff:       0
    nlocrel:         0
LinkEditData:
  NameList:
    - n_strx:          170
      n_type:          0x0E
      n_sect:          4
      n_desc:          0
      n_value:         4294971400
    - n_strx:          122
      n_type:          0x1E
      n_sect:          5
      n_desc:          0
      n_value:         4294971408
    - n_strx:          192
      n_type:          0x64
      n_sect:          0
      n_desc:          0
      n_value:         0
    - n_strx:          185
      n_type:          0x64
      n_sect:          0
      n_desc:          0
      n_value:         0
    - n_strx:          39
      n_type:          0x66
      n_sect:          3
      n_desc:          1
      n_value:         1588022401
    - n_strx:          208
      n_type:          0x2E
      n_sect:          1
      n_desc:          0
      n_value:         4294971264
    - n_strx:          102
      n_type:          0x24
      n_sect:          1
      n_desc:          0
      n_value:         4294971264
    - n_strx:          208
      n_type:          0x24
      n_sect:          0
      n_desc:          0
      n_value:         45
    - n_strx:          208
      n_type:          0x4E
      n_sect:          1
      n_desc:          0
      n_value:         45
    - n_strx:          170
      n_type:          0x26
      n_sect:          4
      n_desc:          0
      n_value:         4294971400
    - n_strx:          108
      n_type:          0x20
      n_sect:          0
      n_desc:          0
      n_value:         0
    - n_strx:          122
      n_type:          0x20
      n_sect:          0
      n_desc:          0
      n_value:         0
    - n_strx:          208
      n_type:          0x64
      n_sect:          1
      n_desc:          0
      n_value:         0
    - n_strx:          108
      n_type:          0x0F
      n_sect:          5
      n_desc:          0
      n_value:         4294971404
    - n_strx:          19
      n_type:          0x0F
      n_sect:          1
      n_desc:          16
      n_value:         4294967296
    - n_strx:          102
      n_type:          0x0F
      n_sect:          1
      n_desc:          0
      n_value:         4294971264
    - n_strx:          145
      n_type:          0x01
      n_sect:          0
      n_desc:          65024
      n_value:         0
    - n_strx:          2
      n_type:          0x01
      n_sect:          0
      n_desc:          256
      n_value:         0
  StringTable:
    - ' '
    - dyld_stub_binder
    - __mh_execute_header
    - '/var/folders/1d/zyfdpp7j2995h5hqspjy28bc0000gn/T/main-c5ac21.o'
    - _main
    - _CommonSymbol
    - _PrivateExternalSymbol
    - _UndefinedExternalSymbol
    - _PrivateSymbol
    - main.c
    - '/Users/aaaaaaaa/'
    - ''
    - ''
    - ''
    - ''
    - ''
    - ''
    - ''
...