| // REQUIRES: x86 |
| // 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 --hash-style=sysv -shared %t2.o -o %t2.so |
| // RUN: llvm-readobj -s %t2.so | FileCheck --check-prefix=SO %s |
| // RUN: ld.lld --hash-style=sysv -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 --hash-style=sysv %t.o %t2.so %t2.so -o %t2 |
| // RUN: llvm-readobj -dyn-symbols %t2 | FileCheck --check-prefix=DONT_EXPORT %s |
| |
| // 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: Section { |
| // CHECK-NEXT: 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: 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 |