## Test handling of a dynamic section size which is not a multiple of its entry size. ## Test the full output to demonstrate how we print the warnings. # RUN: yaml2obj %s --docnum=1 -o %t.bad-size # RUN: llvm-readobj --all %t.bad-size 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.bad-size --implicit-check-not=warning --check-prefix WARN # RUN: llvm-readelf --all %t.bad-size 2>&1 \ # RUN: | FileCheck %s -DFILE=%t.bad-size --implicit-check-not=warning --check-prefix WARN-GNU # WARN: warning: '[[FILE]]': invalid section size (4) or entity size (16) # WARN: warning: '[[FILE]]': invalid section size (4) or entity size (16) # WARN: warning: '[[FILE]]': no valid dynamic table was found # WARN-EMPTY: # WARN: File: # WARN: Symbols [ # WARN: ] # WARN: ProgramHeaders [ # WARN-GNU: warning: '[[FILE]]': invalid section size (4) or entity size (16) # WARN-GNU: warning: '[[FILE]]': invalid section size (4) or entity size (16) # WARN-GNU: warning: '[[FILE]]': no valid dynamic table was found # WARN-GNU-NEXT: ELF Header: # WARN-GNU: Symbol table '.symtab' contains 1 entries: # WARN-GNU: 0: --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Machine: EM_X86_64 Sections: - Name: .dynamic Type: SHT_DYNAMIC Address: 0x1000 Content: "01234567" Symbols: [] ProgramHeaders: - Type: PT_LOAD VAddr: 0x1000 Sections: - Section: .dynamic - Type: PT_DYNAMIC VAddr: 0x1000 Sections: - Section: .dynamic ## Test handling of a .dynamic section with an invalid entsize (i.e. not 2 * sizeof(Elf_Dyn)). # RUN: yaml2obj %s --docnum=2 -o %t.bad-entsize # RUN: llvm-readobj --dynamic-table %t.bad-entsize | FileCheck %s --check-prefix BAD-ENTSIZE-LLVM # RUN: llvm-readelf --dynamic-table %t.bad-entsize | FileCheck %s --check-prefix BAD-ENTSIZE-GNU # BAD-ENTSIZE-LLVM: DynamicSection [ (2 entries) # BAD-ENTSIZE-LLVM-NEXT: Tag Type Name/Value # BAD-ENTSIZE-LLVM-NEXT: 0x0000000000000015 DEBUG 0x0 # BAD-ENTSIZE-LLVM-NEXT: 0x0000000000000000 NULL 0x0 # BAD-ENTSIZE-LLVM-NEXT: ] # BAD-ENTSIZE-GNU: Dynamic section at offset 0x{{.*}} contains 2 entries: # BAD-ENTSIZE-GNU-NEXT: Tag Type Name/Value # BAD-ENTSIZE-GNU-NEXT: 0x0000000000000015 (DEBUG) 0x0 # BAD-ENTSIZE-GNU-NEXT: 0x0000000000000000 (NULL) 0x0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Machine: EM_X86_64 Sections: - Name: .dynamic Type: SHT_DYNAMIC Address: 0x1000 EntSize: 0x2 Entries: - Tag: DT_DEBUG Value: 0 - Tag: DT_NULL Value: 0 Symbols: [] ProgramHeaders: - Type: PT_LOAD VAddr: 0x1000 Sections: - Section: .dynamic - Type: PT_DYNAMIC VAddr: 0x1000 Sections: - Section: .dynamic ## Test handling of string references pointing past the end of the dynamic string table. # RUN: yaml2obj %s --docnum=3 -o %t.bad-string # RUN: llvm-readobj --dynamic-table %t.bad-string | FileCheck %s --check-prefix BAD-STRING-LLVM # RUN: llvm-readelf --dynamic-table %t.bad-string | FileCheck %s --check-prefix BAD-STRING-GNU # BAD-STRING-LLVM: 0x000000000000000A STRSZ 1 (bytes) # BAD-STRING-LLVM: 0x0000000000000001 NEEDED Shared library: [] # BAD-STRING-LLVM: 0x000000007FFFFFFF FILTER Filter library: [] # BAD-STRING-LLVM: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [] # BAD-STRING-LLVM: 0x000000007FFFFFFE USED Not needed object: [] # BAD-STRING-LLVM: 0x000000000000000E SONAME Library soname: [] # BAD-STRING-LLVM: 0x000000000000000F RPATH Library rpath: [] # BAD-STRING-LLVM: 0x000000000000001D RUNPATH Library runpath: [] # BAD-STRING-GNU: 0x000000000000000a (STRSZ) 1 (bytes) # BAD-STRING-GNU: 0x0000000000000001 (NEEDED) Shared library: [] # BAD-STRING-GNU: 0x000000007fffffff (FILTER) Filter library: [] # BAD-STRING-GNU: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [] # BAD-STRING-GNU: 0x000000007ffffffe (USED) Not needed object: [] # BAD-STRING-GNU: 0x000000000000000e (SONAME) Library soname: [] # BAD-STRING-GNU: 0x000000000000000f (RPATH) Library rpath: [] # BAD-STRING-GNU: 0x000000000000001d (RUNPATH) Library runpath: [] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Machine: EM_X86_64 Sections: - Name: .dynstr Type: SHT_STRTAB Address: 0x1000 - Name: .dynamic Type: SHT_DYNAMIC Address: 0x1010 Entries: - Tag: DT_STRTAB Value: 0x1000 - Tag: DT_STRSZ Value: 1 - Tag: DT_NEEDED Value: 1 - Tag: DT_FILTER Value: 1 - Tag: DT_AUXILIARY Value: 1 - Tag: DT_USED Value: 1 - Tag: DT_SONAME Value: 1 - Tag: DT_RPATH Value: 1 - Tag: DT_RUNPATH Value: 1 - Tag: DT_NULL Value: 0 Symbols: [] ProgramHeaders: - Type: PT_LOAD VAddr: 0x1000 Sections: - Section: .dynstr - Section: .dynamic - Type: PT_DYNAMIC VAddr: 0x1010 Sections: - Section: .dynamic ## Test handling of DT_STRTAB pointing outside the file's address space. # RUN: yaml2obj %s --docnum=4 -o %t.bad-strtab # RUN: llvm-readobj --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck -DFILE=%t.bad-strtab %s --check-prefix BAD-STRTAB-ERR # RUN: llvm-readelf --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck -DFILE=%t.bad-strtab %s --check-prefix BAD-STRTAB-ERR # BAD-STRTAB-ERR: warning: '[[FILE]]': Unable to parse DT_STRTAB: virtual address is not in any segment: 0x2000000 # RUN: llvm-readobj --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-LLVM # RUN: llvm-readelf --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-GNU # BAD-STRTAB-LLVM: LoadName: # BAD-STRTAB-LLVM: 0x0000000000000001 NEEDED Shared library: [] # BAD-STRTAB-GNU: 0x0000000000000001 (NEEDED) Shared library: [] # BAD-STRTAB: NeededLibraries [ # BAD-STRTAB: # BAD-STRTAB: ] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Machine: EM_X86_64 Sections: - Name: .dynamic Type: SHT_DYNAMIC Address: 0x1000 Entries: - Tag: DT_STRTAB Value: 0x2000000 - Tag: DT_STRSZ Value: 10 - Tag: DT_NEEDED Value: 1 - Tag: DT_NULL Value: 0x0 Symbols: [] ProgramHeaders: - Type: PT_LOAD VAddr: 0x1000 Sections: - Section: .dynamic - Type: PT_DYNAMIC VAddr: 0x1000 Sections: - Section: .dynamic ## Test handling of other d_ptr tags pointing outside the file's address space. # RUN: yaml2obj %s --docnum=5 -o %t.bad-rela # RUN: llvm-readobj --dynamic-table %t.bad-rela 2>&1 | FileCheck -DFILE=%t.bad-rela %s --check-prefixes=CHECK,BAD-RELA # RUN: llvm-readelf --dynamic-table %t.bad-rela 2>&1 | FileCheck -DFILE=%t.bad-rela %s --check-prefixes=CHECK,BAD-RELA-GNU # CHECK: warning: '[[FILE]]': Unable to parse DT_RELA: virtual address is not in any segment: 0x1000000 # BAD-RELA: DynamicSection [ (2 entries) # BAD-RELA-NEXT: Tag Type Name/Value # BAD-RELA-NEXT: 0x0000000000000007 RELA 0x1000000 # BAD-RELA-NEXT: 0x0000000000000000 NULL 0x0 # BAD-RELA-NEXT: ] # BAD-RELA-GNU: Dynamic section at offset 0xb0 contains 2 entries: # BAD-RELA-GNU-NEXT: Tag Type Name/Value # BAD-RELA-GNU-NEXT: 0x0000000000000007 (RELA) 0x1000000 # BAD-RELA-GNU-NEXT: 0x0000000000000000 (NULL) 0x0 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_EXEC Machine: EM_X86_64 Sections: - Name: .dynamic Type: SHT_DYNAMIC Address: 0x1000 Entries: - Tag: DT_RELA Value: 0x1000000 - Tag: DT_NULL Value: 0x0 Symbols: [] ProgramHeaders: - Type: PT_LOAD VAddr: 0x1000 Sections: - Section: .dynamic - Type: PT_DYNAMIC VAddr: 0x1000 Sections: - Section: .dynamic