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: 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 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 123// CHECK: Name: .symtab 124// CHECK-NEXT: Type: SHT_SYMTAB 125// CHECK-NEXT: Flags [ 126// CHECK-NEXT: ] 127// CHECK-NEXT: Address: 128// CHECK-NEXT: Offset: 129// CHECK-NEXT: Size: 130// CHECK-NEXT: Link: 131// CHECK-NEXT: Info: 132// CHECK-NEXT: AddressAlignment: 133// CHECK-NEXT: EntrySize: [[SYMENT:.*]] 134 135// CHECK: Symbols [ 136// CHECK-NEXT: Symbol { 137// CHECK-NEXT: Name: 138// CHECK-NEXT: Value: 0x0 139// CHECK-NEXT: Size: 0 140// CHECK-NEXT: Binding: Local 141// CHECK-NEXT: Type: None 142// CHECK-NEXT: Other: 0 143// CHECK-NEXT: Section: Undefined 144// CHECK-NEXT: } 145// CHECK-NEXT: Symbol { 146// CHECK-NEXT: Name: _DYNAMIC 147// CHECK-NEXT: Value: 0x12000 148// CHECK-NEXT: Size: 0 149// CHECK-NEXT: Binding: Local 150// CHECK-NEXT: Type: None 151// CHECK-NEXT: Other [ (0x2) 152// CHECK-NEXT: STV_HIDDEN 153// CHECK-NEXT: ] 154// CHECK-NEXT: Section: .dynamic 155// CHECK-NEXT: } 156// CHECK-NEXT: Symbol { 157// CHECK-NEXT: Name: _start 158// CHECK-NEXT: Value: 0x11000 159// CHECK-NEXT: Size: 0 160// CHECK-NEXT: Binding: Global 161// CHECK-NEXT: Type: None 162// CHECK-NEXT: Other: 0 163// CHECK-NEXT: Section: .text 164// CHECK-NEXT: } 165// CHECK-NEXT: Symbol { 166// CHECK-NEXT: Name: bar 167// CHECK-NEXT: Value: 0x0 168// CHECK-NEXT: Size: 0 169// CHECK-NEXT: Binding: Global 170// CHECK-NEXT: Type: Function 171// CHECK-NEXT: Other: 0 172// CHECK-NEXT: Section: Undefined 173// CHECK-NEXT: } 174// CHECK-NEXT: Symbol { 175// CHECK-NEXT: Name: zed 176// CHECK-NEXT: Value: 0x0 177// CHECK-NEXT: Size: 0 178// CHECK-NEXT: Binding: Global (0x1) 179// CHECK-NEXT: Type: None (0x0) 180// CHECK-NEXT: Other: 0 181// CHECK-NEXT: Section: Undefined (0x0) 182// CHECK-NEXT: } 183// CHECK-NEXT: ] 184 185// CHECK: DynamicSymbols [ 186// CHECK-NEXT: Symbol { 187// CHECK-NEXT: Name: @ 188// CHECK-NEXT: Value: 0x0 189// CHECK-NEXT: Size: 0 190// CHECK-NEXT: Binding: Local 191// CHECK-NEXT: Type: None 192// CHECK-NEXT: Other: 0 193// CHECK-NEXT: Section: Undefined 194// CHECK-NEXT: } 195// CHECK-NEXT: Symbol { 196// CHECK-NEXT: Name: _start@ 197// CHECK-NEXT: Value: 0x11000 198// CHECK-NEXT: Size: 0 199// CHECK-NEXT: Binding: Global 200// CHECK-NEXT: Type: Non 201// CHECK-NEXT: Other: 0 202// CHECK-NEXT: Section: .text 203// CHECK-NEXT: } 204// CHECK-NEXT: Symbol { 205// CHECK-NEXT: Name: bar@ 206// CHECK-NEXT: Value: 0x0 207// CHECK-NEXT: Size: 0 208// CHECK-NEXT: Binding: Global 209// CHECK-NEXT: Type: Function 210// CHECK-NEXT: Other: 0 211// CHECK-NEXT: Section: Undefined 212// CHECK-NEXT: } 213// CHECK-NEXT: Symbol { 214// CHECK-NEXT: Name: zed@ 215// CHECK-NEXT: Value: 0x0 216// CHECK-NEXT: Size: 0 217// CHECK-NEXT: Binding: Global 218// CHECK-NEXT: Type: None 219// CHECK-NEXT: Other: 0 220// CHECK-NEXT: Section: Undefined 221// CHECK-NEXT: } 222// CHECK-NEXT: ] 223 224// DONT_EXPORT: DynamicSymbols [ 225// DONT_EXPORT-NEXT: Symbol { 226// DONT_EXPORT-NEXT: Name: @ 227// DONT_EXPORT-NEXT: Value: 0x0 228// DONT_EXPORT-NEXT: Size: 0 229// DONT_EXPORT-NEXT: Binding: Local (0x0) 230// DONT_EXPORT-NEXT: Type: None (0x0) 231// DONT_EXPORT-NEXT: Other: 0 232// DONT_EXPORT-NEXT: Section: Undefined (0x0) 233// DONT_EXPORT-NEXT: } 234// DONT_EXPORT-NEXT: Symbol { 235// DONT_EXPORT-NEXT: Name: bar@ 236// DONT_EXPORT-NEXT: Value: 0x0 237// DONT_EXPORT-NEXT: Size: 0 238// DONT_EXPORT-NEXT: Binding: Global 239// DONT_EXPORT-NEXT: Type: Function 240// DONT_EXPORT-NEXT: Other: 0 241// DONT_EXPORT-NEXT: Section: Undefined 242// DONT_EXPORT-NEXT: } 243// DONT_EXPORT-NEXT: Symbol { 244// DONT_EXPORT-NEXT: Name: zed@ 245// DONT_EXPORT-NEXT: Value: 0x0 246// DONT_EXPORT-NEXT: Size: 0 247// DONT_EXPORT-NEXT: Binding: Global 248// DONT_EXPORT-NEXT: Type: None 249// DONT_EXPORT-NEXT: Other: 0 250// DONT_EXPORT-NEXT: Section: Undefined 251// DONT_EXPORT-NEXT: } 252// DONT_EXPORT-NEXT: ] 253 254// CHECK: DynamicSection [ 255// CHECK-NEXT: Tag Type Name/Value 256// CHECK-NEXT: 0x0000001D RUNPATH foo:bar 257// CHECK-NEXT: 0x00000001 NEEDED SharedLibrary ({{.*}}2.so) 258// CHECK-NEXT: 0x00000015 DEBUG 0x0 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: 0x00000000 NULL 0x0 268// CHECK-NEXT: ] 269 270// CHECK: ProgramHeaders [ 271// CHECK: Type: PT_INTERP 272// CHECK-NEXT: Offset: [[INTERPOFFSET]] 273// CHECK-NEXT: VirtualAddress: [[INTERPADDR]] 274// CHECK-NEXT: PhysicalAddress: [[INTERPADDR]] 275// CHECK-NEXT: FileSize: [[INTERPSIZE]] 276// CHECK-NEXT: MemSize: [[INTERPSIZE]] 277// CHECK-NEXT: Flags [ 278// CHECK-NEXT: PF_R 279// CHECK-NEXT: ] 280// CHECK-NEXT: Alignment: 1 281// CHECK-NEXT: } 282// CHECK: Type: PT_DYNAMIC 283// CHECK-NEXT: Offset: [[OFFSET]] 284// CHECK-NEXT: VirtualAddress: [[ADDR]] 285// CHECK-NEXT: PhysicalAddress: [[ADDR]] 286// CHECK-NEXT: FileSize: [[SIZE]] 287// CHECK-NEXT: MemSize: [[SIZE]] 288// CHECK-NEXT: Flags [ 289// CHECK-NEXT: PF_R 290// CHECK-NEXT: PF_W 291// CHECK-NEXT: ] 292// CHECK-NEXT: Alignment: [[ALIGN]] 293// CHECK-NEXT: } 294 295// CHECK: HashTable { 296// CHECK-NEXT: Num Buckets: 4 297// CHECK-NEXT: Num Chains: 4 298// CHECK-NEXT: Buckets: [3, 0, 2, 0] 299// CHECK-NEXT: Chains: [0, 0, 0, 1] 300// CHECK-NEXT: } 301 302.global _start 303_start: 304.long bar@GOT 305.long zed@GOT 306