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