## Here we test the --elf-hash-histogram command line option. ## This test case checks how we built a histogram for a GNU hash section. ## We check both 32-bit and 64-bit inputs. # RUN: yaml2obj --docnum=1 %s -o %t1-32.o # RUN: llvm-readelf --elf-hash-histogram %t1-32.o | FileCheck %s --check-prefix=GNU-HASH # RUN: yaml2obj --docnum=2 %s -o %t1-64.o # RUN: llvm-readelf --elf-hash-histogram %t1-64.o | FileCheck %s --check-prefix=GNU-HASH # GNU-HASH: Histogram for `.gnu.hash' bucket list length (total of 3 buckets) # GNU-HASH-NEXT: Length Number % of total Coverage # GNU-HASH-NEXT: 0 1 ( 33.3%) 0.0% # GNU-HASH-NEXT: 1 1 ( 33.3%) 25.0% # GNU-HASH-NEXT: 2 0 ( 0.0%) 25.0% # GNU-HASH-NEXT: 3 1 ( 33.3%) 100.0% --- !ELF FileHeader: Class: ELFCLASS32 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_386 Sections: - Name: .gnu.hash Type: SHT_GNU_HASH Flags: [ SHF_ALLOC ] Header: SymNdx: 0x1 Shift2: 0x0 BloomFilter: [ 0x0 ] HashBuckets: [ 0x00000001, 0x00000004, 0x00000000 ] HashValues: [ 0x0B887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9 ] - Name: .dynamic Type: SHT_DYNAMIC Flags: [ SHF_WRITE, SHF_ALLOC ] Entries: - Tag: DT_GNU_HASH Value: 0x0 - Tag: DT_NULL Value: 0x0 DynamicSymbols: - Name: a - Name: b - Name: c - Name: d ProgramHeaders: - Type: PT_LOAD Sections: - Section: .gnu.hash - Section: .dynamic --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_DYN Machine: EM_X86_64 Sections: - Name: .gnu.hash Type: SHT_GNU_HASH Flags: [ SHF_ALLOC ] Header: SymNdx: 0x1 Shift2: 0x0 BloomFilter: [ 0x0 ] HashBuckets: [ 0x00000001, 0x00000004, 0x00000000 ] HashValues: [ 0x0B887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9 ] - Name: .dynamic Type: SHT_DYNAMIC Flags: [ SHF_WRITE, SHF_ALLOC ] Entries: - Tag: DT_GNU_HASH Value: 0x0 - Tag: DT_NULL Value: 0x0 DynamicSymbols: - Name: a - Name: b - Name: c - Name: d ProgramHeaders: - Type: PT_LOAD Sections: - Section: .gnu.hash - 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=3 %s -o %t2.o # RUN: llvm-readelf --elf-hash-histogram 2>&1 %t2.o | FileCheck -DFILE=%t2.o %s --check-prefix=BROKEN # BROKEN: warning: '[[FILE]]': .hash section is invalid: bucket 1: a cycle was detected in the linked chain # BROKEN: Histogram for bucket list length (total of 1 buckets) # BROKEN-NEXT: Length Number % of total Coverage # BROKEN-NEXT: 0 0 ( 0.0%) 0.0% # BROKEN-NEXT: 1 1 (100.0%) 100.0% --- !ELF FileHeader: Class: ELFCLASS32 Data: ELFDATA2LSB Type: ET_REL Machine: EM_386 Sections: - Name: .hash Type: SHT_HASH Link: .dynsym Bucket: [ 1 ] Chain: [ 0, 1 ] - Name: .dynamic Type: SHT_DYNAMIC Flags: [ SHF_ALLOC ] 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 - Tag: DT_NULL Value: 0 DynamicSymbols: - Name: foo ProgramHeaders: - Type: PT_LOAD Sections: - Section: .hash - Section: .dynamic