// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o // RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o // RUN: ld.lld -shared %t2.o -o %t2.so // RUN: llvm-readobj -s %t2.so | FileCheck --check-prefix=SO %s // RUN: ld.lld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -rpath foo -rpath bar --export-dynamic %t.o %t2.so -o %t // RUN: llvm-readobj --program-headers --dynamic-table -t -s -dyn-symbols -section-data -hash-table %t | FileCheck %s // RUN: ld.lld %t.o %t2.so %t2.so -o %t2 // RUN: llvm-readobj -dyn-symbols %t2 | FileCheck --check-prefix=DONT_EXPORT %s // REQUIRES: x86 // Make sure .symtab is properly aligned. // SO: Name: .symtab // SO-NEXT: Type: SHT_SYMTAB // SO-NEXT: Flags [ // SO-NEXT: ] // SO-NEXT: Address: // SO-NEXT: Offset: 0x1038 // SO-NEXT: Size: // SO-NEXT: Link: // SO-NEXT: Info: // SO-NEXT: AddressAlignment: 4 // CHECK: Name: .interp // CHECK-NEXT: Type: SHT_PROGBITS // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: ] // CHECK-NEXT: Address: [[INTERPADDR:.*]] // CHECK-NEXT: Offset: [[INTERPOFFSET:.*]] // CHECK-NEXT: Size: [[INTERPSIZE:.*]] // CHECK-NEXT: Link: 0 // CHECK-NEXT: Info: 0 // CHECK-NEXT: AddressAlignment: 1 // CHECK-NEXT: EntrySize: 0 // CHECK-NEXT: SectionData ( // CHECK-NEXT: 0000: 2F6C6962 36342F6C 642D6C69 6E75782D |/lib64/ld-linux-| // CHECK-NEXT: 0010: 7838362D 36342E73 6F2E3200 |x86-64.so.2.| // CHECK-NEXT: ) // CHECK-NEXT: } // test that .hash is linked to .dynsym // CHECK: Index: 2 // CHECK-NEXT: Name: .dynsym // CHECK-NEXT: Type: SHT_DYNSYM // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: ] // CHECK-NEXT: Address: [[DYNSYMADDR:.*]] // CHECK-NEXT: Offset: 0x150 // CHECK-NEXT: Size: // CHECK-NEXT: Link: [[DYNSTR:.*]] // CHECK-NEXT: Info: 1 // CHECK-NEXT: AddressAlignment: 4 // CHECK-NEXT: EntrySize: 16 // CHECK-NEXT: SectionData ( // CHECK-NEXT: 0000: // CHECK-NEXT: 0010: // CHECK-NEXT: 0020: // CHECK-NEXT: 0030: // CHECK-NEXT: ) // CHECK-NEXT: } // CHECK-NEXT: Section { // CHECK-NEXT: Index: 3 // CHECK-NEXT: Name: .hash // CHECK-NEXT: Type: SHT_HASH // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: ] // CHECK-NEXT: Address: [[HASHADDR:.*]] // CHECK-NEXT: Offset: // CHECK-NEXT: Size: // CHECK-NEXT: Link: 2 // CHECK-NEXT: Info: 0 // CHECK-NEXT: AddressAlignment: 4 // CHECK-NEXT: EntrySize: 4 // CHECK: Index: [[DYNSTR]] // CHECK-NEXT: Name: .dynstr // CHECK-NEXT: Type: SHT_STRTAB // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: ] // CHECK-NEXT: Address: [[DYNSTRADDR:.*]] // CHECK-NEXT: Offset: // CHECK-NEXT: Size: // CHECK-NEXT: Link: 0 // CHECK-NEXT: Info: 0 // CHECK-NEXT: AddressAlignment: 1 // CHECK-NEXT: EntrySize: 0 // CHECK-NEXT: SectionData ( // CHECK: ) // CHECK-NEXT: } // CHECK: Name: .rel.dyn // CHECK-NEXT: Type: SHT_REL // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: ] // CHECK-NEXT: Address: [[RELADDR:.*]] // CHECK-NEXT: Offset: // CHECK-NEXT: Size: [[RELSIZE:.*]] // CHECK-NEXT: Link: // CHECK-NEXT: Info: // CHECK-NEXT: AddressAlignment: // CHECK-NEXT: EntrySize: [[RELENT:.*]] // CHECK: Name: .dynamic // CHECK-NEXT: Type: SHT_DYNAMIC // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC // CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] // CHECK-NEXT: Address: [[ADDR:.*]] // CHECK-NEXT: Offset: [[OFFSET:.*]] // CHECK-NEXT: Size: [[SIZE:.*]] // CHECK-NEXT: Link: [[DYNSTR]] // CHECK-NEXT: Info: 0 // CHECK-NEXT: AddressAlignment: [[ALIGN:.*]] // CHECK-NEXT: EntrySize: 8 // CHECK-NEXT: SectionData ( // CHECK: ) // CHECK: Name: .symtab // CHECK-NEXT: Type: SHT_SYMTAB // CHECK-NEXT: Flags [ // CHECK-NEXT: ] // CHECK-NEXT: Address: // CHECK-NEXT: Offset: // CHECK-NEXT: Size: // CHECK-NEXT: Link: // CHECK-NEXT: Info: // CHECK-NEXT: AddressAlignment: // CHECK-NEXT: EntrySize: [[SYMENT:.*]] // CHECK: Symbols [ // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: _DYNAMIC // CHECK-NEXT: Value: 0x12000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None // CHECK-NEXT: Other [ (0x2) // CHECK-NEXT: STV_HIDDEN // CHECK-NEXT: ] // CHECK-NEXT: Section: .dynamic // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: _start // CHECK-NEXT: Value: 0x11000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: None // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: .text // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: bar // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: Function // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: zed // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global (0x1) // CHECK-NEXT: Type: None (0x0) // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined (0x0) // CHECK-NEXT: } // CHECK-NEXT: ] // CHECK: DynamicSymbols [ // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: @ // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local // CHECK-NEXT: Type: None // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: _start@ // CHECK-NEXT: Value: 0x11000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: Non // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: .text // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: bar@ // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: Function // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: zed@ // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: None // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined // CHECK-NEXT: } // CHECK-NEXT: ] // DONT_EXPORT: DynamicSymbols [ // DONT_EXPORT-NEXT: Symbol { // DONT_EXPORT-NEXT: Name: @ // DONT_EXPORT-NEXT: Value: 0x0 // DONT_EXPORT-NEXT: Size: 0 // DONT_EXPORT-NEXT: Binding: Local (0x0) // DONT_EXPORT-NEXT: Type: None (0x0) // DONT_EXPORT-NEXT: Other: 0 // DONT_EXPORT-NEXT: Section: Undefined (0x0) // DONT_EXPORT-NEXT: } // DONT_EXPORT-NEXT: Symbol { // DONT_EXPORT-NEXT: Name: bar@ // DONT_EXPORT-NEXT: Value: 0x0 // DONT_EXPORT-NEXT: Size: 0 // DONT_EXPORT-NEXT: Binding: Global // DONT_EXPORT-NEXT: Type: Function // DONT_EXPORT-NEXT: Other: 0 // DONT_EXPORT-NEXT: Section: Undefined // DONT_EXPORT-NEXT: } // DONT_EXPORT-NEXT: Symbol { // DONT_EXPORT-NEXT: Name: zed@ // DONT_EXPORT-NEXT: Value: 0x0 // DONT_EXPORT-NEXT: Size: 0 // DONT_EXPORT-NEXT: Binding: Global // DONT_EXPORT-NEXT: Type: None // DONT_EXPORT-NEXT: Other: 0 // DONT_EXPORT-NEXT: Section: Undefined // DONT_EXPORT-NEXT: } // DONT_EXPORT-NEXT: ] // CHECK: DynamicSection [ // CHECK-NEXT: Tag Type Name/Value // CHECK-NEXT: 0x0000001D RUNPATH foo:bar // CHECK-NEXT: 0x00000001 NEEDED Shared library: [{{.*}}2.so] // CHECK-NEXT: 0x00000015 DEBUG 0x0 // CHECK-NEXT: 0x00000011 REL [[RELADDR]] // CHECK-NEXT: 0x00000012 RELSZ [[RELSIZE]] (bytes) // CHECK-NEXT: 0x00000013 RELENT [[RELENT]] (bytes) // CHECK-NEXT: 0x00000006 SYMTAB [[DYNSYMADDR]] // CHECK-NEXT: 0x0000000B SYMENT [[SYMENT]] (bytes) // CHECK-NEXT: 0x00000005 STRTAB [[DYNSTRADDR]] // CHECK-NEXT: 0x0000000A STRSZ // CHECK-NEXT: 0x00000004 HASH [[HASHADDR]] // CHECK-NEXT: 0x00000000 NULL 0x0 // CHECK-NEXT: ] // CHECK: ProgramHeaders [ // CHECK: Type: PT_INTERP // CHECK-NEXT: Offset: [[INTERPOFFSET]] // CHECK-NEXT: VirtualAddress: [[INTERPADDR]] // CHECK-NEXT: PhysicalAddress: [[INTERPADDR]] // CHECK-NEXT: FileSize: [[INTERPSIZE]] // CHECK-NEXT: MemSize: [[INTERPSIZE]] // CHECK-NEXT: Flags [ // CHECK-NEXT: PF_R // CHECK-NEXT: ] // CHECK-NEXT: Alignment: 1 // CHECK-NEXT: } // CHECK: Type: PT_DYNAMIC // CHECK-NEXT: Offset: [[OFFSET]] // CHECK-NEXT: VirtualAddress: [[ADDR]] // CHECK-NEXT: PhysicalAddress: [[ADDR]] // CHECK-NEXT: FileSize: [[SIZE]] // CHECK-NEXT: MemSize: [[SIZE]] // CHECK-NEXT: Flags [ // CHECK-NEXT: PF_R // CHECK-NEXT: PF_W // CHECK-NEXT: ] // CHECK-NEXT: Alignment: [[ALIGN]] // CHECK-NEXT: } // CHECK: HashTable { // CHECK-NEXT: Num Buckets: 4 // CHECK-NEXT: Num Chains: 4 // CHECK-NEXT: Buckets: [3, 0, 2, 0] // CHECK-NEXT: Chains: [0, 0, 0, 1] // CHECK-NEXT: } .global _start _start: .long bar@GOT .long zed@GOT