1// REQUIRES: x86 2// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o 3// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o 4// RUN: ld.lld --hash-style=sysv -shared %t2.o -o %t2.so 5// RUN: llvm-readobj -s %t2.so | FileCheck --check-prefix=SO %s 6// 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 7// RUN: llvm-readobj --program-headers --dynamic-table -t -s -dyn-symbols -section-data -hash-table %t | FileCheck %s 8// RUN: ld.lld --hash-style=sysv %t.o %t2.so %t2.so -o %t2 9// RUN: llvm-readobj -dyn-symbols %t2 | FileCheck --check-prefix=DONT_EXPORT %s 10 11// Make sure .symtab is properly aligned. 12// SO: Name: .symtab 13// SO-NEXT: Type: SHT_SYMTAB 14// SO-NEXT: Flags [ 15// SO-NEXT: ] 16// SO-NEXT: Address: 17// SO-NEXT: Offset: 0x1038 18// SO-NEXT: Size: 19// SO-NEXT: Link: 20// SO-NEXT: Info: 21// SO-NEXT: AddressAlignment: 4 22 23// CHECK: Name: .interp 24// CHECK-NEXT: Type: SHT_PROGBITS 25// CHECK-NEXT: Flags [ 26// CHECK-NEXT: SHF_ALLOC 27// CHECK-NEXT: ] 28// CHECK-NEXT: Address: [[INTERPADDR:.*]] 29// CHECK-NEXT: Offset: [[INTERPOFFSET:.*]] 30// CHECK-NEXT: Size: [[INTERPSIZE:.*]] 31// CHECK-NEXT: Link: 0 32// CHECK-NEXT: Info: 0 33// CHECK-NEXT: AddressAlignment: 1 34// CHECK-NEXT: EntrySize: 0 35// CHECK-NEXT: SectionData ( 36// CHECK-NEXT: 0000: 2F6C6962 36342F6C 642D6C69 6E75782D |/lib64/ld-linux-| 37// CHECK-NEXT: 0010: 7838362D 36342E73 6F2E3200 |x86-64.so.2.| 38// CHECK-NEXT: ) 39// CHECK-NEXT: } 40 41// test that .hash is linked to .dynsym 42// CHECK: Index: 2 43// CHECK-NEXT: Name: .dynsym 44// CHECK-NEXT: Type: SHT_DYNSYM 45// CHECK-NEXT: Flags [ 46// CHECK-NEXT: SHF_ALLOC 47// CHECK-NEXT: ] 48// CHECK-NEXT: Address: [[DYNSYMADDR:.*]] 49// CHECK-NEXT: Offset: 0x150 50// CHECK-NEXT: Size: 51// CHECK-NEXT: Link: [[DYNSTR:.*]] 52// CHECK-NEXT: Info: 1 53// CHECK-NEXT: AddressAlignment: 4 54// CHECK-NEXT: EntrySize: 16 55// CHECK-NEXT: SectionData ( 56// CHECK-NEXT: 0000: 57// CHECK-NEXT: 0010: 58// CHECK-NEXT: 0020: 59// CHECK-NEXT: 0030: 60// CHECK-NEXT: ) 61// CHECK-NEXT: } 62// CHECK-NEXT: Section { 63// CHECK-NEXT: Index: 3 64// CHECK-NEXT: Name: .hash 65// CHECK-NEXT: Type: SHT_HASH 66// CHECK-NEXT: Flags [ 67// CHECK-NEXT: SHF_ALLOC 68// CHECK-NEXT: ] 69// CHECK-NEXT: Address: [[HASHADDR:.*]] 70// CHECK-NEXT: Offset: 71// CHECK-NEXT: Size: 72// CHECK-NEXT: Link: 2 73// CHECK-NEXT: Info: 0 74// CHECK-NEXT: AddressAlignment: 4 75// CHECK-NEXT: EntrySize: 4 76// CHECK: Section { 77// CHECK-NEXT: Index: [[DYNSTR]] 78// CHECK-NEXT: Name: .dynstr 79// CHECK-NEXT: Type: SHT_STRTAB 80// CHECK-NEXT: Flags [ 81// CHECK-NEXT: SHF_ALLOC 82// CHECK-NEXT: ] 83// CHECK-NEXT: Address: [[DYNSTRADDR:.*]] 84// CHECK-NEXT: Offset: 85// CHECK-NEXT: Size: 86// CHECK-NEXT: Link: 0 87// CHECK-NEXT: Info: 0 88// CHECK-NEXT: AddressAlignment: 1 89// CHECK-NEXT: EntrySize: 0 90 91// CHECK: Name: .rel.dyn 92// CHECK-NEXT: Type: SHT_REL 93// CHECK-NEXT: Flags [ 94// CHECK-NEXT: SHF_ALLOC 95// CHECK-NEXT: ] 96// CHECK-NEXT: Address: [[RELADDR:.*]] 97// CHECK-NEXT: Offset: 98// CHECK-NEXT: Size: [[RELSIZE:.*]] 99// CHECK-NEXT: Link: 100// CHECK-NEXT: Info: 101// CHECK-NEXT: AddressAlignment: 102// CHECK-NEXT: EntrySize: [[RELENT:.*]] 103 104// CHECK: Name: .dynamic 105// CHECK-NEXT: Type: SHT_DYNAMIC 106// CHECK-NEXT: Flags [ 107// CHECK-NEXT: SHF_ALLOC 108// CHECK-NEXT: SHF_WRITE 109// CHECK-NEXT: ] 110// CHECK-NEXT: Address: [[ADDR:.*]] 111// CHECK-NEXT: Offset: [[OFFSET:.*]] 112// CHECK-NEXT: Size: [[SIZE:.*]] 113// CHECK-NEXT: Link: [[DYNSTR]] 114// CHECK-NEXT: Info: 0 115// CHECK-NEXT: AddressAlignment: [[ALIGN:.*]] 116// CHECK-NEXT: EntrySize: 8 117// CHECK-NEXT: SectionData ( 118// CHECK: ) 119 120// CHECK: Name: .symtab 121// CHECK-NEXT: Type: SHT_SYMTAB 122// CHECK-NEXT: Flags [ 123// CHECK-NEXT: ] 124// CHECK-NEXT: Address: 125// CHECK-NEXT: Offset: 126// CHECK-NEXT: Size: 127// CHECK-NEXT: Link: 128// CHECK-NEXT: Info: 129// CHECK-NEXT: AddressAlignment: 130// CHECK-NEXT: EntrySize: [[SYMENT:.*]] 131 132// CHECK: Symbols [ 133// CHECK-NEXT: Symbol { 134// CHECK-NEXT: Name: 135// CHECK-NEXT: Value: 0x0 136// CHECK-NEXT: Size: 0 137// CHECK-NEXT: Binding: Local 138// CHECK-NEXT: Type: None 139// CHECK-NEXT: Other: 0 140// CHECK-NEXT: Section: Undefined 141// CHECK-NEXT: } 142// CHECK-NEXT: Symbol { 143// CHECK-NEXT: Name: _DYNAMIC 144// CHECK-NEXT: Value: 0x402000 145// CHECK-NEXT: Size: 0 146// CHECK-NEXT: Binding: Local 147// CHECK-NEXT: Type: None 148// CHECK-NEXT: Other [ (0x2) 149// CHECK-NEXT: STV_HIDDEN 150// CHECK-NEXT: ] 151// CHECK-NEXT: Section: .dynamic 152// CHECK-NEXT: } 153// CHECK-NEXT: Symbol { 154// CHECK-NEXT: Name: _start 155// CHECK-NEXT: Value: 0x401000 156// CHECK-NEXT: Size: 0 157// CHECK-NEXT: Binding: Global 158// CHECK-NEXT: Type: None 159// CHECK-NEXT: Other: 0 160// CHECK-NEXT: Section: .text 161// CHECK-NEXT: } 162// CHECK-NEXT: Symbol { 163// CHECK-NEXT: Name: bar 164// CHECK-NEXT: Value: 0x0 165// CHECK-NEXT: Size: 0 166// CHECK-NEXT: Binding: Global 167// CHECK-NEXT: Type: Function 168// CHECK-NEXT: Other: 0 169// CHECK-NEXT: Section: Undefined 170// CHECK-NEXT: } 171// CHECK-NEXT: Symbol { 172// CHECK-NEXT: Name: zed 173// CHECK-NEXT: Value: 0x0 174// CHECK-NEXT: Size: 0 175// CHECK-NEXT: Binding: Global (0x1) 176// CHECK-NEXT: Type: None (0x0) 177// CHECK-NEXT: Other: 0 178// CHECK-NEXT: Section: Undefined (0x0) 179// CHECK-NEXT: } 180// CHECK-NEXT: ] 181 182// CHECK: DynamicSymbols [ 183// CHECK-NEXT: Symbol { 184// CHECK-NEXT: Name: @ 185// CHECK-NEXT: Value: 0x0 186// CHECK-NEXT: Size: 0 187// CHECK-NEXT: Binding: Local 188// CHECK-NEXT: Type: None 189// CHECK-NEXT: Other: 0 190// CHECK-NEXT: Section: Undefined 191// CHECK-NEXT: } 192// CHECK-NEXT: Symbol { 193// CHECK-NEXT: Name: _start@ 194// CHECK-NEXT: Value: 0x401000 195// CHECK-NEXT: Size: 0 196// CHECK-NEXT: Binding: Global 197// CHECK-NEXT: Type: Non 198// CHECK-NEXT: Other: 0 199// CHECK-NEXT: Section: .text 200// CHECK-NEXT: } 201// CHECK-NEXT: Symbol { 202// CHECK-NEXT: Name: bar@ 203// CHECK-NEXT: Value: 0x0 204// CHECK-NEXT: Size: 0 205// CHECK-NEXT: Binding: Global 206// CHECK-NEXT: Type: Function 207// CHECK-NEXT: Other: 0 208// CHECK-NEXT: Section: Undefined 209// CHECK-NEXT: } 210// CHECK-NEXT: Symbol { 211// CHECK-NEXT: Name: zed@ 212// CHECK-NEXT: Value: 0x0 213// CHECK-NEXT: Size: 0 214// CHECK-NEXT: Binding: Global 215// CHECK-NEXT: Type: None 216// CHECK-NEXT: Other: 0 217// CHECK-NEXT: Section: Undefined 218// CHECK-NEXT: } 219// CHECK-NEXT: ] 220 221// DONT_EXPORT: DynamicSymbols [ 222// DONT_EXPORT-NEXT: Symbol { 223// DONT_EXPORT-NEXT: Name: @ 224// DONT_EXPORT-NEXT: Value: 0x0 225// DONT_EXPORT-NEXT: Size: 0 226// DONT_EXPORT-NEXT: Binding: Local (0x0) 227// DONT_EXPORT-NEXT: Type: None (0x0) 228// DONT_EXPORT-NEXT: Other: 0 229// DONT_EXPORT-NEXT: Section: Undefined (0x0) 230// DONT_EXPORT-NEXT: } 231// DONT_EXPORT-NEXT: Symbol { 232// DONT_EXPORT-NEXT: Name: bar@ 233// DONT_EXPORT-NEXT: Value: 0x0 234// DONT_EXPORT-NEXT: Size: 0 235// DONT_EXPORT-NEXT: Binding: Global 236// DONT_EXPORT-NEXT: Type: Function 237// DONT_EXPORT-NEXT: Other: 0 238// DONT_EXPORT-NEXT: Section: Undefined 239// DONT_EXPORT-NEXT: } 240// DONT_EXPORT-NEXT: Symbol { 241// DONT_EXPORT-NEXT: Name: zed@ 242// DONT_EXPORT-NEXT: Value: 0x0 243// DONT_EXPORT-NEXT: Size: 0 244// DONT_EXPORT-NEXT: Binding: Global 245// DONT_EXPORT-NEXT: Type: None 246// DONT_EXPORT-NEXT: Other: 0 247// DONT_EXPORT-NEXT: Section: Undefined 248// DONT_EXPORT-NEXT: } 249// DONT_EXPORT-NEXT: ] 250 251// CHECK: DynamicSection [ 252// CHECK-NEXT: Tag Type Name/Value 253// CHECK-NEXT: 0x0000001D RUNPATH foo:bar 254// CHECK-NEXT: 0x00000001 NEEDED Shared library: [{{.*}}2.so] 255// CHECK-NEXT: 0x00000015 DEBUG 0x0 256// CHECK-NEXT: 0x00000011 REL [[RELADDR]] 257// CHECK-NEXT: 0x00000012 RELSZ [[RELSIZE]] (bytes) 258// CHECK-NEXT: 0x00000013 RELENT [[RELENT]] (bytes) 259// CHECK-NEXT: 0x00000006 SYMTAB [[DYNSYMADDR]] 260// CHECK-NEXT: 0x0000000B SYMENT [[SYMENT]] (bytes) 261// CHECK-NEXT: 0x00000005 STRTAB [[DYNSTRADDR]] 262// CHECK-NEXT: 0x0000000A STRSZ 263// CHECK-NEXT: 0x00000004 HASH [[HASHADDR]] 264// CHECK-NEXT: 0x00000000 NULL 0x0 265// CHECK-NEXT: ] 266 267// CHECK: ProgramHeaders [ 268// CHECK: Type: PT_INTERP 269// CHECK-NEXT: Offset: [[INTERPOFFSET]] 270// CHECK-NEXT: VirtualAddress: [[INTERPADDR]] 271// CHECK-NEXT: PhysicalAddress: [[INTERPADDR]] 272// CHECK-NEXT: FileSize: [[INTERPSIZE]] 273// CHECK-NEXT: MemSize: [[INTERPSIZE]] 274// CHECK-NEXT: Flags [ 275// CHECK-NEXT: PF_R 276// CHECK-NEXT: ] 277// CHECK-NEXT: Alignment: 1 278// CHECK-NEXT: } 279// CHECK: Type: PT_DYNAMIC 280// CHECK-NEXT: Offset: [[OFFSET]] 281// CHECK-NEXT: VirtualAddress: [[ADDR]] 282// CHECK-NEXT: PhysicalAddress: [[ADDR]] 283// CHECK-NEXT: FileSize: [[SIZE]] 284// CHECK-NEXT: MemSize: [[SIZE]] 285// CHECK-NEXT: Flags [ 286// CHECK-NEXT: PF_R 287// CHECK-NEXT: PF_W 288// CHECK-NEXT: ] 289// CHECK-NEXT: Alignment: [[ALIGN]] 290// CHECK-NEXT: } 291 292// CHECK: HashTable { 293// CHECK-NEXT: Num Buckets: 4 294// CHECK-NEXT: Num Chains: 4 295// CHECK-NEXT: Buckets: [3, 0, 2, 0] 296// CHECK-NEXT: Chains: [0, 0, 0, 1] 297// CHECK-NEXT: } 298 299.global _start 300_start: 301.long bar@GOT 302.long zed@GOT 303