Index: test/tools/llvm-readobj/elf-hash-symbols.test =================================================================== --- /dev/null +++ test/tools/llvm-readobj/elf-hash-symbols.test @@ -0,0 +1,283 @@ +## 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.o +# RUN: llvm-readelf --hash-symbols %t1-32.o \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix HASH-I386 + +# HASH-I386: Symbol table of .hash for image: +# HASH-I386-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# HASH-I386-NEXT: 1 0: 00000000 0 NOTYPE GLOBAL DEFAULT UND ccc +# HASH-I386-NEXT: 5 0: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb +# HASH-I386-NEXT: 3 0: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# HASH-I386-NEXT: 2 0: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa +# HASH-I386-NEXT: 4 0: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee +# HASH-I386-EMPTY: +# HASH-I386: Symbol table of .gnu.hash for image: +# HASH-I386-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# HASH-I386-NEXT: 2 1: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa +# HASH-I386-NEXT: 3 1: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# HASH-I386-NEXT: 4 2: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee +# HASH-I386-NEXT: 5 2: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb +# HASH-I386-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_WRITE, 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 + +## Check the output when only .hash section is present. + +# RUN: yaml2obj --docnum=2 %s -o %t2-32.o +# RUN: llvm-readelf --hash-symbols %t2-32.o \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-HASH-I386 + +# ONLY-HASH-I386: Symbol table of .hash for image: +# ONLY-HASH-I386-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# ONLY-HASH-I386-NEXT: 1 0: 00000000 0 NOTYPE GLOBAL DEFAULT UND ccc +# ONLY-HASH-I386-NEXT: 5 0: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb +# ONLY-HASH-I386-NEXT: 3 0: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# ONLY-HASH-I386-NEXT: 2 0: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa +# ONLY-HASH-I386-NEXT: 4 0: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee +# ONLY-HASH-I386-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_WRITE, 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=3 %s -o %t3-32.o +# RUN: llvm-readelf --hash-symbols %t3-32.o \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-GNUHASH-I386 + +# ONLY-GNUHASH-I386: Symbol table of .gnu.hash for image: +# ONLY-GNUHASH-I386-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# ONLY-GNUHASH-I386-NEXT: 2 1: 00001000 0 NOTYPE GLOBAL DEFAULT 2 aaa +# ONLY-GNUHASH-I386-NEXT: 3 1: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# ONLY-GNUHASH-I386-NEXT: 4 2: 00000000 0 NOTYPE GLOBAL DEFAULT 1 eee +# ONLY-GNUHASH-I386-NEXT: 5 2: 00001001 0 NOTYPE WEAK DEFAULT 2 bbb +# ONLY-GNUHASH-I386-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_WRITE, 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=4 %s -o %t4.o +# RUN: llvm-readelf --hash-symbols %t4.o \ +# 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.o | 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 Index: test/tools/llvm-readobj/gnu-hash-symbols.test =================================================================== --- test/tools/llvm-readobj/gnu-hash-symbols.test +++ /dev/null @@ -1,104 +0,0 @@ -# RUN: llvm-readelf --hash-symbols %p/Inputs/dynamic-table-exe.x86 \ -# RUN: | FileCheck %s --check-prefix HASH - -# HASH: Symbol table of .hash for image: -# HASH-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name -# HASH-NEXT: 9 0: 00000000 0 FUNC GLOBAL DEFAULT UND __gxx_personality_v0@CXXABI_1.3 -# HASH-NEXT: 13 0: 00001b64 0 NOTYPE GLOBAL DEFAULT ABS _edata{{$}} -# HASH-NEXT: 7 0: 00000000 0 FUNC GLOBAL DEFAULT UND _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@GLIBCXX_3.4 -# HASH-NEXT: 2 0: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses{{$}} -# HASH-NEXT: 1 0: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__{{$}} -# HASH-NEXT: 16 1: 00000850 81 FUNC GLOBAL DEFAULT 14 main{{$}} -# HASH-NEXT: 10 1: 00000000 0 FUNC GLOBAL DEFAULT UND _Unwind_Resume@GCC_3.0 -# HASH-NEXT: 8 1: 00000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.0 -# HASH-NEXT: 12 1: 00001b68 0 NOTYPE GLOBAL DEFAULT ABS _end{{$}} -# HASH-NEXT: 6 1: 00000000 0 FUNC GLOBAL DEFAULT UND _ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 -# HASH-NEXT: 5 1: 00000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable{{$}} -# HASH-NEXT: 4 1: 00000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable{{$}} -# HASH-NEXT: 3 1: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.0 -# HASH-NEXT: 11 2: 00000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.1.3 -# HASH-NEXT: 15 2: 00001b64 0 NOTYPE GLOBAL DEFAULT ABS __bss_start{{$}} -# HASH-NEXT: 14 2: 0000093c 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used{{$}} -# HASH: Symbol table of .gnu.hash for image: -# HASH-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name -# HASH-NEXT: 12 0: 00001b68 0 NOTYPE GLOBAL DEFAULT ABS _end{{$}} -# HASH-NEXT: 13 0: 00001b64 0 NOTYPE GLOBAL DEFAULT ABS _edata{{$}} -# HASH-NEXT: 14 1: 0000093c 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used{{$}} -# HASH-NEXT: 15 1: 00001b64 0 NOTYPE GLOBAL DEFAULT ABS __bss_start{{$}} -# HASH-NEXT: 16 1: 00000850 81 FUNC GLOBAL DEFAULT 14 main{{$}} - -## Show that if there are no hash sections, we do not print anything. -# RUN: yaml2obj %s -o %t.o -# RUN: llvm-readelf --hash-symbols %t.o \ -# 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 %t.o | 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