brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.5 KiB · db68ebd Raw
288 lines · plain
1## Check how the SHT_HASH section is dumped with --hash-table.2 3# RUN: yaml2obj --docnum=1 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t.x644# RUN: yaml2obj --docnum=1 -DBITS=32 -DMACHINE=EM_386 %s -o %t.x325 6# RUN: llvm-readobj --hash-table %t.x64 | FileCheck %s --check-prefix=HASH7# RUN: llvm-readelf --hash-table %t.x64 | FileCheck %s --check-prefix=HASH8 9# RUN: llvm-readobj --hash-table %t.x32 | FileCheck %s --check-prefix=HASH10# RUN: llvm-readelf --hash-table %t.x32 | FileCheck %s --check-prefix=HASH11 12# HASH:      HashTable {13# HASH-NEXT:   Num Buckets: 214# HASH-NEXT:   Num Chains: 315# HASH-NEXT:   Buckets: [1, 2]16# HASH-NEXT:   Chains: [3, 4, 5]17# HASH-NEXT: }18 19--- !ELF20FileHeader:21  Class:   ELFCLASS[[BITS=64]]22  Data:    ELFDATA2LSB23  Type:    ET_DYN24  Machine: [[MACHINE]]25Sections:26  - Name:    .hash27    Type:    SHT_HASH28    Flags:   [ SHF_ALLOC ]29    Bucket:  [ 1, 2 ]30    Chain:   [ 3, 4, 5 ]31    EntSize: [[ENTSIZE=4]]32  - Name:  .dynamic33    Type:  SHT_DYNAMIC34    Flags: [ SHF_ALLOC ]35    Entries:36      - Tag:   DT_HASH37        Value: 0x038      - Tag:   DT_NULL39        Value: 0x040ProgramHeaders:41  - Type:     PT_LOAD42    FirstSec: .hash43    LastSec:  .dynamic44 45## Document that we ignore the sh_entsize value when dumping the hash section.46## Implementation assumes that the size of entries is 4, matching the ELF specification.47 48# RUN: yaml2obj --docnum=1 -DENTSIZE=8 -DBITS=64 -DMACHINE=EM_X86_64 %s -o %t.x64.ent849# RUN: yaml2obj --docnum=1 -DENTSIZE=8 -DBITS=32 -DMACHINE=EM_386 %s -o %t.x32.ent850 51# RUN: llvm-readobj --hash-table %t.x64.ent8 | FileCheck %s --check-prefix=HASH52# RUN: llvm-readelf --hash-table %t.x64.ent8 | FileCheck %s --check-prefix=HASH53# RUN: llvm-readobj --hash-table %t.x32.ent8 | FileCheck %s --check-prefix=HASH54# RUN: llvm-readelf --hash-table %t.x32.ent8 | FileCheck %s --check-prefix=HASH55 56## We don't support dumping hash tables on EM_S390 and EM_ALPHA platforms and report a warning.57## On these platforms the size of entries is 8, which violates the ELF specification, which says that the size58## of hash entries in the hash table must be 4.59 60# RUN: yaml2obj --docnum=1 -DMACHINE=EM_S390 %s -o %t.s39061# RUN: llvm-readobj --hash-table %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --check-prefixes=WARN-HASH -DNAME="IBM S/390"62# RUN: llvm-readelf --hash-table %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --check-prefixes=WARN-HASH -DNAME="IBM S/390"63 64# WARN-HASH:      HashTable {65# WARN-HASH-NEXT: warning: '[[FILE]]': the hash table at 0x78 is not supported: it contains non-standard 8 byte entries on [[NAME]] platform66# WARN-HASH-NEXT: }67 68# RUN: yaml2obj --docnum=1 -DMACHINE=EM_ALPHA %s -o %t.alpha69# RUN: llvm-readobj --hash-table %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --check-prefixes=WARN-HASH -DNAME="EM_ALPHA"70# RUN: llvm-readelf --hash-table %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --check-prefixes=WARN-HASH -DNAME="EM_ALPHA"71 72## We don't report warnings about the unsupported hash table on EM_S390 and EM_ALPHA platforms73## when --hash-table is not requested.74 75# RUN: llvm-readobj %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --allow-empty --implicit-check-not="warning:"76# RUN: llvm-readelf %t.s390 2>&1 | FileCheck %s -DFILE=%t.s390 --allow-empty --implicit-check-not="warning:"77# RUN: llvm-readobj %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --allow-empty --implicit-check-not="warning:"78# RUN: llvm-readelf %t.alpha 2>&1 | FileCheck %s -DFILE=%t.alpha --allow-empty --implicit-check-not="warning:"79 80## Check we can dump the SHT_HASH section even when an object81## does not have the section header table.82 83# RUN: yaml2obj --docnum=2 -DNOHEADERS=true %s -o %t.noshdr84# RUN: llvm-readobj --hash-table %t.noshdr 2>&1 | \85# RUN:   FileCheck %s -DFILE=%t.noshdr --check-prefix=NOSHDR --implicit-check-not=warning:86# RUN: llvm-readelf --hash-table %t.noshdr 2>&1 | \87# RUN:   FileCheck %s -DFILE=%t.noshdr --check-prefix=NOSHDR --implicit-check-not=warning:88 89# NOSHDR:      HashTable {90# NOSHDR-NEXT:   Num Buckets: 191# NOSHDR-NEXT:   Num Chains: 192# NOSHDR-NEXT:   Buckets: [0]93# NOSHDR-NEXT:   Chains: [1]94# NOSHDR-NEXT: }95 96--- !ELF97FileHeader:98  Class: ELFCLASS6499  Data:  ELFDATA2LSB100  Type:  ET_DYN101Sections:102  - Name:   .hash103    Type:   SHT_HASH104    Flags:  [ SHF_ALLOC ]105    Bucket: [ 0 ]106    Chain:  [ 1 ]107    EntSize: [[ENTSIZE=4]]108  - Name:  .dynamic109    Type:  SHT_DYNAMIC110    Flags: [ SHF_ALLOC ]111    Entries:112      - Tag:   [[DYNTAG=DT_HASH]]113        Value: 0x0114      - Tag:   DT_NULL115        Value: 0x0116  - Type: SectionHeaderTable117    NoHeaders: [[NOHEADERS=false]]118ProgramHeaders:119  - Type:     PT_LOAD120    FirstSec: .hash121    LastSec:  .dynamic122  - Type:     PT_DYNAMIC123    VAddr:    0x10124    FirstSec: .dynamic125    LastSec:  .dynamic126 127## Document we don't report a warning when the value of the sh_entsize field of the SHT_HASH section is not 4.128 129# RUN: yaml2obj --docnum=2 -DENTSIZE=0xff %s -o %t.ent.size130# RUN: llvm-readobj --hash-table %t.ent.size 2>&1 | \131# RUN:   FileCheck %s -DFILE=%t.ent.size --check-prefix=NOSHDR --implicit-check-not=warning:132# RUN: llvm-readelf --hash-table %t.ent.size 2>&1 | \133# RUN:   FileCheck %s -DFILE=%t.ent.size --check-prefix=NOSHDR --implicit-check-not=warning:134 135## Document we need the DT_HASH dynamic tag to locate the hash table.136 137# RUN: yaml2obj --docnum=2 -DDYNTAG=DT_NULL %s -o %t.no.dyntag138# RUN: llvm-readobj --hash-table %t.no.dyntag 2>&1 | \139# RUN:   FileCheck %s -DFILE=%t.no.dyntag --check-prefix=NODYNTAG --implicit-check-not=warning:140# RUN: llvm-readelf --hash-table %t.no.dyntag 2>&1 | \141# RUN:   FileCheck %s -DFILE=%t.no.dyntag --check-prefix=NODYNTAG --implicit-check-not=warning:142 143# NODYNTAG:      HashTable {144# NODYNTAG-NEXT: }145 146## Each SHT_HASH section starts with two 32-bit fields: nbucket and nchain.147## Check we report an error when a DT_HASH value points to data that has size less than 8 bytes.148 149# RUN: yaml2obj --docnum=3 %s -o %t4.o150# RUN: llvm-readelf --hash-table %t4.o 2>&1 | FileCheck %s --check-prefix=ERR1 -DFILE=%t4.o151# RUN: llvm-readobj --hash-table %t4.o 2>&1 | FileCheck %s --check-prefix=ERR1 -DFILE=%t4.o152 153# ERR1:      HashTable {154# ERR1-NEXT:  warning: '[[FILE]]': the hash table at offset 0x2b1 goes past the end of the file (0x2b8){{$}}155# ERR1-NEXT: }156 157--- !ELF158FileHeader:159  Class: ELFCLASS64160  Data:  ELFDATA2LSB161  Type:  ET_DYN162Sections:163  - Name:   .hash164    Type:   SHT_HASH165    Flags:  [ SHF_ALLOC ]166    Bucket: [ 0 ]167    Chain:  [ 0 ]168  - Name:  .dynamic169    Type:  SHT_DYNAMIC170    Flags: [ SHF_WRITE, SHF_ALLOC ]171    Entries:172      - Tag:   DT_HASH173        Value: 0x239174      - Tag:   DT_NULL175        Value: 0x0176DynamicSymbols: []177ProgramHeaders:178  - Type:     PT_LOAD179    FileSize: 0x23a180    FirstSec: .hash181    LastSec:  .dynamic182 183## Check we report a warning when the hash table goes past the end of the file.184 185## Case A.1: the hash table ends right before the EOF. We have a broken nbucket186##           field that has a value larger than the number of buckets.187# RUN: yaml2obj --docnum=4 %s -o %t5.1.o -DNBUCKET=0x5d -DNCHAIN=0x1188# RUN: llvm-readelf --hash-table %t5.1.o 2>&1 | \189# RUN:   FileCheck %s --check-prefix=NOERR1 --implicit-check-not="warning:"190# RUN: llvm-readobj --hash-table %t5.1.o 2>&1 | \191# RUN:   FileCheck %s --check-prefix=NOERR1 --implicit-check-not="warning:"192 193# NOERR1:      HashTable {194# NOERR1-NEXT:  Num Buckets: 93195# NOERR1-NEXT:  Num Chains: 1196## Here we would dump the rest of the file as buckets array because we have a broken nbucket field.197## No need to check what we dump, we only want to test that we have no unexpected warnings/crashes.198# NOERR1-NEXT:  Buckets:199# NOERR1-NEXT:  Chains: [0]200# NOERR1-NEXT: }201 202## Case A.2: the hash table ends 1 byte past the EOF. We have a broken nbucket203##           field that has a value larger than the number of buckets.204# RUN: yaml2obj --docnum=4 %s -o %t5.2.o -DNBUCKET=0x5e -DNCHAIN=0x1205# RUN: llvm-readelf --hash-table %t5.2.o 2>&1 | \206# RUN:   FileCheck %s --check-prefix=ERR2 -DFILE=%t5.2.o --implicit-check-not="warning:"207# RUN: llvm-readobj --hash-table %t5.2.o 2>&1 | \208# RUN:   FileCheck %s --check-prefix=ERR2 -DFILE=%t5.2.o --implicit-check-not="warning:"209 210# ERR2:      HashTable {211# ERR2:       Num Buckets: 94212# ERR2:       Num Chains: 1213# ERR2-NEXT:  warning: '[[FILE]]': the hash table at offset 0x54 goes past the end of the file (0x1d4), nbucket = 94, nchain = 1{{$}}214# ERR2-NEXT: }215 216## Case B.1: the hash table ends right before the EOF. We have a broken nchain217##           field that has a value larger than the number of chains.218# RUN: yaml2obj --docnum=4 %s -o %t5.3.o -DNBUCKET=0x1 -DNCHAIN=0x5d219# RUN: llvm-readelf --hash-table %t5.3.o 2>&1 | \220# RUN:   FileCheck %s --check-prefix=NOERR2 -DFILE=%t5.3.o --implicit-check-not="warning:"221# RUN: llvm-readobj --hash-table %t5.3.o 2>&1 | \222# RUN:   FileCheck %s --check-prefix=NOERR2 -DFILE=%t5.3.o --implicit-check-not="warning:"223 224# NOERR2:      warning: '[[FILE]]': hash table nchain (93) differs from symbol count derived from SHT_DYNSYM section header (1)225# 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 ignored226# NOERR2:      HashTable {227# NOERR2-NEXT:   Num Buckets: 1228# NOERR2-NEXT:   Num Chains: 93229# NOERR2-NEXT:   Buckets: [0]230## Here we would dump the rest of the file as chain array because we have a broken nchain field.231## No need to check what we dump, we only want to test that we have no unexpected warnings/crashes.232# NOERR2-NEXT:   Chains:233# NOERR2-NEXT: }234 235## Case B.2: the hash table ends 1 byte past the EOF. We have a broken nchain236##           field that has a value larger than the number of chains.237# RUN: yaml2obj --docnum=4 %s -o %t5.4.o -DNBUCKET=0x1 -DNCHAIN=0x5e238# RUN: llvm-readelf --hash-table %t5.4.o 2>&1 | \239# RUN:   FileCheck %s --check-prefix=ERR3 -DFILE=%t5.4.o --implicit-check-not="warning:"240# RUN: llvm-readobj --hash-table %t5.4.o 2>&1 | \241# RUN:   FileCheck %s --check-prefix=ERR3 -DFILE=%t5.4.o --implicit-check-not="warning:"242 243# ERR3:      warning: '[[FILE]]': hash table nchain (94) differs from symbol count derived from SHT_DYNSYM section header (1)244# 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 ignored245# ERR3:      HashTable {246# ERR3-NEXT:  Num Buckets: 1247# ERR3-NEXT:  Num Chains: 94248# ERR3-NEXT:  warning: '[[FILE]]': the hash table at offset 0x54 goes past the end of the file (0x1d4), nbucket = 1, nchain = 94{{$}}249# ERR3-NEXT: }250 251--- !ELF252FileHeader:253  Class: ELFCLASS32254  Data:  ELFDATA2LSB255  Type:  ET_DYN256Sections:257  - Name:    .hash258    Type:    SHT_HASH259    Flags:   [ SHF_ALLOC ]260    Bucket:  [ 0 ]261    NBucket: [[NBUCKET]]262    Chain:   [ 0 ]263    NChain:  [[NCHAIN]]264  - Name:  .dynamic265    Type:  SHT_DYNAMIC266    Flags: [ SHF_WRITE, SHF_ALLOC ]267    Entries:268      - Tag:   DT_HASH269        Value: 0x0270      - Tag:   DT_NULL271        Value: 0x0272DynamicSymbols: []273ProgramHeaders:274  - Type:     PT_LOAD275    FirstSec: .hash276    LastSec: .dynamic277 278## Show we do not duplicate warnings when printing both the hash table and the hash histogram.279## Note that --elf-hash-histogram is only implemented for llvm-readelf currently.280# RUN: yaml2obj --docnum=3 %s -o %t4.o281# RUN: llvm-readelf --hash-table --elf-hash-histogram %t4.o 2>&1 \282# RUN:   | FileCheck %s --check-prefix=SINGLE-WARN -DFILE=%t4.o --implicit-check-not="warning:"283 284# SINGLE-WARN:      warning: '[[FILE]]': hash table nchain (0) differs from symbol count derived from SHT_DYNSYM section header (1)285# SINGLE-WARN-NEXT: HashTable {286# SINGLE-WARN-NEXT: warning: '[[FILE]]': the hash table at offset 0x2b1 goes past the end of the file (0x2b8)287# SINGLE-WARN-NEXT: }288