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: _DYNAMIC 148// CHECK-NEXT: Value: 0x12000 149// CHECK-NEXT: Size: 0 150// CHECK-NEXT: Binding: Local 151// CHECK-NEXT: Type: None 152// CHECK-NEXT: Other [ (0x2) 153// CHECK-NEXT: STV_HIDDEN 154// CHECK-NEXT: ] 155// CHECK-NEXT: Section: .dynamic 156// CHECK-NEXT: } 157// CHECK-NEXT: Symbol { 158// CHECK-NEXT: Name: _start 159// CHECK-NEXT: Value: 0x11000 160// CHECK-NEXT: Size: 0 161// CHECK-NEXT: Binding: Global 162// CHECK-NEXT: Type: None 163// CHECK-NEXT: Other: 0 164// CHECK-NEXT: Section: .text 165// CHECK-NEXT: } 166// CHECK-NEXT: Symbol { 167// CHECK-NEXT: Name: bar 168// CHECK-NEXT: Value: 0x0 169// CHECK-NEXT: Size: 0 170// CHECK-NEXT: Binding: Global 171// CHECK-NEXT: Type: Function 172// CHECK-NEXT: Other: 0 173// CHECK-NEXT: Section: Undefined 174// CHECK-NEXT: } 175// CHECK-NEXT: Symbol { 176// CHECK-NEXT: Name: zed 177// CHECK-NEXT: Value: 0x0 178// CHECK-NEXT: Size: 0 179// CHECK-NEXT: Binding: Global (0x1) 180// CHECK-NEXT: Type: None (0x0) 181// CHECK-NEXT: Other: 0 182// CHECK-NEXT: Section: Undefined (0x0) 183// CHECK-NEXT: } 184// CHECK-NEXT: ] 185 186// CHECK: DynamicSymbols [ 187// CHECK-NEXT: Symbol { 188// CHECK-NEXT: Name: @ (0) 189// CHECK-NEXT: Value: 0x0 190// CHECK-NEXT: Size: 0 191// CHECK-NEXT: Binding: Local 192// CHECK-NEXT: Type: None 193// CHECK-NEXT: Other: 0 194// CHECK-NEXT: Section: Undefined 195// CHECK-NEXT: } 196// CHECK-NEXT: Symbol { 197// CHECK-NEXT: Name: _start@ 198// CHECK-NEXT: Value: 0x11000 199// CHECK-NEXT: Size: 0 200// CHECK-NEXT: Binding: Global 201// CHECK-NEXT: Type: Non 202// CHECK-NEXT: Other: 0 203// CHECK-NEXT: Section: .text 204// CHECK-NEXT: } 205// CHECK-NEXT: Symbol { 206// CHECK-NEXT: Name: bar@ 207// CHECK-NEXT: Value: 0x0 208// CHECK-NEXT: Size: 0 209// CHECK-NEXT: Binding: Global 210// CHECK-NEXT: Type: Function 211// CHECK-NEXT: Other: 0 212// CHECK-NEXT: Section: Undefined 213// CHECK-NEXT: } 214// CHECK-NEXT: Symbol { 215// CHECK-NEXT: Name: zed@ 216// CHECK-NEXT: Value: 0x0 217// CHECK-NEXT: Size: 0 218// CHECK-NEXT: Binding: Global 219// CHECK-NEXT: Type: None 220// CHECK-NEXT: Other: 0 221// CHECK-NEXT: Section: Undefined 222// CHECK-NEXT: } 223// CHECK-NEXT: ] 224 225// DONT_EXPORT: DynamicSymbols [ 226// DONT_EXPORT-NEXT: Symbol { 227// DONT_EXPORT-NEXT: Name: @ (0) 228// DONT_EXPORT-NEXT: Value: 0x0 229// DONT_EXPORT-NEXT: Size: 0 230// DONT_EXPORT-NEXT: Binding: Local (0x0) 231// DONT_EXPORT-NEXT: Type: None (0x0) 232// DONT_EXPORT-NEXT: Other: 0 233// DONT_EXPORT-NEXT: Section: Undefined (0x0) 234// DONT_EXPORT-NEXT: } 235// DONT_EXPORT-NEXT: Symbol { 236// DONT_EXPORT-NEXT: Name: bar@ 237// DONT_EXPORT-NEXT: Value: 0x0 238// DONT_EXPORT-NEXT: Size: 0 239// DONT_EXPORT-NEXT: Binding: Global 240// DONT_EXPORT-NEXT: Type: Function 241// DONT_EXPORT-NEXT: Other: 0 242// DONT_EXPORT-NEXT: Section: Undefined 243// DONT_EXPORT-NEXT: } 244// DONT_EXPORT-NEXT: Symbol { 245// DONT_EXPORT-NEXT: Name: zed@ 246// DONT_EXPORT-NEXT: Value: 0x0 247// DONT_EXPORT-NEXT: Size: 0 248// DONT_EXPORT-NEXT: Binding: Global 249// DONT_EXPORT-NEXT: Type: None 250// DONT_EXPORT-NEXT: Other: 0 251// DONT_EXPORT-NEXT: Section: Undefined 252// DONT_EXPORT-NEXT: } 253// DONT_EXPORT-NEXT: ] 254 255// CHECK: DynamicSection [ 256// CHECK-NEXT: Tag Type Name/Value 257// CHECK-NEXT: 0x0000001D RUNPATH foo:bar 258// CHECK-NEXT: 0x00000001 NEEDED SharedLibrary ({{.*}}2.so) 259// CHECK-NEXT: 0x00000011 REL [[RELADDR]] 260// CHECK-NEXT: 0x00000012 RELSZ [[RELSIZE]] (bytes) 261// CHECK-NEXT: 0x00000013 RELENT [[RELENT]] (bytes) 262// CHECK-NEXT: 0x00000006 SYMTAB [[DYNSYMADDR]] 263// CHECK-NEXT: 0x0000000B SYMENT [[SYMENT]] (bytes) 264// CHECK-NEXT: 0x00000005 STRTAB [[DYNSTRADDR]] 265// CHECK-NEXT: 0x0000000A STRSZ 266// CHECK-NEXT: 0x00000004 HASH [[HASHADDR]] 267// CHECK-NEXT: 0x00000015 DEBUG 0x0 268// CHECK-NEXT: 0x00000000 NULL 0x0 269// CHECK-NEXT: ] 270 271// CHECK: ProgramHeaders [ 272// CHECK: Type: PT_INTERP 273// CHECK-NEXT: Offset: [[INTERPOFFSET]] 274// CHECK-NEXT: VirtualAddress: [[INTERPADDR]] 275// CHECK-NEXT: PhysicalAddress: [[INTERPADDR]] 276// CHECK-NEXT: FileSize: [[INTERPSIZE]] 277// CHECK-NEXT: MemSize: [[INTERPSIZE]] 278// CHECK-NEXT: Flags [ 279// CHECK-NEXT: PF_R 280// CHECK-NEXT: ] 281// CHECK-NEXT: Alignment: 1 282// CHECK-NEXT: } 283// CHECK: Type: PT_DYNAMIC 284// CHECK-NEXT: Offset: [[OFFSET]] 285// CHECK-NEXT: VirtualAddress: [[ADDR]] 286// CHECK-NEXT: PhysicalAddress: [[ADDR]] 287// CHECK-NEXT: FileSize: [[SIZE]] 288// CHECK-NEXT: MemSize: [[SIZE]] 289// CHECK-NEXT: Flags [ 290// CHECK-NEXT: PF_R 291// CHECK-NEXT: PF_W 292// CHECK-NEXT: ] 293// CHECK-NEXT: Alignment: [[ALIGN]] 294// CHECK-NEXT: } 295 296// CHECK: HashTable { 297// CHECK-NEXT: Num Buckets: 4 298// CHECK-NEXT: Num Chains: 4 299// CHECK-NEXT: Buckets: [3, 0, 2, 0] 300// CHECK-NEXT: Chains: [0, 0, 0, 1] 301// CHECK-NEXT: } 302 303.global _start 304_start: 305.long bar@GOT 306.long zed@GOT 307