1// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o 2// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o 3// RUN: ld.lld -shared %t2.o -o %t2.so 4// RUN: llvm-readobj -s %t2.so | FileCheck --check-prefix=SO %s 5// RUN: ld.lld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -rpath foo -rpath bar --export-dynamic %t.o %t2.so -o %t 6// RUN: llvm-readobj --program-headers --dynamic-table -t -s -dyn-symbols -section-data -hash-table %t | FileCheck %s 7// RUN: ld.lld %t.o %t2.so %t2.so -o %t2 8// RUN: llvm-readobj -dyn-symbols %t2 | FileCheck --check-prefix=DONT_EXPORT %s 9// REQUIRES: x86 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: 0x1030 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 77// CHECK: 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// CHECK-NEXT: SectionData ( 91// CHECK: ) 92// CHECK-NEXT: } 93 94// CHECK: Name: .rel.dyn 95// CHECK-NEXT: Type: SHT_REL 96// CHECK-NEXT: Flags [ 97// CHECK-NEXT: SHF_ALLOC 98// CHECK-NEXT: ] 99// CHECK-NEXT: Address: [[RELADDR:.*]] 100// CHECK-NEXT: Offset: 101// CHECK-NEXT: Size: [[RELSIZE:.*]] 102// CHECK-NEXT: Link: 103// CHECK-NEXT: Info: 104// CHECK-NEXT: AddressAlignment: 105// CHECK-NEXT: EntrySize: [[RELENT:.*]] 106 107// CHECK: Name: .dynamic 108// CHECK-NEXT: Type: SHT_DYNAMIC 109// CHECK-NEXT: Flags [ 110// CHECK-NEXT: SHF_ALLOC 111// CHECK-NEXT: SHF_WRITE 112// CHECK-NEXT: ] 113// CHECK-NEXT: Address: [[ADDR:.*]] 114// CHECK-NEXT: Offset: [[OFFSET:.*]] 115// CHECK-NEXT: Size: [[SIZE:.*]] 116// CHECK-NEXT: Link: [[DYNSTR]] 117// CHECK-NEXT: Info: 0 118// CHECK-NEXT: AddressAlignment: [[ALIGN:.*]] 119// CHECK-NEXT: EntrySize: 8 120// CHECK-NEXT: SectionData ( 121// CHECK: ) 122// CHECK-NEXT: } 123 124// CHECK: Name: .symtab 125// CHECK-NEXT: Type: SHT_SYMTAB 126// CHECK-NEXT: Flags [ 127// CHECK-NEXT: ] 128// CHECK-NEXT: Address: 129// CHECK-NEXT: Offset: 130// CHECK-NEXT: Size: 131// CHECK-NEXT: Link: 132// CHECK-NEXT: Info: 133// CHECK-NEXT: AddressAlignment: 134// CHECK-NEXT: EntrySize: [[SYMENT:.*]] 135 136// CHECK: Symbols [ 137// CHECK-NEXT: Symbol { 138// CHECK-NEXT: Name: 139// CHECK-NEXT: Value: 0x0 140// CHECK-NEXT: Size: 0 141// CHECK-NEXT: Binding: Local 142// CHECK-NEXT: Type: None 143// CHECK-NEXT: Other: 0 144// CHECK-NEXT: Section: Undefined 145// CHECK-NEXT: } 146// CHECK-NEXT: Symbol { 147// CHECK-NEXT: Name: _start 148// CHECK-NEXT: Value: 0x11000 149// CHECK-NEXT: Size: 0 150// CHECK-NEXT: Binding: Global 151// CHECK-NEXT: Type: None 152// CHECK-NEXT: Other: 0 153// CHECK-NEXT: Section: .text 154// CHECK-NEXT: } 155// CHECK-NEXT: Symbol { 156// CHECK-NEXT: Name: bar 157// CHECK-NEXT: Value: 0x0 158// CHECK-NEXT: Size: 0 159// CHECK-NEXT: Binding: Global 160// CHECK-NEXT: Type: Function 161// CHECK-NEXT: Other: 0 162// CHECK-NEXT: Section: Undefined 163// CHECK-NEXT: } 164// CHECK-NEXT: Symbol { 165// CHECK-NEXT: Name: zed 166// CHECK-NEXT: Value: 0x0 167// CHECK-NEXT: Size: 0 168// CHECK-NEXT: Binding: Global (0x1) 169// CHECK-NEXT: Type: None (0x0) 170// CHECK-NEXT: Other: 0 171// CHECK-NEXT: Section: Undefined (0x0) 172// CHECK-NEXT: } 173// CHECK-NEXT: ] 174 175// CHECK: DynamicSymbols [ 176// CHECK-NEXT: Symbol { 177// CHECK-NEXT: Name: @ (0) 178// CHECK-NEXT: Value: 0x0 179// CHECK-NEXT: Size: 0 180// CHECK-NEXT: Binding: Local 181// CHECK-NEXT: Type: None 182// CHECK-NEXT: Other: 0 183// CHECK-NEXT: Section: Undefined 184// CHECK-NEXT: } 185// CHECK-NEXT: Symbol { 186// CHECK-NEXT: Name: _start@ 187// CHECK-NEXT: Value: 0x11000 188// CHECK-NEXT: Size: 0 189// CHECK-NEXT: Binding: Global 190// CHECK-NEXT: Type: Non 191// CHECK-NEXT: Other: 0 192// CHECK-NEXT: Section: .text 193// CHECK-NEXT: } 194// CHECK-NEXT: Symbol { 195// CHECK-NEXT: Name: bar@ 196// CHECK-NEXT: Value: 0x0 197// CHECK-NEXT: Size: 0 198// CHECK-NEXT: Binding: Global 199// CHECK-NEXT: Type: Function 200// CHECK-NEXT: Other: 0 201// CHECK-NEXT: Section: Undefined 202// CHECK-NEXT: } 203// CHECK-NEXT: Symbol { 204// CHECK-NEXT: Name: zed@ 205// CHECK-NEXT: Value: 0x0 206// CHECK-NEXT: Size: 0 207// CHECK-NEXT: Binding: Global 208// CHECK-NEXT: Type: None 209// CHECK-NEXT: Other: 0 210// CHECK-NEXT: Section: Undefined 211// CHECK-NEXT: } 212// CHECK-NEXT: ] 213 214// DONT_EXPORT: DynamicSymbols [ 215// DONT_EXPORT-NEXT: Symbol { 216// DONT_EXPORT-NEXT: Name: @ (0) 217// DONT_EXPORT-NEXT: Value: 0x0 218// DONT_EXPORT-NEXT: Size: 0 219// DONT_EXPORT-NEXT: Binding: Local (0x0) 220// DONT_EXPORT-NEXT: Type: None (0x0) 221// DONT_EXPORT-NEXT: Other: 0 222// DONT_EXPORT-NEXT: Section: Undefined (0x0) 223// DONT_EXPORT-NEXT: } 224// DONT_EXPORT-NEXT: Symbol { 225// DONT_EXPORT-NEXT: Name: bar@ 226// DONT_EXPORT-NEXT: Value: 0x0 227// DONT_EXPORT-NEXT: Size: 0 228// DONT_EXPORT-NEXT: Binding: Global 229// DONT_EXPORT-NEXT: Type: Function 230// DONT_EXPORT-NEXT: Other: 0 231// DONT_EXPORT-NEXT: Section: Undefined 232// DONT_EXPORT-NEXT: } 233// DONT_EXPORT-NEXT: Symbol { 234// DONT_EXPORT-NEXT: Name: zed@ 235// DONT_EXPORT-NEXT: Value: 0x0 236// DONT_EXPORT-NEXT: Size: 0 237// DONT_EXPORT-NEXT: Binding: Global 238// DONT_EXPORT-NEXT: Type: None 239// DONT_EXPORT-NEXT: Other: 0 240// DONT_EXPORT-NEXT: Section: Undefined 241// DONT_EXPORT-NEXT: } 242// DONT_EXPORT-NEXT: ] 243 244// CHECK: DynamicSection [ 245// CHECK-NEXT: Tag Type Name/Value 246// CHECK-NEXT: 0x0000001D RUNPATH foo:bar 247// CHECK-NEXT: 0x00000001 NEEDED SharedLibrary ({{.*}}2.so) 248// CHECK-NEXT: 0x00000011 REL [[RELADDR]] 249// CHECK-NEXT: 0x00000012 RELSZ [[RELSIZE]] (bytes) 250// CHECK-NEXT: 0x00000013 RELENT [[RELENT]] (bytes) 251// CHECK-NEXT: 0x00000006 SYMTAB [[DYNSYMADDR]] 252// CHECK-NEXT: 0x0000000B SYMENT [[SYMENT]] (bytes) 253// CHECK-NEXT: 0x00000005 STRTAB [[DYNSTRADDR]] 254// CHECK-NEXT: 0x0000000A STRSZ 255// CHECK-NEXT: 0x00000004 HASH [[HASHADDR]] 256// CHECK-NEXT: 0x00000015 DEBUG 0x0 257// CHECK-NEXT: 0x00000000 NULL 0x0 258// CHECK-NEXT: ] 259 260// CHECK: ProgramHeaders [ 261// CHECK: Type: PT_INTERP 262// CHECK-NEXT: Offset: [[INTERPOFFSET]] 263// CHECK-NEXT: VirtualAddress: [[INTERPADDR]] 264// CHECK-NEXT: PhysicalAddress: [[INTERPADDR]] 265// CHECK-NEXT: FileSize: [[INTERPSIZE]] 266// CHECK-NEXT: MemSize: [[INTERPSIZE]] 267// CHECK-NEXT: Flags [ 268// CHECK-NEXT: PF_R 269// CHECK-NEXT: ] 270// CHECK-NEXT: Alignment: 1 271// CHECK-NEXT: } 272// CHECK: Type: PT_DYNAMIC 273// CHECK-NEXT: Offset: [[OFFSET]] 274// CHECK-NEXT: VirtualAddress: [[ADDR]] 275// CHECK-NEXT: PhysicalAddress: [[ADDR]] 276// CHECK-NEXT: FileSize: [[SIZE]] 277// CHECK-NEXT: MemSize: [[SIZE]] 278// CHECK-NEXT: Flags [ 279// CHECK-NEXT: PF_R 280// CHECK-NEXT: PF_W 281// CHECK-NEXT: ] 282// CHECK-NEXT: Alignment: [[ALIGN]] 283// CHECK-NEXT: } 284 285// CHECK: HashTable { 286// CHECK-NEXT: Num Buckets: 4 287// CHECK-NEXT: Num Chains: 4 288// CHECK-NEXT: Buckets: [3, 0, 2, 0] 289// CHECK-NEXT: Chains: [0, 0, 0, 1] 290// CHECK-NEXT: } 291 292.global _start 293_start: 294.long bar@GOT 295.long zed@GOT 296