- 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=2 %s -o %t2-32.so
+# 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
## Check the output when only .gnu.hash section is present.
-# RUN: yaml2obj --docnum=3 %s -o %t3-32.so
+# 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
- Section: .dynamic
## Show that if there are no hash sections, we do not print anything.
-# RUN: yaml2obj --docnum=4 %s -o %t4.so
+# RUN: yaml2obj --docnum=5 %s -o %t4.so
# RUN: llvm-readelf --hash-symbols %t4.so \
# RUN: | FileCheck %s --check-prefix NO-HASH --allow-empty