| ## 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 |