## 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/' - '' - '' - '' - '' - '' - '' - '' ...