| # REQUIRES: x86 |
| # RUN: rm -rf %t && split-file %s %t |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test2.s -o %t/test2.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/libfoo.s -o %t/libfoo.o |
| # RUN: %lld -dylib %t/libfoo.o -o %t/libfoo.dylib |
| # RUN: %lld -lSystem %t/test.o %t/test2.o %t/libfoo.dylib -o %t/test |
| |
| # RUN: llvm-readobj --syms --macho-dysymtab %t/test | FileCheck %s |
| # CHECK: Symbols [ |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: _local |
| # CHECK-NEXT: Type: Section (0xE) |
| # CHECK-NEXT: Section: __data |
| # CHECK-NEXT: RefType: UndefinedNonLazy (0x0) |
| # CHECK-NEXT: Flags [ (0x0) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Value: 0x1{{[0-9a-f]*}} |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: __dyld_private |
| # CHECK-NEXT: Type: Section (0xE) |
| # CHECK-NEXT: Section: __data |
| # CHECK-NEXT: RefType: UndefinedNonLazy (0x0) |
| # CHECK-NEXT: Flags [ (0x0) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Value: 0x1{{[0-9a-f]*}} |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: _private_external |
| # CHECK-NEXT: PrivateExtern |
| # CHECK-NEXT: Type: Section (0xE) |
| # CHECK-NEXT: Section: __text (0x1) |
| # CHECK-NEXT: RefType: UndefinedNonLazy (0x0) |
| # CHECK-NEXT: Flags [ (0x0) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Value: 0x1{{[0-9a-f]*}} |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: _private_external_weak |
| # CHECK-NEXT: PrivateExtern |
| # CHECK-NEXT: Type: Section (0xE) |
| # CHECK-NEXT: Section: __text (0x1) |
| # CHECK-NEXT: RefType: UndefinedNonLazy (0x0) |
| # CHECK-NEXT: Flags [ (0x0) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Value: 0x1{{[0-9a-f]*}} |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: _main |
| # 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: 0x1{{[0-9a-f]*}} |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: _external_weak |
| # CHECK-NEXT: Extern |
| # CHECK-NEXT: Type: Section (0xE) |
| # CHECK-NEXT: Section: __text (0x1) |
| # CHECK-NEXT: RefType: UndefinedNonLazy (0x0) |
| # CHECK-NEXT: Flags [ (0x80) |
| # CHECK-NEXT: WeakDef (0x80) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Value: 0x1{{[0-9a-f]*}} |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: _external |
| # CHECK-NEXT: Extern |
| # CHECK-NEXT: Type: Section (0xE) |
| # CHECK-NEXT: Section: __data |
| # CHECK-NEXT: RefType: UndefinedNonLazy (0x0) |
| # CHECK-NEXT: Flags [ (0x0) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Value: 0x1{{[0-9a-f]*}} |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: __mh_execute_header |
| # 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: dyld_stub_binder |
| # 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: Symbol { |
| # CHECK-NEXT: Name: _dynamic |
| # CHECK-NEXT: Extern |
| # CHECK-NEXT: Type: Undef (0x0) |
| # CHECK-NEXT: Section: (0x0) |
| # CHECK-NEXT: RefType: UndefinedNonLazy (0x0) |
| # CHECK-NEXT: Flags [ (0x200) |
| # CHECK-NEXT: AltEntry (0x200) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Value: 0x0 |
| # CHECK-NEXT: } |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Dysymtab { |
| # CHECK-NEXT: ilocalsym: 0 |
| # CHECK-NEXT: nlocalsym: 4 |
| # CHECK-NEXT: iextdefsym: 4 |
| # CHECK-NEXT: nextdefsym: 4 |
| # CHECK-NEXT: iundefsym: 8 |
| # CHECK-NEXT: nundefsym: 2 |
| |
| ## Verify that the first entry in the StringTable is a space, and that |
| ## unreferenced symbols aren't emitted. |
| # RUN: obj2yaml %t/test | FileCheck %s --check-prefix=YAML |
| # YAML: StringTable: |
| # YAML-NEXT: ' ' |
| # YAML-NOT: _unreferenced |
| |
| #--- libfoo.s |
| .globl _dynamic |
| _dynamic: |
| |
| #--- test.s |
| .globl _main, _external, _private_external, _external_weak, _private_external_weak, _unreferenced |
| |
| .data |
| _external: |
| .space 1 |
| _local: |
| .space 1 |
| |
| .text |
| .weak_definition _external_weak |
| _external_weak: |
| .space 1 |
| |
| .private_extern _private_external |
| _private_external: |
| .space 1 |
| |
| .weak_definition _private_external_weak |
| .private_extern _private_external_weak |
| _private_external_weak: |
| .space 1 |
| |
| _main: |
| callq _private_external |
| callq _dynamic |
| mov $0, %rax |
| ret |
| |
| #--- test2.s |
| ## These are both already in test.s and should make it into the symbol table |
| ## just once. |
| .globl _external_weak, _private_external_weak |
| .text |
| .weak_definition _external_weak |
| _external_weak: |
| .space 1 |
| .weak_definition _private_external_weak |
| .private_extern _private_external_weak |
| _private_external_weak: |
| .space 1 |