blob: 4ffecf9fcc6d4bd4aab5e1560e434d355fa479fd [file] [log] [blame]
## Check llvm-readelf is able to dump the content of hash sections correctly.
## Check the output when both .hash and .gnu.hash sections are present.
# RUN: yaml2obj --docnum=1 %s -o %t1-32.so
# RUN: llvm-readelf --hash-symbols %t1-32.so \
# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix HASH-32
# HASH-32: Symbol table of .hash for image:
# HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
# HASH-32-NEXT: 1 0: 00000000 0 NOTYPE GLOBAL DEFAULT UND ccc
# HASH-32-NEXT: 5 0: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb
# HASH-32-NEXT: 3 0: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
# HASH-32-NEXT: 2 0: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
# HASH-32-NEXT: 4 0: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee
# HASH-32-EMPTY:
# HASH-32: Symbol table of .gnu.hash for image:
# HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
# HASH-32-NEXT: 2 1: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
# HASH-32-NEXT: 3 1: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
# HASH-32-NEXT: 4 2: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee
# HASH-32-NEXT: 5 2: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb
# HASH-32-NOT: {{.}}
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
Sections:
## The contents of .hash and .gnu.hash were generated by a linker.
- Name: .hash
Type: SHT_HASH
Flags: [ SHF_ALLOC ]
Link: .dynsym
Content: '0300000006000000010000000000000000000000000000000500000004000000020000000000000003000000'
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Link: .dynsym
Content: 0300000002000000010000000500000048991200000000000200000004000000685C880B9169880BF46D880BCB60880B
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Link: .dynstr
Entries:
## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x1bc. DT_HASH value is 0x0.
## llvm-readelf will read .hash content from p_offset + (p_vaddr - DT_HASH value) = 0x1bc.
## This matches the file offset of the .hash section.
- Tag: DT_HASH
Value: 0x0000000000000000
- Tag: DT_GNU_HASH
## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x1bc. DT_GNU_HASH value is 0x2c (size of .hash = 0x2c).
## llvm-readelf will read .gnu.hash content from p_offset + (p_vaddr - DT_GNU_HASH value) = 0x1e8.
## This matches the file offset of the .gnu.hash section.
Value: 0x000000000000002C
- Tag: DT_NULL
Value: 0x0000000000000000
DynamicSymbols:
- Name: ccc
Binding: STB_GLOBAL
- Name: aaa
Section: .hash
Binding: STB_GLOBAL
Value: 0x0000000000001000
- Name: ddd
Index: SHN_ABS
Binding: STB_GLOBAL
Value: 0x0000000000000001
- Name: eee
Section: .gnu.hash
Binding: STB_GLOBAL
- Name: bbb
Section: .hash
Binding: STB_WEAK
Value: 0x0000000000001001
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_X ]
Sections:
- Section: .hash
- Section: .gnu.hash
- Section: .dynamic
# RUN: yaml2obj --docnum=2 %s -o %t1-64.so
# RUN: llvm-readelf --hash-symbols %t1-64.so | FileCheck %s --check-prefix HASH-64
# HASH-64: Symbol table of .hash for image:
# HASH-64-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
# HASH-64-NEXT: 1 0: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND ccc
# HASH-64-NEXT: 5 0: 0000000000001001 0 NOTYPE WEAK DEFAULT 1 bbb
# HASH-64-NEXT: 3 0: 0000000000000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
# HASH-64-NEXT: 2 0: 0000000000001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
# HASH-64-NEXT: 4 0: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 eee
# HASH-64-EMPTY:
# HASH-64-NEXT: Symbol table of .gnu.hash for image:
# HASH-64-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
# HASH-64-NEXT: 2 1: 0000000000001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
# HASH-64-NEXT: 3 1: 0000000000000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
# HASH-64-NEXT: 4 2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 eee
# HASH-64-NEXT: 5 2: 0000000000001001 0 NOTYPE WEAK DEFAULT 1 bbb
# HASH-64-NOT: {{.}}
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
## The contents of .hash and .gnu.hash were generated by a linker.
- Name: .hash
Type: SHT_HASH
Flags: [ SHF_ALLOC ]
Link: .dynsym
Content: '0300000006000000010000000000000000000000000000000500000004000000020000000000000003000000'
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Link: .dynsym
Content: 030000000200000001000000060000000808020040019200000000000200000004000000685C880B9169880BF46D880BCB60880B
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Link: .dynstr
Entries:
- Tag: DT_HASH
## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x2b8. DT_HASH value is 0x0.
## llvm-readelf will read .hash content from p_offset + (p_vaddr - DT_HASH value) = 0x2b8.
## This matches the file offset of the .hash section.
Value: 0x0000000000000000
- Tag: DT_GNU_HASH
## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x2b8. DT_GNU_HASH value is 0x2c (size of .hash = 0x2c).
## llvm-readelf will read .gnu.hash content from p_offset + (p_vaddr - DT_GNU_HASH value) = 0x2e4.
## This matches the file offset of the .gnu.hash section.
Value: 0x000000000000002c
- Tag: DT_NULL
Value: 0x0000000000000000
DynamicSymbols:
- Name: ccc
Binding: STB_GLOBAL
- Name: aaa
Section: .hash
Binding: STB_GLOBAL
Value: 0x0000000000001000
- Name: ddd
Index: SHN_ABS
Binding: STB_GLOBAL
Value: 0x0000000000000001
- Name: eee
Section: .gnu.hash
Binding: STB_GLOBAL
- Name: bbb
Section: .hash
Binding: STB_WEAK
Value: 0x0000000000001001
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_X ]
Sections:
- Section: .hash
- Section: .gnu.hash
- Section: .dynamic
## Check the output when only .hash section is present.
# RUN: yaml2obj --docnum=3 %s -o %t2-32.so
# RUN: llvm-readelf --hash-symbols %t2-32.so \
# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-HASH-32
# ONLY-HASH-32: Symbol table of .hash for image:
# ONLY-HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
# ONLY-HASH-32-NEXT: 1 0: 00000000 0 NOTYPE GLOBAL DEFAULT UND ccc
# ONLY-HASH-32-NEXT: 5 0: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb
# ONLY-HASH-32-NEXT: 3 0: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
# ONLY-HASH-32-NEXT: 2 0: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa
# ONLY-HASH-32-NEXT: 4 0: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee
# ONLY-HASH-32-NOT: {{.}}
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
Sections:
## The contents of .hash was generated by a linker.
- Name: .hash
Type: SHT_HASH
Flags: [ SHF_ALLOC ]
Link: .dynsym
Content: '0300000006000000010000000000000000000000000000000500000004000000020000000000000003000000'
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Link: .dynstr
Entries:
- Tag: DT_HASH
Value: 0x0000000000000000
- Tag: DT_NULL
Value: 0x0000000000000000
DynamicSymbols:
- Name: ccc
Binding: STB_GLOBAL
- Name: aaa
Section: .hash
Binding: STB_GLOBAL
Value: 0x0000000000001000
- Name: ddd
Index: SHN_ABS
Binding: STB_GLOBAL
Value: 0x0000000000000001
- Name: eee
Section: .dynamic
Binding: STB_GLOBAL
- Name: bbb
Section: .hash
Binding: STB_WEAK
Value: 0x0000000000001001
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_X ]
Sections:
- Section: .hash
- Section: .dynamic
## Check the output when only .gnu.hash section is present.
# RUN: yaml2obj --docnum=4 %s -o %t3-32.so
# RUN: llvm-readelf --hash-symbols %t3-32.so \
# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-GNUHASH-32
# ONLY-GNUHASH-32: Symbol table of .gnu.hash for image:
# ONLY-GNUHASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
# ONLY-GNUHASH-32-NEXT: 2 1: 00001000 0 NOTYPE GLOBAL DEFAULT 2 aaa
# ONLY-GNUHASH-32-NEXT: 3 1: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd
# ONLY-GNUHASH-32-NEXT: 4 2: 00000000 0 NOTYPE GLOBAL DEFAULT 1 eee
# ONLY-GNUHASH-32-NEXT: 5 2: 00001001 0 NOTYPE WEAK DEFAULT 2 bbb
# ONLY-GNUHASH-32-NOT: {{.}}
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
Sections:
## The contents of .gnu.hash was generated by a linker.
- Name: .gnu.hash
Type: SHT_GNU_HASH
Flags: [ SHF_ALLOC ]
Link: .dynsym
Content: 0300000002000000010000000500000048991200000000000200000004000000685C880B9169880BF46D880BCB60880B
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Link: .dynstr
Entries:
- Tag: DT_GNU_HASH
Value: 0x0000000000000000
- Tag: DT_NULL
Value: 0x0000000000000000
DynamicSymbols:
- Name: ccc
Binding: STB_GLOBAL
- Name: aaa
Section: .dynamic
Binding: STB_GLOBAL
Value: 0x0000000000001000
- Name: ddd
Index: SHN_ABS
Binding: STB_GLOBAL
Value: 0x0000000000000001
- Name: eee
Section: .gnu.hash
Binding: STB_GLOBAL
- Name: bbb
Section: .dynamic
Binding: STB_WEAK
Value: 0x0000000000001001
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_X ]
Sections:
- Section: .gnu.hash
- Section: .dynamic
## Show that if there are no hash sections, we do not print anything.
# RUN: yaml2obj --docnum=5 %s -o %t4.so
# RUN: llvm-readelf --hash-symbols %t4.so \
# RUN: | FileCheck %s --check-prefix NO-HASH --allow-empty
# NO-HASH-NOT: {{.}}
## Sanity check that we can still find the dynamic symbols (i.e. the above test
## doesn't pass due to a mistake in the dynamic section).
# RUN: llvm-readelf --dyn-symbols %t4.so | FileCheck %s --check-prefix DYNSYMS
# DYNSYMS: Symbol table '.dynsym' contains 2 entries:
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
AddressAlign: 0x100
EntSize: 0x1
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Link: .dynstr
Address: 0x100
AddressAlign: 0x100
EntSize: 0x18
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Address: 0x0000000000001000
Link: .dynstr
AddressAlign: 0x0000000000001000
EntSize: 0x0000000000000010
Entries:
- Tag: DT_STRTAB
Value: 0x0000000000000000
- Tag: DT_STRSZ
Value: 0x0000000000000009
- Tag: DT_SYMTAB
Value: 0x0000000000000100
- Tag: DT_SYMENT
Value: 0x0000000000000018
- Tag: DT_NULL
Value: 0x0000000000000000
- Name: .text.foo
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
Size: 0x40
Address: 0x2000
AddressAlign: 0x2000
DynamicSymbols:
- Name: _Z3fooi
Binding: STB_GLOBAL
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R, PF_X ]
VAddr: 0x0
PAddr: 0x0
Sections:
- Section: .dynsym
- Section: .dynstr
- Section: .dynamic
- Section: .text.foo
- Type: PT_DYNAMIC
Flags: [ PF_R ]
VAddr: 0x1000
PAddr: 0x1000
Sections:
- Section: .dynamic
## Show that we report a warning for a hash table which contains an entry of
## the bucket array pointing to a cycle.
# RUN: yaml2obj --docnum=6 %s -o %t6.so
# RUN: llvm-readelf --hash-symbols %t6.so 2>&1 | FileCheck %s -DFILE=%t6.so --check-prefix=BROKEN
# BROKEN: Symbol table of .hash for image:
# BROKEN-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name
# BROKEN-NEXT: 1 0: 00000000 0 NOTYPE LOCAL DEFAULT UND aaa
# BROKEN: warning: '[[FILE]]': .hash section is invalid: bucket 1: a cycle was detected in the linked chain
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
Sections:
- Name: .hash
Type: SHT_HASH
Link: .dynsym
Bucket: [ 1 ]
Chain: [ 1, 1 ]
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
## llvm-readelf will read the hash table from the file offset
## p_offset + (p_vaddr - DT_HASH) = p_offset + (0 - 0) = p_offset,
## which is the start of PT_LOAD, i.e. the file offset of .hash.
- Tag: DT_HASH
Value: 0x0
DynamicSymbols:
- Name: aaa
- Name: bbb
ProgramHeaders:
- Type: PT_LOAD
Sections:
- Section: .hash
- Section: .dynamic