| ## Check how the SHT_HASH section is dumped with --hash-table. |
| |
| # RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t.x64 |
| # RUN: yaml2obj --docnum=1 -DBITS=32 -DMACHINE=EM_386 %s -o %t.x32 |
| |
| # RUN: llvm-readobj --hash-table %t.x64 | FileCheck %s --check-prefix=HASH |
| # RUN: llvm-readelf --hash-table %t.x64 | FileCheck %s --check-prefix=HASH |
| |
| # RUN: llvm-readobj --hash-table %t.x32 | FileCheck %s --check-prefix=HASH |
| # RUN: llvm-readelf --hash-table %t.x32 | FileCheck %s --check-prefix=HASH |
| |
| # HASH: HashTable { |
| # HASH-NEXT: Num Buckets: 2 |
| # HASH-NEXT: Num Chains: 3 |
| # HASH-NEXT: Buckets: [1, 2] |
| # HASH-NEXT: Chains: [3, 4, 5] |
| # HASH-NEXT: } |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS[[BITS=64]] |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Machine: [[MACHINE]] |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Flags: [ SHF_ALLOC ] |
| Bucket: [ 1, 2 ] |
| Chain: [ 3, 4, 5 ] |
| EntSize: [[ENTSIZE=4]] |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Flags: [ SHF_ALLOC ] |
| Entries: |
| - Tag: DT_HASH |
| Value: 0x0 |
| - Tag: DT_NULL |
| Value: 0x0 |
| ProgramHeaders: |
| - Type: PT_LOAD |
| FirstSec: .hash |
| LastSec: .dynamic |
| |
| ## Document that we ignore the sh_entsize value when dumping the hash section. |
| ## Implementation assumes that the size of entries is 4, matching the ELF specification. |
| |
| # RUN: yaml2obj --docnum=1 -DENTSIZE=8 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t.x64.ent8 |
| # RUN: yaml2obj --docnum=1 -DENTSIZE=8 -DBITS=32 -DMACHINE=EM_386 %s -o %t.x32.ent8 |
| |
| # RUN: llvm-readobj --hash-table %t.x64.ent8 | FileCheck %s --check-prefix=HASH |
| # RUN: llvm-readelf --hash-table %t.x64.ent8 | FileCheck %s --check-prefix=HASH |
| # RUN: llvm-readobj --hash-table %t.x32.ent8 | FileCheck %s --check-prefix=HASH |
| # RUN: llvm-readelf --hash-table %t.x32.ent8 | FileCheck %s --check-prefix=HASH |
| |
| ## We don't support dumping hash tables on EM_S390 and EM_ALPHA platforms and report a warning. |
| ## On these platforms the size of entries is 8, which violates the ELF specification, which says that the size |
| ## of hash entries in the hash table must be 4. |
| |
| # RUN: yaml2obj --docnum=1 -DMACHINE=EM_S390 %s -o %t.s390 |
| # RUN: llvm-readobj --hash-table %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --check-prefixes=WARN-HASH -DNAME="IBM S/390" |
| # RUN: llvm-readelf --hash-table %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --check-prefixes=WARN-HASH -DNAME="IBM S/390" |
| |
| # WARN-HASH: HashTable { |
| # WARN-HASH-NEXT: warning: '[[FILE]]': the hash table at 0x78 is not supported: it contains non-standard 8 byte entries on [[NAME]] platform |
| # WARN-HASH-NEXT: } |
| |
| # RUN: yaml2obj --docnum=1 -DMACHINE=EM_ALPHA %s -o %t.alpha |
| # RUN: llvm-readobj --hash-table %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --check-prefixes=WARN-HASH -DNAME="EM_ALPHA" |
| # RUN: llvm-readelf --hash-table %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --check-prefixes=WARN-HASH -DNAME="EM_ALPHA" |
| |
| ## We don't report warnings about the unsupported hash table on EM_S390 and EM_ALPHA platforms |
| ## when --hash-table is not requested. |
| |
| # RUN: llvm-readobj %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --allow-empty --implicit-check-not="warning:" |
| # RUN: llvm-readelf %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --allow-empty --implicit-check-not="warning:" |
| # RUN: llvm-readobj %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --allow-empty --implicit-check-not="warning:" |
| # RUN: llvm-readelf %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --allow-empty --implicit-check-not="warning:" |
| |
| ## Check we can dump the SHT_HASH section even when an object |
| ## does not have the section header table. |
| |
| # RUN: yaml2obj --docnum=2 -DNOHEADERS=true %s -o %t.noshdr |
| # RUN: llvm-readobj --hash-table %t.noshdr 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.noshdr --check-prefix=NOSHDR --implicit-check-not=warning: |
| # RUN: llvm-readelf --hash-table %t.noshdr 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.noshdr --check-prefix=NOSHDR --implicit-check-not=warning: |
| |
| # NOSHDR: HashTable { |
| # NOSHDR-NEXT: Num Buckets: 1 |
| # NOSHDR-NEXT: Num Chains: 1 |
| # NOSHDR-NEXT: Buckets: [0] |
| # NOSHDR-NEXT: Chains: [1] |
| # NOSHDR-NEXT: } |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Flags: [ SHF_ALLOC ] |
| Bucket: [ 0 ] |
| Chain: [ 1 ] |
| EntSize: [[ENTSIZE=4]] |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Flags: [ SHF_ALLOC ] |
| Entries: |
| - Tag: [[DYNTAG=DT_HASH]] |
| Value: 0x0 |
| - Tag: DT_NULL |
| Value: 0x0 |
| - Type: SectionHeaderTable |
| NoHeaders: [[NOHEADERS=false]] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| FirstSec: .hash |
| LastSec: .dynamic |
| - Type: PT_DYNAMIC |
| VAddr: 0x10 |
| FirstSec: .dynamic |
| LastSec: .dynamic |
| |
| ## Document we don't report a warning when the value of the sh_entsize field of the SHT_HASH section is not 4. |
| |
| # RUN: yaml2obj --docnum=2 -DENTSIZE=0xff %s -o %t.ent.size |
| # RUN: llvm-readobj --hash-table %t.ent.size 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.ent.size --check-prefix=NOSHDR --implicit-check-not=warning: |
| # RUN: llvm-readelf --hash-table %t.ent.size 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.ent.size --check-prefix=NOSHDR --implicit-check-not=warning: |
| |
| ## Document we need the DT_HASH dynamic tag to locate the hash table. |
| |
| # RUN: yaml2obj --docnum=2 -DDYNTAG=DT_NULL %s -o %t.no.dyntag |
| # RUN: llvm-readobj --hash-table %t.no.dyntag 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.no.dyntag --check-prefix=NODYNTAG --implicit-check-not=warning: |
| # RUN: llvm-readelf --hash-table %t.no.dyntag 2>&1 | \ |
| # RUN: FileCheck %s -DFILE=%t.no.dyntag --check-prefix=NODYNTAG --implicit-check-not=warning: |
| |
| # NODYNTAG: HashTable { |
| # NODYNTAG-NEXT: } |
| |
| ## Each SHT_HASH section starts with two 32-bit fields: nbucket and nchain. |
| ## Check we report an error when a DT_HASH value points to data that has size less than 8 bytes. |
| |
| # RUN: yaml2obj --docnum=3 %s -o %t4.o |
| # RUN: llvm-readelf --hash-table %t4.o 2>&1 | FileCheck %s --check-prefix=ERR1 -DFILE=%t4.o |
| # RUN: llvm-readobj --hash-table %t4.o 2>&1 | FileCheck %s --check-prefix=ERR1 -DFILE=%t4.o |
| |
| # ERR1: HashTable { |
| # ERR1-NEXT: warning: '[[FILE]]': the hash table at offset 0x2b1 goes past the end of the file (0x2b8){{$}} |
| # ERR1-NEXT: } |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Flags: [ SHF_ALLOC ] |
| Bucket: [ 0 ] |
| Chain: [ 0 ] |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Flags: [ SHF_WRITE, SHF_ALLOC ] |
| Entries: |
| - Tag: DT_HASH |
| Value: 0x239 |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| FileSize: 0x23a |
| FirstSec: .hash |
| LastSec: .dynamic |
| |
| ## Check we report a warning when the hash table goes past the end of the file. |
| |
| ## Case A.1: the hash table ends right before the EOF. We have a broken nbucket |
| ## field that has a value larger than the number of buckets. |
| # RUN: yaml2obj --docnum=4 %s -o %t5.1.o -DNBUCKET=0x5d -DNCHAIN=0x1 |
| # RUN: llvm-readelf --hash-table %t5.1.o 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=NOERR1 --implicit-check-not="warning:" |
| # RUN: llvm-readobj --hash-table %t5.1.o 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=NOERR1 --implicit-check-not="warning:" |
| |
| # NOERR1: HashTable { |
| # NOERR1-NEXT: Num Buckets: 93 |
| # NOERR1-NEXT: Num Chains: 1 |
| ## Here we would dump the rest of the file as buckets array because we have a broken nbucket field. |
| ## No need to check what we dump, we only want to test that we have no unexpected warnings/crashes. |
| # NOERR1-NEXT: Buckets: |
| # NOERR1-NEXT: Chains: [0] |
| # NOERR1-NEXT: } |
| |
| ## Case A.2: the hash table ends 1 byte past the EOF. We have a broken nbucket |
| ## field that has a value larger than the number of buckets. |
| # RUN: yaml2obj --docnum=4 %s -o %t5.2.o -DNBUCKET=0x5e -DNCHAIN=0x1 |
| # RUN: llvm-readelf --hash-table %t5.2.o 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=ERR2 -DFILE=%t5.2.o --implicit-check-not="warning:" |
| # RUN: llvm-readobj --hash-table %t5.2.o 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=ERR2 -DFILE=%t5.2.o --implicit-check-not="warning:" |
| |
| # ERR2: HashTable { |
| # ERR2: Num Buckets: 94 |
| # ERR2: Num Chains: 1 |
| # ERR2-NEXT: warning: '[[FILE]]': the hash table at offset 0x54 goes past the end of the file (0x1d4), nbucket = 94, nchain = 1{{$}} |
| # ERR2-NEXT: } |
| |
| ## Case B.1: the hash table ends right before the EOF. We have a broken nchain |
| ## field that has a value larger than the number of chains. |
| # RUN: yaml2obj --docnum=4 %s -o %t5.3.o -DNBUCKET=0x1 -DNCHAIN=0x5d |
| # RUN: llvm-readelf --hash-table %t5.3.o 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=NOERR2 -DFILE=%t5.3.o --implicit-check-not="warning:" |
| # RUN: llvm-readobj --hash-table %t5.3.o 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=NOERR2 -DFILE=%t5.3.o --implicit-check-not="warning:" |
| |
| # NOERR2: warning: '[[FILE]]': hash table nchain (93) differs from symbol count derived from SHT_DYNSYM section header (1) |
| # NOERR2: warning: '[[FILE]]': the size (0x5d0) of the dynamic symbol table at 0x78, derived from the hash table, goes past the end of the file (0x1d4) and will be ignored |
| # NOERR2: HashTable { |
| # NOERR2-NEXT: Num Buckets: 1 |
| # NOERR2-NEXT: Num Chains: 93 |
| # NOERR2-NEXT: Buckets: [0] |
| ## Here we would dump the rest of the file as chain array because we have a broken nchain field. |
| ## No need to check what we dump, we only want to test that we have no unexpected warnings/crashes. |
| # NOERR2-NEXT: Chains: |
| # NOERR2-NEXT: } |
| |
| ## Case B.2: the hash table ends 1 byte past the EOF. We have a broken nchain |
| ## field that has a value larger than the number of chains. |
| # RUN: yaml2obj --docnum=4 %s -o %t5.4.o -DNBUCKET=0x1 -DNCHAIN=0x5e |
| # RUN: llvm-readelf --hash-table %t5.4.o 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=ERR3 -DFILE=%t5.4.o --implicit-check-not="warning:" |
| # RUN: llvm-readobj --hash-table %t5.4.o 2>&1 | \ |
| # RUN: FileCheck %s --check-prefix=ERR3 -DFILE=%t5.4.o --implicit-check-not="warning:" |
| |
| # ERR3: warning: '[[FILE]]': hash table nchain (94) differs from symbol count derived from SHT_DYNSYM section header (1) |
| # ERR3: warning: '[[FILE]]': the size (0x5e0) of the dynamic symbol table at 0x78, derived from the hash table, goes past the end of the file (0x1d4) and will be ignored |
| # ERR3: HashTable { |
| # ERR3-NEXT: Num Buckets: 1 |
| # ERR3-NEXT: Num Chains: 94 |
| # ERR3-NEXT: warning: '[[FILE]]': the hash table at offset 0x54 goes past the end of the file (0x1d4), nbucket = 1, nchain = 94{{$}} |
| # ERR3-NEXT: } |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS32 |
| Data: ELFDATA2LSB |
| Type: ET_DYN |
| Sections: |
| - Name: .hash |
| Type: SHT_HASH |
| Flags: [ SHF_ALLOC ] |
| Bucket: [ 0 ] |
| NBucket: [[NBUCKET]] |
| Chain: [ 0 ] |
| NChain: [[NCHAIN]] |
| - Name: .dynamic |
| Type: SHT_DYNAMIC |
| Flags: [ SHF_WRITE, SHF_ALLOC ] |
| Entries: |
| - Tag: DT_HASH |
| Value: 0x0 |
| - Tag: DT_NULL |
| Value: 0x0 |
| DynamicSymbols: [] |
| ProgramHeaders: |
| - Type: PT_LOAD |
| FirstSec: .hash |
| LastSec: .dynamic |
| |
| ## Show we do not duplicate warnings when printing both the hash table and the hash histogram. |
| ## Note that --elf-hash-histogram is only implemented for llvm-readelf currently. |
| # RUN: yaml2obj --docnum=3 %s -o %t4.o |
| # RUN: llvm-readelf --hash-table --elf-hash-histogram %t4.o 2>&1 \ |
| # RUN: | FileCheck %s --check-prefix=SINGLE-WARN -DFILE=%t4.o --implicit-check-not="warning:" |
| |
| # SINGLE-WARN: warning: '[[FILE]]': hash table nchain (0) differs from symbol count derived from SHT_DYNSYM section header (1) |
| # SINGLE-WARN-NEXT: HashTable { |
| # SINGLE-WARN-NEXT: warning: '[[FILE]]': the hash table at offset 0x2b1 goes past the end of the file (0x2b8) |
| # SINGLE-WARN-NEXT: } |