diff options
Diffstat (limited to 'llvm/test/tools/llvm-readobj/ELF')
181 files changed, 14714 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-note-gnu-property.s b/llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-note-gnu-property.s new file mode 100644 index 00000000000..693b6c93f35 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-note-gnu-property.s @@ -0,0 +1,38 @@ +// RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu %s -o %t +// RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU +// RUN: llvm-readobj --notes %t | FileCheck %s --check-prefix=LLVM + +// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000020: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 (property note) +// GNU-NEXT: Properties: aarch64 feature: BTI, PAC + +// LLVM: Notes [ +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x40 +// LLVM-NEXT: Size: 0x20 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: GNU +// LLVM-NEXT: Data size: 0x10 +// LLVM-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note) +// LLVM-NEXT: Property [ +// LLVM-NEXT: aarch64 feature: BTI, PAC +// LLVM-NEXT: ] +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: ] + +.section ".note.gnu.property", "a" +.align 4 + .long 4 /* Name length is always 4 ("GNU") */ + .long end - begin /* Data length */ + .long 5 /* Type: NT_GNU_PROPERTY_TYPE_0 */ + .asciz "GNU" /* Name */ + .p2align 3 +begin: + /* BTI and PAC property note */ + .long 0xc0000000 /* Type: GNU_PROPERTY_AARCH64_FEATURE_1_AND */ + .long 4 /* Data size */ + .long 3 /* BTI and PAC */ + .p2align 3 /* Align to 8 byte for 64 bit */ +end: diff --git a/llvm/test/tools/llvm-readobj/ELF/AArch64/dwarf-cfi.s b/llvm/test/tools/llvm-readobj/ELF/AArch64/dwarf-cfi.s new file mode 100644 index 00000000000..f1295467876 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/AArch64/dwarf-cfi.s @@ -0,0 +1,25 @@ +# RUN: llvm-mc -triple arm64-linux -filetype obj -o - %s | llvm-readobj -u | FileCheck %s + +# CHECK: [0x0] CIE length=16 +# CHECK-NEXT: version: 1 +# CHECK-NEXT: augmentation: zR +# CHECK-NEXT: code_alignment_factor: 1 +# CHECK-NEXT: data_alignment_factor: -4 +# CHECK-NEXT: return_address_register: 30 + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_def_cfa: reg31 +0 + +# CHECK: [0x14] FDE length=16 cie=[0x0] +# CHECK-NEXT: initial_location: 0x0 +# CHECK-NEXT: address_range: 0x4 (end : 0x4) + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +foo: +.cfi_startproc +ret +.cfi_endproc diff --git a/llvm/test/tools/llvm-readobj/ELF/AArch64/lit.local.cfg b/llvm/test/tools/llvm-readobj/ELF/AArch64/lit.local.cfg new file mode 100644 index 00000000000..7184443994b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/AArch64/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'AArch64' in config.root.targets: + config.unsupported = True diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-0.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-0.s new file mode 100644 index 00000000000..dfee5411256 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-0.s @@ -0,0 +1,241 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 0 +@CHECK: .eabi_attribute 6, 0 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: Pre-v4 + +.eabi_attribute Tag_CPU_arch_profile, 0 +@CHECK: .eabi_attribute 7, 0 +@CHECK-OBJ: Tag: 7 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: CPU_arch_profile +@CHECK-OBJ-NEXT: Description: None + +.eabi_attribute Tag_ARM_ISA_use, 0 +@CHECK: .eabi_attribute 8, 0 +@CHECK-OBJ: Tag: 8 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ARM_ISA_use +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_THUMB_ISA_use, 0 +@CHECK: .eabi_attribute 9, 0 +@CHECK-OBJ: Tag: 9 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: THUMB_ISA_use +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_FP_arch, 0 +@CHECK: .eabi_attribute 10, 0 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_WMMX_arch, 0 +@CHECK: .eabi_attribute 11, 0 +@CHECK-OBJ: Tag: 11 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: WMMX_arch +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_Advanced_SIMD_arch, 0 +@CHECK: .eabi_attribute 12, 0 +@CHECK-OBJ: Tag: 12 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_PCS_config, 0 +@CHECK: .eabi_attribute 13, 0 +@CHECK-OBJ: Tag: 13 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: PCS_config +@CHECK-OBJ-NEXT: Description: None + +.eabi_attribute Tag_ABI_PCS_R9_use, 0 +@CHECK: .eabi_attribute 14, 0 +@CHECK-OBJ: Tag: 14 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_R9_use +@CHECK-OBJ-NEXT: Description: v6 + +.eabi_attribute Tag_ABI_PCS_RW_data, 0 +@CHECK: .eabi_attribute 15, 0 +@CHECK-OBJ: Tag: 15 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_RW_data +@CHECK-OBJ-NEXT: Description: Absolute + +.eabi_attribute Tag_ABI_PCS_RO_data, 0 +@CHECK: .eabi_attribute 16, 0 +@CHECK-OBJ: Tag: 16 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_RO_data +@CHECK-OBJ-NEXT: Description: Absolute + +.eabi_attribute Tag_ABI_PCS_GOT_use, 0 +@CHECK: .eabi_attribute 17, 0 +@CHECK-OBJ: Tag: 17 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_GOT_use +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_PCS_wchar_t, 0 +@CHECK: .eabi_attribute 18, 0 +@CHECK-OBJ: Tag: 18 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_wchar_t +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_FP_rounding, 0 +@CHECK: .eabi_attribute 19, 0 +@CHECK-OBJ: Tag: 19 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_FP_rounding +@CHECK-OBJ-NEXT: Description: IEEE-754 + +.eabi_attribute Tag_ABI_FP_denormal, 0 +@CHECK: .eabi_attribute 20, 0 +@CHECK-OBJ: Tag: 20 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_FP_denormal +@CHECK-OBJ-NEXT: Description: Unsupported + +.eabi_attribute Tag_ABI_FP_exceptions, 0 +@CHECK: .eabi_attribute 21, 0 +@CHECK-OBJ: Tag: 21 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_FP_exceptions +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_FP_user_exceptions, 0 +@CHECK: .eabi_attribute 22, 0 +@CHECK-OBJ: Tag: 22 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_FP_user_exceptions +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_FP_number_model, 0 +@CHECK: .eabi_attribute 23, 0 +@CHECK-OBJ: Tag: 23 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_FP_number_model +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_align_needed, 0 +@CHECK: .eabi_attribute 24, 0 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_align_preserved, 0 +@CHECK: .eabi_attribute 25, 0 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: Not Required + +.eabi_attribute Tag_ABI_enum_size, 0 +@CHECK: .eabi_attribute 26, 0 +@CHECK-OBJ: Tag: 26 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_enum_size +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_HardFP_use, 0 +@CHECK: .eabi_attribute 27, 0 +@CHECK-OBJ: Tag: 27 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_HardFP_use +@CHECK-OBJ-NEXT: Description: Tag_FP_arch + +.eabi_attribute Tag_ABI_VFP_args, 0 +@CHECK: .eabi_attribute 28, 0 +@CHECK-OBJ: Tag: 28 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_VFP_args +@CHECK-OBJ-NEXT: Description: AAPCS + +.eabi_attribute Tag_ABI_WMMX_args, 0 +@CHECK: .eabi_attribute 29, 0 +@CHECK-OBJ: Tag: 29 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_WMMX_args +@CHECK-OBJ-NEXT: Description: AAPCS + +.eabi_attribute Tag_ABI_optimization_goals, 0 +@CHECK: .eabi_attribute 30, 0 +@CHECK-OBJ: Tag: 30 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals +@CHECK-OBJ-NEXT: Description: None + +.eabi_attribute Tag_ABI_FP_optimization_goals, 0 +@CHECK: .eabi_attribute 31, 0 +@CHECK-OBJ: Tag: 31 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals +@CHECK-OBJ-NEXT: Description: None + +.eabi_attribute Tag_compatibility, 0, "ARM" +@CHECK: .eabi_attribute 32, 0 +@CHECK-OBJ: Tag: 32 +@CHECK-OBJ-NEXT: Value: 0, ARM +@CHECK-OBJ-NEXT: TagName: compatibility +@CHECK-OBJ-NEXT: Description: No Specific Requirements + +.eabi_attribute Tag_CPU_unaligned_access, 0 +@CHECK: .eabi_attribute 34, 0 +@CHECK-OBJ: Tag: 34 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: CPU_unaligned_access +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_FP_HP_extension, 0 +@CHECK: .eabi_attribute 36, 0 +@CHECK-OBJ: Tag: 36 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: FP_HP_extension +@CHECK-OBJ-NEXT: Description: If Available + +.eabi_attribute Tag_ABI_FP_16bit_format, 0 +@CHECK: .eabi_attribute 38, 0 +@CHECK-OBJ: Tag: 38 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: ABI_FP_16bit_format +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_MPextension_use, 0 +@CHECK: .eabi_attribute 42, 0 +@CHECK-OBJ: Tag: 42 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: MPextension_use +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_DIV_use, 0 +@CHECK: .eabi_attribute 44, 0 +@CHECK-OBJ: Tag: 44 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: DIV_use +@CHECK-OBJ-NEXT: Description: If Available + +.eabi_attribute Tag_DSP_extension, 0 +@CHECK: .eabi_attribute 46, 0 +@CHECK-OBJ: Tag: 46 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: DSP_extension +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_Virtualization_use, 0 +@CHECK: .eabi_attribute 68, 0 +@CHECK-OBJ: Tag: 68 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: Virtualization_use +@CHECK-OBJ-NEXT: Description: Not Permitted + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-1.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-1.s new file mode 100644 index 00000000000..d7cc1aaf120 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-1.s @@ -0,0 +1,227 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 1 +@CHECK: .eabi_attribute 6, 1 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v4 + +.eabi_attribute Tag_ARM_ISA_use, 1 +@CHECK: .eabi_attribute 8, 1 +@CHECK-OBJ: Tag: 8 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ARM_ISA_use +@CHECK-OBJ-NEXT: Description: Permitted + +.eabi_attribute Tag_THUMB_ISA_use, 1 +@CHECK: .eabi_attribute 9, 1 +@CHECK-OBJ: Tag: 9 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: THUMB_ISA_use +@CHECK-OBJ-NEXT: Description: Thumb-1 + +.eabi_attribute Tag_FP_arch, 1 +@CHECK: .eabi_attribute 10, 1 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: VFPv1 + +.eabi_attribute Tag_WMMX_arch, 1 +@CHECK: .eabi_attribute 11, 1 +@CHECK-OBJ: Tag: 11 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: WMMX_arch +@CHECK-OBJ-NEXT: Description: WMMXv1 + +.eabi_attribute Tag_Advanced_SIMD_arch, 1 +@CHECK: .eabi_attribute 12, 1 +@CHECK-OBJ: Tag: 12 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch +@CHECK-OBJ-NEXT: Description: NEONv1 + +.eabi_attribute Tag_PCS_config, 1 +@CHECK: .eabi_attribute 13, 1 +@CHECK-OBJ: Tag: 13 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: PCS_config +@CHECK-OBJ-NEXT: Description: Bare Platform + +.eabi_attribute Tag_ABI_PCS_R9_use, 1 +@CHECK: .eabi_attribute 14, 1 +@CHECK-OBJ: Tag: 14 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_R9_use +@CHECK-OBJ-NEXT: Description: Static Base + +.eabi_attribute Tag_ABI_PCS_RW_data, 1 +@CHECK: .eabi_attribute 15, 1 +@CHECK-OBJ: Tag: 15 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_RW_data +@CHECK-OBJ-NEXT: Description: PC-relative + +.eabi_attribute Tag_ABI_PCS_RO_data, 1 +@CHECK: .eabi_attribute 16, 1 +@CHECK-OBJ: Tag: 16 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_RO_data +@CHECK-OBJ-NEXT: Description: PC-relative + +.eabi_attribute Tag_ABI_PCS_GOT_use, 1 +@CHECK: .eabi_attribute 17, 1 +@CHECK-OBJ: Tag: 17 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_GOT_use +@CHECK-OBJ-NEXT: Description: Direct + +.eabi_attribute Tag_ABI_FP_rounding, 1 +@CHECK: .eabi_attribute 19, 1 +@CHECK-OBJ: Tag: 19 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_FP_rounding +@CHECK-OBJ-NEXT: Description: Runtime + +.eabi_attribute Tag_ABI_FP_denormal, 1 +@CHECK: .eabi_attribute 20, 1 +@CHECK-OBJ: Tag: 20 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_FP_denormal +@CHECK-OBJ-NEXT: Description: IEEE-754 + +.eabi_attribute Tag_ABI_FP_exceptions, 1 +@CHECK: .eabi_attribute 21, 1 +@CHECK-OBJ: Tag: 21 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_FP_exceptions +@CHECK-OBJ-NEXT: Description: IEEE-754 + +.eabi_attribute Tag_ABI_FP_user_exceptions, 1 +@CHECK: .eabi_attribute 22, 1 +@CHECK-OBJ: Tag: 22 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_FP_user_exceptions +@CHECK-OBJ-NEXT: Description: IEEE-754 + +.eabi_attribute Tag_ABI_FP_number_model, 1 +@CHECK: .eabi_attribute 23, 1 +@CHECK-OBJ: Tag: 23 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_FP_number_model +@CHECK-OBJ-NEXT: Description: Finite Only + +.eabi_attribute Tag_ABI_align_needed, 1 +@CHECK: .eabi_attribute 24, 1 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment + +.eabi_attribute Tag_ABI_align_preserved, 1 +@CHECK: .eabi_attribute 25, 1 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte data alignment + +.eabi_attribute Tag_ABI_enum_size, 1 +@CHECK: .eabi_attribute 26, 1 +@CHECK-OBJ: Tag: 26 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_enum_size +@CHECK-OBJ-NEXT: Description: Packed + +.eabi_attribute Tag_ABI_HardFP_use, 1 +@CHECK: .eabi_attribute 27, 1 +@CHECK-OBJ: Tag: 27 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_HardFP_use +@CHECK-OBJ-NEXT: Description: Single-Precision + +.eabi_attribute Tag_ABI_VFP_args, 1 +@CHECK: .eabi_attribute 28, 1 +@CHECK-OBJ: Tag: 28 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_VFP_args +@CHECK-OBJ-NEXT: Description: AAPCS VFP + +.eabi_attribute Tag_ABI_WMMX_args, 1 +@CHECK: .eabi_attribute 29, 1 +@CHECK-OBJ: Tag: 29 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_WMMX_args +@CHECK-OBJ-NEXT: Description: iWMMX + +.eabi_attribute Tag_ABI_optimization_goals, 1 +@CHECK: .eabi_attribute 30, 1 +@CHECK-OBJ: Tag: 30 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals +@CHECK-OBJ-NEXT: Description: Speed + +.eabi_attribute Tag_ABI_FP_optimization_goals, 1 +@CHECK: .eabi_attribute 31, 1 +@CHECK-OBJ: Tag: 31 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals +@CHECK-OBJ-NEXT: Description: Speed + +.eabi_attribute Tag_compatibility, 1, "" +@CHECK: .eabi_attribute 32, 1 +@CHECK-OBJ: Tag: 32 +@CHECK-OBJ-NEXT: Value: 1, +@CHECK-OBJ-NEXT: TagName: compatibility +@CHECK-OBJ-NEXT: Description: AEABI Conformant + +.eabi_attribute Tag_CPU_unaligned_access, 1 +@CHECK: .eabi_attribute 34, 1 +@CHECK-OBJ: Tag: 34 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: CPU_unaligned_access +@CHECK-OBJ-NEXT: Description: v6-style + +.eabi_attribute Tag_FP_HP_extension, 1 +@CHECK: .eabi_attribute 36, 1 +@CHECK-OBJ: Tag: 36 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: FP_HP_extension +@CHECK-OBJ-NEXT: Description: Permitted + +.eabi_attribute Tag_ABI_FP_16bit_format, 1 +@CHECK: .eabi_attribute 38, 1 +@CHECK-OBJ: Tag: 38 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: ABI_FP_16bit_format +@CHECK-OBJ-NEXT: Description: IEEE-754 + +.eabi_attribute Tag_MPextension_use, 1 +@CHECK: .eabi_attribute 42, 1 +@CHECK-OBJ: Tag: 42 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: MPextension_use +@CHECK-OBJ-NEXT: Description: Permitted + +.eabi_attribute Tag_DIV_use, 1 +@CHECK: .eabi_attribute 44, 1 +@CHECK-OBJ: Tag: 44 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: DIV_use +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_DSP_extension, 1 +@CHECK: .eabi_attribute 46, 1 +@CHECK-OBJ: Tag: 46 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: DSP_extension +@CHECK-OBJ-NEXT: Description: Permitted + +.eabi_attribute Tag_Virtualization_use, 1 +@CHECK: .eabi_attribute 68, 1 +@CHECK-OBJ: Tag: 68 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: Virtualization_use +@CHECK-OBJ-NEXT: Description: TrustZone + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-10.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-10.s new file mode 100644 index 00000000000..1c62fee75ad --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-10.s @@ -0,0 +1,24 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 10 +@CHECK: .eabi_attribute 6, 10 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 10 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v7 + +.eabi_attribute Tag_ABI_align_needed, 10 +@CHECK: .eabi_attribute 24, 10 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 10 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 1024-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 10 +@CHECK: .eabi_attribute 25, 10 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 10 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 1024-byte data alignment + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-11.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-11.s new file mode 100644 index 00000000000..04a2e41065d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-11.s @@ -0,0 +1,24 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 11 +@CHECK: .eabi_attribute 6, 11 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 11 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v6-M + +.eabi_attribute Tag_ABI_align_needed, 11 +@CHECK: .eabi_attribute 24, 11 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 11 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 2048-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 11 +@CHECK: .eabi_attribute 25, 11 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 11 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 2048-byte data alignment + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-12.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-12.s new file mode 100644 index 00000000000..e36ed9b6521 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-12.s @@ -0,0 +1,24 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 12 +@CHECK: .eabi_attribute 6, 12 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 12 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v6S-M + +.eabi_attribute Tag_ABI_align_needed, 12 +@CHECK: .eabi_attribute 24, 12 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 12 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 4096-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 12 +@CHECK: .eabi_attribute 25, 12 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 12 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 4096-byte data alignment + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-13.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-13.s new file mode 100644 index 00000000000..407995c01a5 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-13.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 13 +@CHECK: .eabi_attribute 6, 13 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 13 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v7E-M + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-136.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-136.s new file mode 100644 index 00000000000..674970a654e --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-136.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_compatibility, 136, "Foo Corp" +@CHECK: .eabi_attribute 32, 136 +@CHECK-OBJ: Tag: 32 +@CHECK-OBJ-NEXT: Value: 136, Foo Corp +@CHECK-OBJ-NEXT: TagName: compatibility +@CHECK-OBJ-NEXT: Description: AEABI Non-Conformant + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-14.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-14.s new file mode 100644 index 00000000000..c15a5cd535f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-14.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 14 +@CHECK: .eabi_attribute 6, 14 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 14 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v8 + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-15.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-15.s new file mode 100644 index 00000000000..1fd1869c9c7 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-15.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_compatibility, 15, "Longer Corporation NaMe" +@CHECK: .eabi_attribute 32, 15 +@CHECK-OBJ: Tag: 32 +@CHECK-OBJ-NEXT: Value: 15, Longer Corporation NaMe +@CHECK-OBJ-NEXT: TagName: compatibility +@CHECK-OBJ-NEXT: Description: AEABI Non-Conformant + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-2.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-2.s new file mode 100644 index 00000000000..33aeca8a1a7 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-2.s @@ -0,0 +1,178 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 2 +@CHECK: .eabi_attribute 6, 2 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v4T + +.eabi_attribute Tag_THUMB_ISA_use, 2 +@CHECK: .eabi_attribute 9, 2 +@CHECK-OBJ: Tag: 9 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: THUMB_ISA_use +@CHECK-OBJ-NEXT: Description: Thumb-2 + +.eabi_attribute Tag_FP_arch, 2 +@CHECK: .eabi_attribute 10, 2 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: VFPv2 + +.eabi_attribute Tag_WMMX_arch, 2 +@CHECK: .eabi_attribute 11, 2 +@CHECK-OBJ: Tag: 11 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: WMMX_arch +@CHECK-OBJ-NEXT: Description: WMMXv2 + +.eabi_attribute Tag_Advanced_SIMD_arch, 2 +@CHECK: .eabi_attribute 12, 2 +@CHECK-OBJ: Tag: 12 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch +@CHECK-OBJ-NEXT: Description: NEONv2+FMA + +.eabi_attribute Tag_PCS_config, 2 +@CHECK: .eabi_attribute 13, 2 +@CHECK-OBJ: Tag: 13 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: PCS_config +@CHECK-OBJ-NEXT: Description: Linux Application + +.eabi_attribute Tag_ABI_PCS_R9_use, 2 +@CHECK: .eabi_attribute 14, 2 +@CHECK-OBJ: Tag: 14 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_R9_use +@CHECK-OBJ-NEXT: Description: TLS + +.eabi_attribute Tag_ABI_PCS_RW_data, 2 +@CHECK: .eabi_attribute 15, 2 +@CHECK-OBJ: Tag: 15 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_RW_data +@CHECK-OBJ-NEXT: Description: SB-relative + +.eabi_attribute Tag_ABI_PCS_RO_data, 2 +@CHECK: .eabi_attribute 16, 2 +@CHECK-OBJ: Tag: 16 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_RO_data +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_PCS_GOT_use, 2 +@CHECK: .eabi_attribute 17, 2 +@CHECK-OBJ: Tag: 17 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_GOT_use +@CHECK-OBJ-NEXT: Description: GOT-Indirect + +.eabi_attribute Tag_ABI_PCS_wchar_t, 2 +@CHECK: .eabi_attribute 18, 2 +@CHECK-OBJ: Tag: 18 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_wchar_t +@CHECK-OBJ-NEXT: Description: 2-byte + +.eabi_attribute Tag_ABI_FP_denormal, 2 +@CHECK: .eabi_attribute 20, 2 +@CHECK-OBJ: Tag: 20 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_FP_denormal +@CHECK-OBJ-NEXT: Description: Sign Only + +.eabi_attribute Tag_ABI_FP_number_model, 2 +@CHECK: .eabi_attribute 23, 2 +@CHECK-OBJ: Tag: 23 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_FP_number_model +@CHECK-OBJ-NEXT: Description: RTABI + +.eabi_attribute Tag_ABI_align_needed, 2 +@CHECK: .eabi_attribute 24, 2 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 4-byte alignment + +.eabi_attribute Tag_ABI_align_preserved, 2 +@CHECK: .eabi_attribute 25, 2 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte data and code alignment + +.eabi_attribute Tag_ABI_enum_size, 2 +@CHECK: .eabi_attribute 26, 2 +@CHECK-OBJ: Tag: 26 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_enum_size +@CHECK-OBJ-NEXT: Description: Int32 + +.eabi_attribute Tag_ABI_HardFP_use, 2 +@CHECK: .eabi_attribute 27, 2 +@CHECK-OBJ: Tag: 27 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_HardFP_use +@CHECK-OBJ-NEXT: Description: Reserved + +.eabi_attribute Tag_ABI_VFP_args, 2 +@CHECK: .eabi_attribute 28, 2 +@CHECK-OBJ: Tag: 28 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_VFP_args +@CHECK-OBJ-NEXT: Description: Custom + +.eabi_attribute Tag_ABI_WMMX_args, 2 +@CHECK: .eabi_attribute 29, 2 +@CHECK-OBJ: Tag: 29 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_WMMX_args +@CHECK-OBJ-NEXT: Description: Custom + +.eabi_attribute Tag_ABI_optimization_goals, 2 +@CHECK: .eabi_attribute 30, 2 +@CHECK-OBJ: Tag: 30 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals +@CHECK-OBJ-NEXT: Description: Aggressive Speed + +.eabi_attribute Tag_ABI_FP_optimization_goals, 2 +@CHECK: .eabi_attribute 31, 2 +@CHECK-OBJ: Tag: 31 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals +@CHECK-OBJ-NEXT: Description: Aggressive Speed + +.eabi_attribute Tag_compatibility, 2, "" +@CHECK: .eabi_attribute 32, 2 +@CHECK-OBJ: Tag: 32 +@CHECK-OBJ-NEXT: Value: 2, +@CHECK-OBJ-NEXT: TagName: compatibility +@CHECK-OBJ-NEXT: Description: AEABI Non-Conformant + +.eabi_attribute Tag_ABI_FP_16bit_format, 2 +@CHECK: .eabi_attribute 38, 2 +@CHECK-OBJ: Tag: 38 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: ABI_FP_16bit_format +@CHECK-OBJ-NEXT: Description: VFPv3 + +.eabi_attribute Tag_DIV_use, 2 +@CHECK: .eabi_attribute 44, 2 +@CHECK-OBJ: Tag: 44 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: DIV_use +@CHECK-OBJ-NEXT: Description: Permitted + +.eabi_attribute Tag_Virtualization_use, 2 +@CHECK: .eabi_attribute 68, 2 +@CHECK-OBJ: Tag: 68 +@CHECK-OBJ-NEXT: Value: 2 +@CHECK-OBJ-NEXT: TagName: Virtualization_use +@CHECK-OBJ-NEXT: Description: Virtualization Extensions + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-3.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-3.s new file mode 100644 index 00000000000..284e6ed8295 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-3.s @@ -0,0 +1,108 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 3 +@CHECK: .eabi_attribute 6, 3 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v5T + +.eabi_attribute Tag_FP_arch, 3 +@CHECK: .eabi_attribute 10, 3 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: VFPv3 + +.eabi_attribute Tag_Advanced_SIMD_arch, 3 +@CHECK: .eabi_attribute 12, 3 +@CHECK-OBJ: Tag: 12 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch +@CHECK-OBJ-NEXT: Description: ARMv8-a NEON + +.eabi_attribute Tag_PCS_config, 3 +@CHECK: .eabi_attribute 13, 3 +@CHECK-OBJ: Tag: 13 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: PCS_config +@CHECK-OBJ-NEXT: Description: Linux DSO + +.eabi_attribute Tag_ABI_PCS_R9_use, 3 +@CHECK: .eabi_attribute 14, 3 +@CHECK-OBJ: Tag: 14 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_R9_use +@CHECK-OBJ-NEXT: Description: Unused + +.eabi_attribute Tag_ABI_PCS_RW_data, 3 +@CHECK: .eabi_attribute 15, 3 +@CHECK-OBJ: Tag: 15 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_RW_data +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_FP_number_model, 3 +@CHECK: .eabi_attribute 23, 3 +@CHECK-OBJ: Tag: 23 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_FP_number_model +@CHECK-OBJ-NEXT: Description: IEEE-754 + +.eabi_attribute Tag_ABI_align_needed, 3 +@CHECK: .eabi_attribute 24, 3 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: Reserved + +.eabi_attribute Tag_ABI_align_preserved, 3 +@CHECK: .eabi_attribute 25, 3 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: Reserved + +.eabi_attribute Tag_ABI_enum_size, 3 +@CHECK: .eabi_attribute 26, 3 +@CHECK-OBJ: Tag: 26 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_enum_size +@CHECK-OBJ-NEXT: Description: External Int32 + +.eabi_attribute Tag_ABI_HardFP_use, 3 +@CHECK: .eabi_attribute 27, 3 +@CHECK-OBJ: Tag: 27 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_HardFP_use +@CHECK-OBJ-NEXT: Description: Tag_FP_arch (deprecated) + +.eabi_attribute Tag_ABI_VFP_args, 3 +@CHECK: .eabi_attribute 28, 3 +@CHECK-OBJ: Tag: 28 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_VFP_args +@CHECK-OBJ-NEXT: Description: Not Permitted + +.eabi_attribute Tag_ABI_optimization_goals, 3 +@CHECK: .eabi_attribute 30, 3 +@CHECK-OBJ: Tag: 30 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals +@CHECK-OBJ-NEXT: Description: Size + +.eabi_attribute Tag_ABI_FP_optimization_goals, 3 +@CHECK: .eabi_attribute 31, 3 +@CHECK-OBJ: Tag: 31 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals +@CHECK-OBJ-NEXT: Description: Size + +.eabi_attribute Tag_Virtualization_use, 3 +@CHECK: .eabi_attribute 68, 3 +@CHECK-OBJ: Tag: 68 +@CHECK-OBJ-NEXT: Value: 3 +@CHECK-OBJ-NEXT: TagName: Virtualization_use +@CHECK-OBJ-NEXT: Description: TrustZone + Virtualization Extensions + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-4.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-4.s new file mode 100644 index 00000000000..5f5f2b9e9d6 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-4.s @@ -0,0 +1,66 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 4 +@CHECK: .eabi_attribute 6, 4 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v5TE + +.eabi_attribute Tag_FP_arch, 4 +@CHECK: .eabi_attribute 10, 4 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: VFPv3-D16 + +.eabi_attribute Tag_Advanced_SIMD_arch, 4 +@CHECK: .eabi_attribute 12, 4 +@CHECK-OBJ: Tag: 12 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: Advanced_SIMD_arch +@CHECK-OBJ-NEXT: Description: ARMv8.1-a NEON + +.eabi_attribute Tag_PCS_config, 4 +@CHECK: .eabi_attribute 13, 4 +@CHECK-OBJ: Tag: 13 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: PCS_config +@CHECK-OBJ-NEXT: Description: Palm OS 2004 + +.eabi_attribute Tag_ABI_PCS_wchar_t, 4 +@CHECK: .eabi_attribute 18, 4 +@CHECK-OBJ: Tag: 18 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: ABI_PCS_wchar_t +@CHECK-OBJ-NEXT: Description: 4-byte + +.eabi_attribute Tag_ABI_align_needed, 4 +@CHECK: .eabi_attribute 24, 4 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 16-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 4 +@CHECK: .eabi_attribute 25, 4 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 16-byte data alignment + +.eabi_attribute Tag_ABI_optimization_goals, 4 +@CHECK: .eabi_attribute 30, 4 +@CHECK-OBJ: Tag: 30 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals +@CHECK-OBJ-NEXT: Description: Aggressive Size + +.eabi_attribute Tag_ABI_FP_optimization_goals, 4 +@CHECK: .eabi_attribute 31, 4 +@CHECK-OBJ: Tag: 31 +@CHECK-OBJ-NEXT: Value: 4 +@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals +@CHECK-OBJ-NEXT: Description: Aggressive Size + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-5.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-5.s new file mode 100644 index 00000000000..d1d386ef978 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-5.s @@ -0,0 +1,52 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 5 +@CHECK: .eabi_attribute 6, 5 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 5 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v5TEJ + +.eabi_attribute Tag_FP_arch, 5 +@CHECK: .eabi_attribute 10, 5 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 5 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: VFPv4 + +.eabi_attribute Tag_PCS_config, 5 +@CHECK: .eabi_attribute 13, 5 +@CHECK-OBJ: Tag: 13 +@CHECK-OBJ-NEXT: Value: 5 +@CHECK-OBJ-NEXT: TagName: PCS_config +@CHECK-OBJ-NEXT: Description: Reserved (Palm OS) + +.eabi_attribute Tag_ABI_align_needed, 5 +@CHECK: .eabi_attribute 24, 5 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 5 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 32-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 5 +@CHECK: .eabi_attribute 25, 5 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 5 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 32-byte data alignment + +.eabi_attribute Tag_ABI_optimization_goals, 5 +@CHECK: .eabi_attribute 30, 5 +@CHECK-OBJ: Tag: 30 +@CHECK-OBJ-NEXT: Value: 5 +@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals +@CHECK-OBJ-NEXT: Description: Debugging + +.eabi_attribute Tag_ABI_FP_optimization_goals, 5 +@CHECK: .eabi_attribute 31, 5 +@CHECK-OBJ: Tag: 31 +@CHECK-OBJ-NEXT: Value: 5 +@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals +@CHECK-OBJ-NEXT: Description: Accuracy + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-6.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-6.s new file mode 100644 index 00000000000..63c1019a3ac --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-6.s @@ -0,0 +1,52 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 6 +@CHECK: .eabi_attribute 6, 6 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 6 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v6 + +.eabi_attribute Tag_FP_arch, 6 +@CHECK: .eabi_attribute 10, 6 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 6 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: VFPv4-D16 + +.eabi_attribute Tag_PCS_config, 6 +@CHECK: .eabi_attribute 13, 6 +@CHECK-OBJ: Tag: 13 +@CHECK-OBJ-NEXT: Value: 6 +@CHECK-OBJ-NEXT: TagName: PCS_config +@CHECK-OBJ-NEXT: Description: Symbian OS 2004 + +.eabi_attribute Tag_ABI_align_needed, 6 +@CHECK: .eabi_attribute 24, 6 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 6 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 64-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 6 +@CHECK: .eabi_attribute 25, 6 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 6 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 64-byte data alignment + +.eabi_attribute Tag_ABI_optimization_goals, 6 +@CHECK: .eabi_attribute 30, 6 +@CHECK-OBJ: Tag: 30 +@CHECK-OBJ-NEXT: Value: 6 +@CHECK-OBJ-NEXT: TagName: ABI_optimization_goals +@CHECK-OBJ-NEXT: Description: Best Debugging + +.eabi_attribute Tag_ABI_FP_optimization_goals, 6 +@CHECK: .eabi_attribute 31, 6 +@CHECK-OBJ: Tag: 31 +@CHECK-OBJ-NEXT: Value: 6 +@CHECK-OBJ-NEXT: TagName: ABI_FP_optimization_goals +@CHECK-OBJ-NEXT: Description: Best Accuracy + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-7.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-7.s new file mode 100644 index 00000000000..7f511674aef --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-7.s @@ -0,0 +1,38 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 7 +@CHECK: .eabi_attribute 6, 7 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 7 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v6KZ + +.eabi_attribute Tag_FP_arch, 7 +@CHECK: .eabi_attribute 10, 7 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 7 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: ARMv8-a FP + +.eabi_attribute Tag_PCS_config, 7 +@CHECK: .eabi_attribute 13, 7 +@CHECK-OBJ: Tag: 13 +@CHECK-OBJ-NEXT: Value: 7 +@CHECK-OBJ-NEXT: TagName: PCS_config +@CHECK-OBJ-NEXT: Description: Reserved (Symbian OS) + +.eabi_attribute Tag_ABI_align_needed, 7 +@CHECK: .eabi_attribute 24, 7 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 7 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 128-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 7 +@CHECK: .eabi_attribute 25, 7 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 7 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 128-byte data alignment + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-8.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-8.s new file mode 100644 index 00000000000..42e2c878408 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-8.s @@ -0,0 +1,31 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 8 +@CHECK: .eabi_attribute 6, 8 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 8 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v6T2 + +.eabi_attribute Tag_FP_arch, 8 +@CHECK: .eabi_attribute 10, 8 +@CHECK-OBJ: Tag: 10 +@CHECK-OBJ-NEXT: Value: 8 +@CHECK-OBJ-NEXT: TagName: FP_arch +@CHECK-OBJ-NEXT: Description: ARMv8-a FP-D16 + +.eabi_attribute Tag_ABI_align_needed, 8 +@CHECK: .eabi_attribute 24, 8 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 8 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 256-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 8 +@CHECK: .eabi_attribute 25, 8 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 8 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 256-byte data alignment + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-9.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-9.s new file mode 100644 index 00000000000..1d15ddeb79f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-9.s @@ -0,0 +1,24 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch, 9 +@CHECK: .eabi_attribute 6, 9 +@CHECK-OBJ: Tag: 6 +@CHECK-OBJ-NEXT: Value: 9 +@CHECK-OBJ-NEXT: TagName: CPU_arch +@CHECK-OBJ-NEXT: Description: ARM v6K + +.eabi_attribute Tag_ABI_align_needed, 9 +@CHECK: .eabi_attribute 24, 9 +@CHECK-OBJ: Tag: 24 +@CHECK-OBJ-NEXT: Value: 9 +@CHECK-OBJ-NEXT: TagName: ABI_align_needed +@CHECK-OBJ-NEXT: Description: 8-byte alignment, 512-byte extended alignment + +.eabi_attribute Tag_ABI_align_preserved, 9 +@CHECK: .eabi_attribute 25, 9 +@CHECK-OBJ: Tag: 25 +@CHECK-OBJ-NEXT: Value: 9 +@CHECK-OBJ-NEXT: TagName: ABI_align_preserved +@CHECK-OBJ-NEXT: Description: 8-byte stack alignment, 512-byte data alignment + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-A.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-A.s new file mode 100644 index 00000000000..105e70532aa --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-A.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch_profile, 'A' +@CHECK: .eabi_attribute 7, 65 +@CHECK-OBJ: Tag: 7 +@CHECK-OBJ-NEXT: Value: 65 +@CHECK-OBJ-NEXT: TagName: CPU_arch_profile +@CHECK-OBJ-NEXT: Description: Application + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-M.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-M.s new file mode 100644 index 00000000000..72ea70f30c7 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-M.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch_profile, 'M' +@CHECK: .eabi_attribute 7, 77 +@CHECK-OBJ: Tag: 7 +@CHECK-OBJ-NEXT: Value: 77 +@CHECK-OBJ-NEXT: TagName: CPU_arch_profile +@CHECK-OBJ-NEXT: Description: Microcontroller + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-R.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-R.s new file mode 100644 index 00000000000..6a4c2620bab --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-R.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch_profile, 'R' +@CHECK: .eabi_attribute 7, 82 +@CHECK-OBJ: Tag: 7 +@CHECK-OBJ-NEXT: Value: 82 +@CHECK-OBJ-NEXT: TagName: CPU_arch_profile +@CHECK-OBJ-NEXT: Description: Real-time + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-S.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-S.s new file mode 100644 index 00000000000..a8cd27c156c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-S.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_CPU_arch_profile, 'S' +@CHECK: .eabi_attribute 7, 83 +@CHECK-OBJ: Tag: 7 +@CHECK-OBJ-NEXT: Value: 83 +@CHECK-OBJ-NEXT: TagName: CPU_arch_profile +@CHECK-OBJ-NEXT: Description: Classic + diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-1.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-1.s new file mode 100644 index 00000000000..2ceaca2cced --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-1.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj -A - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_conformance, "0" +@CHECK: .eabi_attribute 67, "0" +@CHECK-OBJ: Tag: 67 +@CHECK-OBJ-NEXT: TagName: conformance +@CHECK-OBJ-NEXT: Value: 0 diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-2.s b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-2.s new file mode 100644 index 00000000000..2ac459aa237 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/attribute-conformance-2.s @@ -0,0 +1,10 @@ +@ RUN: llvm-mc -triple armv7-elf -filetype asm -o - %s | FileCheck %s +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj --arch-specific - | FileCheck %s --check-prefix=CHECK-OBJ +@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s \ +@ RUN: | llvm-readobj -A - | FileCheck %s --check-prefix=CHECK-OBJ +.eabi_attribute Tag_conformance, "A.long--non numeric oddity...!!" +@CHECK: .eabi_attribute 67, "A.long--non numeric oddity...!!" +@CHECK-OBJ: Tag: 67 +@CHECK-OBJ-NEXT: TagName: conformance +@CHECK-OBJ-NEXT: Value: A.long--non numeric oddity...!! diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/dwarf-cfi.s b/llvm/test/tools/llvm-readobj/ELF/ARM/dwarf-cfi.s new file mode 100644 index 00000000000..36d71d61c9f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/dwarf-cfi.s @@ -0,0 +1,27 @@ +# RUN: llvm-mc -triple arm-linux -filetype obj -o - %s | llvm-readobj -u | FileCheck %s + +# CHECK: [0x0] CIE length=16 +# CHECK-NEXT: version: 1 +# CHECK-NEXT: augmentation: zR +# CHECK-NEXT: code_alignment_factor: 1 +# CHECK-NEXT: data_alignment_factor: -4 +# CHECK-NEXT: return_address_register: 14 + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_def_cfa: reg13 +0 + +# CHECK: [0x14] FDE length=16 cie=[0x0] +# CHECK-NEXT: initial_location: 0x0 +# CHECK-NEXT: address_range: 0x4 (end : 0x4) + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +.cpu cortex-a8 + +foo: +.cfi_startproc +bx lr +.cfi_endproc diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/lit.local.cfg b/llvm/test/tools/llvm-readobj/ELF/ARM/lit.local.cfg new file mode 100644 index 00000000000..236e1d34416 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'ARM' in config.root.targets: + config.unsupported = True diff --git a/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s b/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s new file mode 100644 index 00000000000..ef17118283b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s @@ -0,0 +1,329 @@ +@ RUN: llvm-mc -triple armv7-linux-eabi -filetype obj %s -o %t +@ RUN: llvm-readobj -u %t | FileCheck --check-prefixes=CHECK,SYM %s + +@@ If .symtab doesn't exist, we can still dump some information. +@ RUN: llvm-objcopy --allow-broken-links --strip-all %t - | llvm-readobj -u - | FileCheck %s + + .syntax unified + + .cpu cortex-a8 + .fpu neon + + .section .personality + + .type __personality,%function +__personality: + .fnstart + bkpt + .fnend + + + .section .personality0 + + .type personality0,%function +personality0: + .fnstart + bx lr + .fnend + + + .section .personality1 + + .type personality1,%function +personality1: + .fnstart + .pad #0x100 + sub sp, sp, #0x100 + .save {r0-r11} + push {r0-r11} + pop {r0-r11} + add sp, sp, #0x100 + bx lr + .fnend + + + .section .custom_personality + + .type custom_personality,%function +custom_personality: + .fnstart + .personality __personality + bx lr + .fnend + + + .section .opcodes + + .type opcodes,%function +opcodes: + .fnstart + .vsave {d8-d12} + vpush {d8-d12} + vpop {d8-d12} + bx lr + .fnend + + + .section .multiple + + .type function0,%function +function0: + .fnstart + bx lr + .fnend + + .type function1,%function +function1: + .fnstart + .personality __personality + bx lr + .fnend + + .type function2,%function +function2: + .fnstart + bx lr + .fnend + + .section .raw + + .type raw,%function + .thumb_func +raw: + .fnstart + .unwind_raw 12, 0x02 + .unwind_raw -12, 0x42 + .unwind_raw 0, 0x80, 0x00 + .unwind_raw 4, 0x81, 0x00 + .unwind_raw 4, 0x80, 0x01 + .unwind_raw 8, 0x80, 0xc0 + .unwind_raw 12, 0x84, 0xc0 + .unwind_raw 0, 0x91 + .unwind_raw 8, 0xa1 + .unwind_raw 12, 0xa9 + .unwind_raw 0, 0xb0 + .unwind_raw 4, 0xb1, 0x01 + .unwind_raw 0xa04, 0xb2, 0x80, 0x04 + .unwind_raw 24, 0xb3, 0x12 + .unwind_raw 24, 0xba + .unwind_raw 24, 0xc2 + .unwind_raw 24, 0xc6, 0x02 + .unwind_raw 8, 0xc7, 0x03 + .unwind_raw 24, 0xc8, 0x02 + .unwind_raw 24, 0xc9, 0x02 + .unwind_raw 64, 0xd7 + .fnend + + .section .spare + + .type spare,%function +spare: + .fnstart + .unwind_raw 4, 0x00 + .unwind_raw -4, 0x40 + .unwind_raw 0, 0x80, 0x00 + .unwind_raw 4, 0x88, 0x00 + .unwind_raw 0, 0x91 + .unwind_raw 0, 0x9d + .unwind_raw 0, 0x9f + .unwind_raw 0, 0xa0 + .unwind_raw 0, 0xa8 + .unwind_raw 0, 0xb0 + .unwind_raw 0, 0xb1, 0x00 + .unwind_raw 4, 0xb1, 0x01 + .unwind_raw 0, 0xb1, 0x10 + .unwind_raw 0x204, 0xb2, 0x00 + .unwind_raw 16, 0xb3, 0x00 + .unwind_raw 0, 0xb4 + .unwind_raw 16, 0xb8 + .unwind_raw 4, 0xc0 + .unwind_raw 4, 0xc6, 0x00 + .unwind_raw 4, 0xc7, 0x00 + .unwind_raw 4, 0xc7, 0x01 + .unwind_raw 0, 0xc7, 0x10 + .unwind_raw 16, 0xc8, 0x00 + .unwind_raw 16, 0xc9, 0x00 + .unwind_raw 0, 0xca + .unwind_raw 16, 0xd0 + .unwind_raw 0, 0xd8 + .fnend + +@ CHECK: UnwindInformation { +@ CHECK: UnwindIndexTable { +@ CHECK: SectionName: .ARM.exidx.personality +@ CHECK: Entries [ +@ CHECK: Entry { +@ CHECK: FunctionAddress: 0x0 +@ SYM: FunctionName: __personality +@ CHECK: Model: Compact (Inline) +@ CHECK: PersonalityIndex: 0 +@ CHECK: Opcodes [ +@ CHECK: 0xB0 ; finish +@ CHECK: 0xB0 ; finish +@ CHECK: 0xB0 ; finish +@ CHECK: ] +@ CHECK: } +@ CHECK: ] +@ CHECK: } +@ CHECK: UnwindIndexTable { +@ CHECK: SectionName: .ARM.exidx.personality0 +@ CHECK: Entries [ +@ CHECK: Entry { +@ CHECK: FunctionAddress: 0x0 +@ SYM: FunctionName: personality0 +@ CHECK: Model: Compact (Inline) +@ CHECK: PersonalityIndex: 0 +@ CHECK: Opcodes [ +@ CHECK: 0xB0 ; finish +@ CHECK: 0xB0 ; finish +@ CHECK: 0xB0 ; finish +@ CHECK: ] +@ CHECK: } +@ CHECK: ] +@ CHECK: } +@ CHECK: UnwindIndexTable { +@ CHECK: SectionName: .ARM.exidx.personality1 +@ CHECK: Entries [ +@ CHECK: Entry { +@ CHECK: FunctionAddress: 0x0 +@ SYM: FunctionName: personality1 +@ SYM: ExceptionHandlingTable: .ARM.extab.personality1 +@ SYM: TableEntryOffset: 0x0 +@ SYM: Model: Compact +@ SYM: PersonalityIndex: 1 +@ SYM: Opcodes [ +@ SYM: 0xB1 0x0F ; pop {r0, r1, r2, r3} +@ SYM: 0xA7 ; pop {r4, r5, r6, r7, r8, r9, r10, fp} +@ SYM: 0x3F ; vsp = vsp + 256 +@ SYM: 0xB0 ; finish +@ SYM: 0xB0 ; finish +@ SYM: ] +@ CHECK: } +@ CHECK: ] +@ CHECK: } +@ CHECK: UnwindIndexTable { +@ CHECK: SectionName: .ARM.exidx.custom_personality +@ CHECK: Entries [ +@ CHECK: Entry { +@ CHECK: FunctionAddress: 0x0 +@ SYM: FunctionName: custom_personality +@ SYM: ExceptionHandlingTable: .ARM.extab.custom_personality +@ SYM: TableEntryOffset: 0x0 +@ SYM: Model: Generic +@ SYM: PersonalityRoutineAddress: 0x0 +@ CHECK: } +@ CHECK: ] +@ CHECK: } +@ CHECK: UnwindIndexTable { +@ CHECK: SectionName: .ARM.exidx.opcodes +@ CHECK: Entries [ +@ CHECK: Entry { +@ CHECK: FunctionAddress: 0x0 +@ SYM: FunctionName: opcodes +@ CHECK: Model: Compact (Inline) +@ CHECK: PersonalityIndex: 0 +@ CHECK: Opcodes [ +@ CHECK: 0xC9 0x84 ; pop {d8, d9, d10, d11, d12} +@ CHECK: 0xB0 ; finish +@ CHECK: ] +@ CHECK: } +@ CHECK: ] +@ CHECK: } +@ CHECK: UnwindIndexTable { +@ CHECK: SectionName: .ARM.exidx.multiple +@ CHECK: Entries [ +@ CHECK: Entry { +@ CHECK: FunctionAddress: 0x0 +@ SYM: FunctionName: function0 +@ CHECK: Model: Compact (Inline) +@ CHECK: PersonalityIndex: 0 +@ CHECK: Opcodes [ +@ CHECK: 0xB0 ; finish +@ CHECK: 0xB0 ; finish +@ CHECK: 0xB0 ; finish +@ CHECK: ] +@ CHECK: } +@ CHECK: Entry { +@ CHECK: FunctionAddress: 0x4 +@ SYM: FunctionName: function1 +@ SYM: ExceptionHandlingTable: .ARM.extab.multiple +@ SYM: Model: Generic +@ SYM: PersonalityRoutineAddress: 0x0 +@ CHECK: } +@ CHECK: Entry { +@ CHECK: FunctionAddress: 0x8 +@ SYM: FunctionName: function2 +@ CHECK: Model: Compact (Inline) +@ CHECK: PersonalityIndex: 0 +@ CHECK: Opcodes [ +@ CHECK: 0xB0 ; finish +@ CHECK: 0xB0 ; finish +@ CHECK: 0xB0 ; finish +@ CHECK: ] +@ CHECK: } +@ CHECK: ] +@ CHECK: } +@ CHECK: UnwindIndexTable { +@ CHECK: SectionName: .ARM.exidx.raw +@ CHECK: Entries [ +@ SYM: Opcodes [ +@ SYM: 0xD7 ; pop {d8, d9, d10, d11, d12, d13, d14, d15} +@ SYM: 0xC9 0x02 ; pop {d0, d1, d2} +@ SYM: 0xC8 0x02 ; pop {d16, d17, d18} +@ SYM: 0xC7 0x03 ; pop {wCGR0, wCGR1} +@ SYM: 0xC6 0x02 ; pop {wR0, wR1, wR2} +@ SYM: 0xC2 ; pop {wR10, wR11, wR12} +@ SYM: 0xBA ; pop {d8, d9, d10} +@ SYM: 0xB3 0x12 ; pop {d1, d2, d3} +@ SYM: 0xB2 0x80 0x04 ; vsp = vsp + 2564 +@ SYM: 0xB1 0x01 ; pop {r0} +@ SYM: 0xB0 ; finish +@ SYM: 0xA9 ; pop {r4, r5, lr} +@ SYM: 0xA1 ; pop {r4, r5} +@ SYM: 0x91 ; vsp = r1 +@ SYM: 0x84 0xC0 ; pop {r10, fp, lr} +@ SYM: 0x80 0xC0 ; pop {r10, fp} +@ SYM: 0x80 0x01 ; pop {r4} +@ SYM: 0x81 0x00 ; pop {ip} +@ SYM: 0x80 0x00 ; refuse to unwind +@ SYM: 0x42 ; vsp = vsp - 12 +@ SYM: 0x02 ; vsp = vsp + 12 +@ SYM: ] +@ CHECK: ] +@ CHECK: } +@ CHECK: UnwindIndexTable { +@ CHECK: SectionName: .ARM.exidx.spare +@ CHECK: Entries [ +@ SYM: Opcodes [ +@ SYM: 0xD8 ; spare +@ SYM: 0xD0 ; pop {d8} +@ SYM: 0xCA ; spare +@ SYM: 0xC9 0x00 ; pop {d0} +@ SYM: 0xC8 0x00 ; pop {d16} +@ SYM: 0xC7 0x10 ; spare +@ SYM: 0xC7 0x01 ; pop {wCGR0} +@ SYM: 0xC7 0x00 ; spare +@ SYM: 0xC6 0x00 ; pop {wR0} +@ SYM: 0xC0 ; pop {wR10} +@ SYM: 0xB8 ; pop {d8} +@ SYM: 0xB4 ; spare +@ SYM: 0xB3 0x00 ; pop {d0} +@ SYM: 0xB2 0x00 ; vsp = vsp + 516 +@ SYM: 0xB1 0x10 ; spare +@ SYM: 0xB1 0x01 ; pop {r0} +@ SYM: 0xB1 0x00 ; spare +@ SYM: 0xB0 ; finish +@ SYM: 0xA8 ; pop {r4, lr} +@ SYM: 0xA0 ; pop {r4} +@ SYM: 0x9F ; reserved (WiMMX MOVrr) +@ SYM: 0x9D ; reserved (ARM MOVrr) +@ SYM: 0x91 ; vsp = r1 +@ SYM: 0x88 0x00 ; pop {pc} +@ SYM: 0x80 0x00 ; refuse to unwind +@ SYM: 0x40 ; vsp = vsp - 4 +@ SYM: 0x00 ; vsp = vsp + 4 +@ SYM: ] +@ CHECK: ] +@ CHECK: } +@ CHECK: } + diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mips Binary files differnew file mode 100644 index 00000000000..edcd50becec --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mips diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mipsel Binary files differnew file mode 100644 index 00000000000..bb5f43d2862 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/abiflags.obj.elf-mipsel diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/compression.zlib.style.elf-x86-64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/compression.zlib.style.elf-x86-64 Binary files differnew file mode 100644 index 00000000000..34cdb8a89ed --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/compression.zlib.style.elf-x86-64 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-exe.mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-exe.mips Binary files differnew file mode 100644 index 00000000000..28d8e33752c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-exe.mips diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.mips Binary files differnew file mode 100644 index 00000000000..ab36ceeb5a0 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.mips diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.x86 b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.x86 Binary files differnew file mode 100644 index 00000000000..01bd1c2fc1e --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table-so.x86 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table.c b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table.c new file mode 100644 index 00000000000..9d45720eb67 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/dynamic-table.c @@ -0,0 +1,14 @@ +// clang -target x86_64-linux-gnu -shared -fPIC -lc dynamic-table.c \ +// -o dynamic-table-so.x86 -Wl,-f,aux.so -Wl,-F,filter.so +// clang -target mipsel-linux-gnu -shared -fPIC -lc dynamic-table.c \ +// -o dynamic-table-so.mips +// clang -target mipsel-linux-gnu -lc dynamic-table.c \ +// -o dynamic-table-exe.mips +int puts(const char *); + +__thread int foo; + +int main(void) { + puts("Hello, World"); + foo = 0; +} diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-dynamic-tags-machine-specific.yaml b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-dynamic-tags-machine-specific.yaml new file mode 100644 index 00000000000..222b8723e11 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-dynamic-tags-machine-specific.yaml @@ -0,0 +1,276 @@ +# Used by llvm-readobj/elf-dynamic-tags-machine-specific.test and +# llvm-objdump/elf-dynamic-section-machine-specific.test. + +# First document: Hexagon +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_HEXAGON +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Address: 0x1000 + Size: 0x10 + Content: "004400550066007700" + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1010 + Entries: + - Tag: DT_HASH + Value: 0x1000 + - Tag: DT_HEXAGON_SYMSZ + Value: 0x10 + - Tag: DT_HEXAGON_VER + Value: 0x1000 + - Tag: DT_HEXAGON_PLT + Value: 0x1000 + - Tag: 0x1234abcd + Value: 0x1 + - Tag: DT_NULL + Value: 0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynstr + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1010 + Sections: + - Section: .dynamic + +# Second document: MIPS +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_MIPS +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Address: 0x1000 + Size: 0x10 + Content: "004400550066007700" + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1010 + Entries: + - Tag: DT_HASH + Value: 0x1000 + - Tag: DT_MIPS_RLD_VERSION + Value: 0x12345678 + - Tag: DT_MIPS_TIME_STAMP + Value: 0x11223344 + - Tag: DT_MIPS_ICHECKSUM + Value: 0x11112222 + - Tag: DT_MIPS_IVERSION + Value: 0x1 + - Tag: DT_MIPS_FLAGS + Value: 0x11111111 + - Tag: DT_MIPS_BASE_ADDRESS + Value: 0x87654321 + - Tag: DT_MIPS_MSYM + Value: 0x1000 + - Tag: DT_MIPS_CONFLICT + Value: 0x1000 + - Tag: DT_MIPS_LIBLIST + Value: 0x1000 + - Tag: DT_MIPS_LOCAL_GOTNO + Value: 0x1 + - Tag: DT_MIPS_CONFLICTNO + Value: 0x1 + - Tag: DT_MIPS_LIBLISTNO + Value: 0x1 + - Tag: DT_MIPS_SYMTABNO + Value: 0x1 + - Tag: DT_MIPS_UNREFEXTNO + Value: 0x0 + - Tag: DT_MIPS_GOTSYM + Value: 0x0 + - Tag: DT_MIPS_HIPAGENO + Value: 0x88776655 + - Tag: DT_MIPS_RLD_MAP + Value: 0x1000 + - Tag: DT_MIPS_DELTA_CLASS + Value: 0x1000 + - Tag: DT_MIPS_DELTA_CLASS_NO + Value: 0x1 + - Tag: DT_MIPS_DELTA_INSTANCE + Value: 0x1000 + - Tag: DT_MIPS_DELTA_INSTANCE_NO + Value: 0x1 + - Tag: DT_MIPS_DELTA_RELOC + Value: 0x1000 + - Tag: DT_MIPS_DELTA_RELOC_NO + Value: 0x1 + - Tag: DT_MIPS_DELTA_SYM + Value: 0x1000 + - Tag: DT_MIPS_DELTA_SYM_NO + Value: 0x1 + - Tag: DT_MIPS_DELTA_CLASSSYM + Value: 0x1000 + - Tag: DT_MIPS_DELTA_CLASSSYM_NO + Value: 0x1 + - Tag: DT_MIPS_CXX_FLAGS + Value: 0x88887777 + - Tag: DT_MIPS_PIXIE_INIT + Value: 0x1000 + - Tag: DT_MIPS_LOCALPAGE_GOTIDX + Value: 0x1 + - Tag: DT_MIPS_LOCAL_GOTIDX + Value: 0x1 + - Tag: DT_MIPS_HIDDEN_GOTIDX + Value: 0x1 + - Tag: DT_MIPS_PROTECTED_GOTIDX + Value: 0x1 + - Tag: DT_MIPS_OPTIONS + Value: 0x1000 + - Tag: DT_MIPS_INTERFACE + Value: 0x1000 + - Tag: DT_MIPS_DYNSTR_ALIGN + Value: 0x88888888 + - Tag: DT_MIPS_INTERFACE_SIZE + Value: 0x10 + - Tag: DT_MIPS_RLD_TEXT_RESOLVE_ADDR + Value: 0x8 + - Tag: DT_MIPS_PERF_SUFFIX + Value: 0x0 + - Tag: DT_MIPS_COMPACT_SIZE + Value: 0x10 + - Tag: DT_MIPS_GP_VALUE + Value: 0x1 + - Tag: DT_MIPS_AUX_DYNAMIC + Value: 0x1000 + - Tag: DT_MIPS_PLTGOT + Value: 0x1000 + - Tag: DT_MIPS_RWPLT + Value: 0x1000 + - Tag: DT_MIPS_RLD_MAP_REL + Value: 0x1000 + - Tag: 0x1234abcd + Value: 0x1 + - Tag: DT_NULL + Value: 0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynstr + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1010 + Sections: + - Section: .dynamic + +# Third document: PPC +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_EXEC + Machine: EM_PPC +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Address: 0x200 + Size: 0x10 + Content: "004400550066007700" + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x20000 + Entries: + - Tag: DT_PPC_GOT + Value: 0x200c0 + - Tag: DT_PPC_OPT + Value: 1 + - Tag: 0x1234abcd + Value: 0x1 + - Tag: DT_NULL + Value: 0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynstr + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x20000 + Sections: + - Section: .dynamic + +# Fourth document: PPC64 +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_PPC64 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Address: 0x1000 + Size: 0x10 + Content: "004400550066007700" + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1010 + Entries: + - Tag: DT_HASH + Value: 0x1000 + - Tag: DT_PPC64_GLINK + Value: 0x1000 + - Tag: 0x1234abcd + Value: 0x1 + - Tag: DT_NULL + Value: 0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynstr + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1010 + Sections: + - Section: .dynamic + +# Fourth document: AARCH64 +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_AARCH64 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Address: 0x1000 + Size: 0x10 + Content: "004400550066007700" + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1010 + Entries: + - Tag: DT_HASH + Value: 0x1000 + - Tag: DT_AARCH64_BTI_PLT + Value: 0 + - Tag: DT_AARCH64_PAC_PLT + Value: 0 + - Tag: 0x1234abcd + Value: 0x1 + - Tag: DT_NULL + Value: 0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynstr + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1010 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs1.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs1.s new file mode 100644 index 00000000000..ac844095104 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs1.s @@ -0,0 +1,37 @@ +.ascii "APS2" +.sleb128 8 // Number of relocations +.sleb128 4096 // Initial offset + +.sleb128 2 // Number of relocations in group +.sleb128 1 // RELOCATION_GROUPED_BY_INFO_FLAG +.sleb128 8 // R_X86_RELATIVE + +.sleb128 256 // Reloc 1: r_offset delta +.sleb128 128 // Reloc 2: r_offset delta + +.sleb128 2 // Number of relocations in group +.sleb128 2 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG +.sleb128 8 // offset delta + +.sleb128 (1 << 32) | 1 // R_X86_64_64 (sym index 1) +.sleb128 (2 << 32) | 1 // R_X86_64_64 (sym index 2) + +.sleb128 2 // Number of relocations in group +.sleb128 8 // RELOCATION_GROUP_HAS_ADDEND_FLAG + +.sleb128 1 // offset delta +.sleb128 (1 << 32) | 1 // R_X86_64_64 (sym index 1) +.sleb128 8 // addend delta + +.sleb128 2 // offset delta +.sleb128 (2 << 32) | 1 // R_X86_64_64 (sym index 2) +.sleb128 4 // addend delta + +.sleb128 2 // Number of relocations in group +.sleb128 12 // RELOCATION_GROUP_HAS_ADDEND_FLAG | RELOCATION_GROUPED_BY_ADDEND_FLAG +.sleb128 -2 // addend delta + +.sleb128 4 // offset delta +.sleb128 (1 << 32) | 1 // R_X86_64_64 (sym index 1) +.sleb128 8 // offset delta +.sleb128 (2 << 32) | 1 // R_X86_64_64 (sym index 2) diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs2.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs2.s new file mode 100644 index 00000000000..73b3733e2dc --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs2.s @@ -0,0 +1,15 @@ +.ascii "APS2" +.sleb128 10 // Number of relocations +.sleb128 4096 // Initial offset + +.sleb128 2 // Number of relocations in group +.sleb128 2 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG +.sleb128 8 // offset delta + +.sleb128 (1 << 8) | 1 // R_386_32 (sym index 1) +.sleb128 (2 << 8) | 3 // R_386_GOT32 (sym index 2) + +.sleb128 8 // Number of relocations in group +.sleb128 3 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG | RELOCATION_GROUPED_BY_INFO_FLAG +.sleb128 -4 // offset delta +.sleb128 8 // R_386_RELATIVE diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs3.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs3.s new file mode 100644 index 00000000000..8d4faedd9e9 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-packed-relocs3.s @@ -0,0 +1,31 @@ +.ascii "APS2" +.sleb128 6 // Number of relocations +.sleb128 4096 // Initial offset + +.sleb128 2 // Number of relocations in group +.sleb128 8 // RELOCATION_GROUP_HAS_ADDEND_FLAG + +.sleb128 256 // Reloc 1: r_offset delta +.sleb128 8 // Reloc 1: r_info R_X86_RELATIVE +.sleb128 0 // Reloc 1: r_addend delta +.sleb128 128 // Reloc 2: r_offset delta +.sleb128 8 // Reloc 2: r_info R_X86_RELATIVE +.sleb128 8 // Reloc 2: r_addend delta + +.sleb128 2 // Number of relocations in group +.sleb128 0 // No RELOCATION_GROUP_HAS_ADDEND_FLAG + +.sleb128 128 // reloc 1: r_offset delta +.sleb128 (1 << 32) | 1 // r_x86_64_64 (sym index 1) +.sleb128 8 // reloc 2: r_offset delta +.sleb128 (2 << 32) | 1 // r_x86_64_64 (sym index 2) + +.sleb128 2 // Number of relocations in group +.sleb128 8 // RELOCATION_GROUP_HAS_ADDEND_FLAG + +.sleb128 8 // reloc 1: r_offset delta +.sleb128 (1 << 32) | 1 // r_x86_64_64 (sym index 1) +.sleb128 0 // reloc 1: r_addend delta +.sleb128 8 // reloc 2: r_offset delta +.sleb128 (2 << 32) | 1 // r_x86_64_64 (sym index 2) +.sleb128 8 // reloc 2: r_addend delta diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs1.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs1.s new file mode 100644 index 00000000000..ec4e9caa73f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs1.s @@ -0,0 +1,5 @@ +.quad 0x0000000000010d60 // Initial offset +.quad 0x0000000000000103 // Continuation bitmap +.quad 0x0000000000020000 // New offset +.quad 0x00000000000f0501 // Continuation bitmap +.quad 0x000a700550400009 // Continuation bitmap diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs2.s b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs2.s new file mode 100644 index 00000000000..515d578971c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/elf-relr-relocs2.s @@ -0,0 +1,5 @@ +.long 0x00010d60 // Initial offset +.long 0x00000103 // Continuation bitmap +.long 0x00020000 // New offset +.long 0x000f0501 // Continuation bitmap +.long 0x50400009 // Continuation bitmap diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-i386 b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-i386 Binary files differnew file mode 100644 index 00000000000..c222a899ba7 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-i386 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc Binary files differnew file mode 100644 index 00000000000..fd337f343e0 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc64 Binary files differnew file mode 100644 index 00000000000..25ce5c71b38 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-ppc64 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-x86_64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-x86_64 Binary files differnew file mode 100644 index 00000000000..612e7b2112f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/gnuhash.so.elf-x86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-empty.exe.mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-empty.exe.mipsel Binary files differnew file mode 100644 index 00000000000..b57874557c8 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-empty.exe.mipsel diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-over.exe.elf-mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-over.exe.elf-mips Binary files differnew file mode 100644 index 00000000000..27644bff330 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-over.exe.elf-mips diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-plt.exe.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-plt.exe.elf-mipsel Binary files differnew file mode 100644 index 00000000000..8cdc69ffa56 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-plt.exe.elf-mipsel diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-static.exe.mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-static.exe.mips Binary files differnew file mode 100644 index 00000000000..a369e32bd88 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-static.exe.mips diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/got-tls.so.elf-mips64el b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-tls.so.elf-mips64el Binary files differnew file mode 100644 index 00000000000..3afc567f85d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/got-tls.so.elf-mips64el diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-options.elf-mips64el b/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-options.elf-mips64el Binary files differnew file mode 100644 index 00000000000..4b6525731dd --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-options.elf-mips64el diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-rld-map-rel.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-rld-map-rel.elf-mipsel Binary files differnew file mode 100644 index 00000000000..a8e396c2ec3 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/mips-rld-map-rel.elf-mipsel diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/options.obj.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/options.obj.elf-mipsel Binary files differnew file mode 100644 index 00000000000..6309d87c592 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/options.obj.elf-mipsel diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-i386 b/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-i386 Binary files differnew file mode 100644 index 00000000000..a5a9541aec5 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-i386 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-x86_64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-x86_64 Binary files differnew file mode 100644 index 00000000000..6b6520809d7 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/phdrs-elf.exe-x86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/ppc64.exe b/llvm/test/tools/llvm-readobj/ELF/Inputs/ppc64.exe Binary files differnew file mode 100644 index 00000000000..0db6147ca70 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/ppc64.exe diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/reginfo.obj.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/reginfo.obj.elf-mipsel Binary files differnew file mode 100644 index 00000000000..5cd09809f8b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/reginfo.obj.elf-mipsel diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/relocs.obj.elf-x86_64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/relocs.obj.elf-x86_64 Binary files differnew file mode 100644 index 00000000000..3ca9d8c6939 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/relocs.obj.elf-x86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/rpath.exe.elf-x86_64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/rpath.exe.elf-x86_64 Binary files differnew file mode 100644 index 00000000000..8c01c502cf8 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/rpath.exe.elf-x86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips b/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips Binary files differnew file mode 100644 index 00000000000..80cefc192d4 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips16 b/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips16 Binary files differnew file mode 100644 index 00000000000..5f0a0e3de8e --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/st-other.obj.elf-mips16 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/symbols-proc-specific.elf-hexagon b/llvm/test/tools/llvm-readobj/ELF/Inputs/symbols-proc-specific.elf-hexagon Binary files differnew file mode 100644 index 00000000000..f6979086937 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/symbols-proc-specific.elf-hexagon diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.ll b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.ll new file mode 100644 index 00000000000..c27d0cb038c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.ll @@ -0,0 +1,21 @@ +; Input used for generating checked-in binaries (trivial.obj.*) +; llc -mtriple=i386-pc-win32 trivial.ll -filetype=obj -o trivial.obj.coff-i386 +; llc -mtriple=x86_64-pc-win32 trivial.ll -filetype=obj -o trivial.obj.coff-x86-64 +; llc -mtriple=i386-linux-gnu trivial.ll -filetype=obj -o trivial.obj.elf-i386 -relocation-model=pic +; llc -mtriple=x86_64-linux-gnu trivial.ll -filetype=obj -o trivial.obj.elf-x86-64 -relocation-model=pic +; llc -mtriple=i386-apple-darwin10 trivial.ll -filetype=obj -o trivial.obj.macho-i386 -relocation-model=pic +; llc -mtriple=x86_64-apple-darwin10 trivial.ll -filetype=obj -o trivial.obj.macho-x86-64 -relocation-model=pic +; llc -mtriple=wasm32-unknown-unknown trivial.ll -filetype=obj -o trivial.obj.wasm + +@.str = private unnamed_addr constant [13 x i8] c"Hello World\0A\00", align 1 + +define i32 @main() nounwind { +entry: + %call = tail call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0)) nounwind + tail call void bitcast (void (...)* @SomeOtherFunction to void ()*)() nounwind + ret i32 0 +} + +declare i32 @puts(i8* nocapture) nounwind + +declare void @SomeOtherFunction(...) diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-amdhsa-gfx803 b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-amdhsa-gfx803 Binary files differnew file mode 100644 index 00000000000..421269cbd8b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-amdhsa-gfx803 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-i386 b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-i386 Binary files differnew file mode 100644 index 00000000000..f85e40d6261 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-i386 diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-mipsel b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-mipsel Binary files differnew file mode 100644 index 00000000000..c523908605c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-mipsel diff --git a/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-x86-64 b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-x86-64 Binary files differnew file mode 100644 index 00000000000..95285c1f230 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/Inputs/trivial.obj.elf-x86-64 diff --git a/llvm/test/tools/llvm-readobj/ELF/addrsig.test b/llvm/test/tools/llvm-readobj/ELF/addrsig.test new file mode 100644 index 00000000000..a0c32ab5936 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/addrsig.test @@ -0,0 +1,84 @@ +## Show that llvm-readobj can dump SHT_LLVM_ADDRSIG sections. + +# RUN: yaml2obj --docnum=1 %s -o %t1.o +# RUN: llvm-readobj --addrsig %t1.o | FileCheck -DFILE=%t1.o %s --check-prefix LLVM +# RUN: not llvm-readelf --addrsig %t1.o 2>&1 | FileCheck -DFILE=%t1.o %s --check-prefix GNU + +# LLVM: Addrsig [ +# LLVM-NEXT: Sym: foo (1) +# LLVM-NEXT: Sym: bar (2) +# LLVM-NEXT: ] + +# GNU: error: '[[FILE]]': --addrsig: not implemented + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .llvm_addrsig + Type: SHT_LLVM_ADDRSIG + Symbols: + - Name: foo + - Name: bar +Symbols: + - Name: foo + - Name: bar + +## Check that llvm-readobj dumps any SHT_LLVM_ADDRSIG section when --all +## is specified for LLVM style, but not for GNU style. +## TODO: Refine the llvm-readelf check when GNU-style dumping is implemented. + +# RUN: llvm-readobj --all %t1.o | FileCheck %s --check-prefix LLVM +# RUN: llvm-readelf --all %t1.o 2>&1 | FileCheck %s --implicit-check-not=warning --implicit-check-not=error + +## Check we report a warning when SHT_LLVM_ADDRSIG is broken (e.g. contains a malformed uleb128). + +# RUN: yaml2obj --docnum=2 %s -o %t2.o +# RUN: llvm-readobj --addrsig %t2.o 2>&1 | FileCheck %s -DFILE=%t2.o --check-prefix=MALFORMED + +# MALFORMED: warning: '[[FILE]]': malformed uleb128, extends past end + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .llvm_addrsig + Type: SHT_LLVM_ADDRSIG + Content: "FF" + +## Check we report a warning when SHT_LLVM_ADDRSIG references a symbol that can't be +## dumped (e.g. the index value is larger than the number of symbols in .symtab). + +# RUN: yaml2obj --docnum=3 %s -o %t3.o +# RUN: llvm-readobj --addrsig %t3.o 2>&1 | FileCheck %s -DFILE=%t3.o --check-prefix=INVALID-INDEX + +# INVALID-INDEX: Addrsig [ +# INVALID-INDEX-NEXT: Sym: foo (1) +# INVALID-INDEX-EMPTY: +# INVALID-INDEX-NEXT: warning: '[[FILE]]': unable to get symbol from section [index 2]: invalid symbol index (255) +# INVALID-INDEX-NEXT: Sym: <?> (255) +# INVALID-INDEX-NEXT: Sym: bar (2) +# INVALID-INDEX-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .llvm_addrsig + Type: SHT_LLVM_ADDRSIG + Symbols: + - Index: 1 + - Index: 255 + - Index: 2 +Symbols: + - Name: foo + - Name: bar diff --git a/llvm/test/tools/llvm-readobj/ELF/all.test b/llvm/test/tools/llvm-readobj/ELF/all.test new file mode 100644 index 00000000000..1f617034d0e --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/all.test @@ -0,0 +1,115 @@ +# RUN: yaml2obj %s -o %t.o +# RUN: llvm-readobj -a %t.o | FileCheck %s --check-prefix LLVM-ALL +# RUN: llvm-readobj --all %t.o | FileCheck %s --check-prefix LLVM-ALL + +# LLVM-ALL: Format: ELF32-i386 +# LLVM-ALL: Arch: i386 +# LLVM-ALL: AddressSize: 32bit +# LLVM-ALL: LoadName: +# LLVM-ALL: ElfHeader { +# LLVM-ALL: Sections [ +# LLVM-ALL: Relocations [ +# LLVM-ALL: Symbols [ +# LLVM-ALL: EHFrameHeader { +# LLVM-ALL: .eh_frame section at offset 0x1128 address 0x0: +# LLVM-ALL: ProgramHeaders [ +# LLVM-ALL: VersionSymbols [ +# LLVM-ALL: VersionDefinitions [ +# LLVM-ALL: VersionRequirements [ +# LLVM-ALL: Addrsig [ +# LLVM-ALL: Notes [ +# LLVM-ALL: StackSizes [ + +# RUN: llvm-readelf -a %t.o | FileCheck %s --check-prefix GNU-ALL +# RUN: llvm-readelf --all %t.o | FileCheck %s --check-prefix GNU-ALL + +# GNU-ALL: ELF Header: +# GNU-ALL: There are {{.*}} section headers, starting at offset {{.*}}: +# GNU-ALL: Relocation section '.rela.data' at offset {{.*}} contains {{.*}} entries: +# GNU-ALL: Symbol table '.symtab' contains {{.*}} entries: +# GNU-ALL: EHFrameHeader { +# GNU-ALL: .eh_frame section at offset {{.*}} address 0x0: +# GNU-ALL: Dynamic section at offset {{.*}} contains {{.*}} entries: +# GNU-ALL: Program Headers: +# GNU-ALL: Version symbols section '.gnu.version' contains {{.*}} entries: +# GNU-ALL: Version definition section '.gnu.version_d' contains {{.*}} entries: +# GNU-ALL: Version needs section '.gnu.version_r' contains {{.*}} entries: +# GNU-ALL: There are no section groups in this file. +# GNU-ALL: Histogram for bucket list length (total of 1 buckets) +# GNU-ALL: Displaying notes found at file offset {{.*}} with length {{.*}}: + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .data + Type: SHT_PROGBITS + - Name: .rela.data + Type: SHT_REL + Relocations: + - Name: .gnu.version + Type: SHT_GNU_versym + Entries: [ 0 ] + Link: .dynsym + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Info: 0x0 + Entries: [] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Info: 0x0 + Dependencies: + - Version: 1 + File: verneed1.so.0 + Entries: [] + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1000 + AddressAlign: 0x1000 + Entries: + - Tag: DT_HASH + Value: 0x1100 + - Tag: DT_NULL + Value: 0 + - Name: .hash + Type: SHT_HASH + Link: 0 + Bucket: [ 1 ] + Chain: [ 0, 0 ] + Address: 0x1100 + AddressAlign: 0x100 + - Name: .eh_frame_hdr + Type: SHT_PROGBITS +## An arbitrary linker-generated valid content. + Content: 011b033b140000000100000000f0ffff30000000 + - Name: .eh_frame + Type: SHT_PROGBITS + AddressAlign: 8 +## An arbitrary linker-generated valid content. + Content: 1400000000000000017a5200017810011b0c070890010000100000001c000000c8efffff0100000000000000 + - Name: .note.gnu.build-id + Type: SHT_NOTE + Flags: [ SHF_ALLOC ] + Address: 0x1500 +## An arbitrary linker-generated valid content. + Content: 040000001000000003000000474E55004FCB712AA6387724A9F465A32CD8C14B +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Section: .hash + - Type: PT_DYNAMIC + Sections: + - Section: .dynamic + - Type: PT_GNU_EH_FRAME + Sections: + - Section: .eh_frame_hdr + - Type: PT_NOTE + Sections: + - Section: .note.gnu.build-id +Symbols: [] +DynamicSymbols: [] diff --git a/llvm/test/tools/llvm-readobj/ELF/amdgpu-elf-definitions.test b/llvm/test/tools/llvm-readobj/ELF/amdgpu-elf-definitions.test new file mode 100644 index 00000000000..24dcc7c052b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/amdgpu-elf-definitions.test @@ -0,0 +1,11 @@ +RUN: llvm-readobj --file-headers -l -S --symbols %p/Inputs/trivial.obj.elf-amdhsa-gfx803 | FileCheck %s + +CHECK: Format: ELF64-amdgpu +CHECK: Arch: unknown +CHECK: ElfHeader { +CHECK: Ident { +CHECK: OS/ABI: AMDGPU_HSA (0x40) +CHECK: ABIVersion: 0 +CHECK: } +CHECK: Machine: EM_AMDGPU (0xE0) +CHECK: } diff --git a/llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc-name.test b/llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc-name.test new file mode 100644 index 00000000000..25b8db4e14d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc-name.test @@ -0,0 +1,51 @@ +## Check that llvm-readobj/llvm-readelf reports an error when dumping relocations if a dynamic +## symbol name offset is broken (goes past the end of the dynamic symbol string table). + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj --dyn-relocations %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=LLVM +# RUN: llvm-readelf --dyn-relocations %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=GNU + +# LLVM: Dynamic Relocations { +# LLVM-EMPTY: +# LLVM-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: st_name (0x1234) is past the end of the string table of size 0x1 +# LLVM-NEXT: 0x0 R_X86_64_NONE <corrupt> 0x0 +# LLVM-NEXT: } + +# GNU: 'RELA' relocation section at offset {{.+}} contains 24 bytes: +# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# GNU-EMPTY: +# GNU-NEXT: warning: '[[FILE]]': unable to get name of the dynamic symbol with index 1: st_name (0x1234) is past the end of the string table of size 0x1 +# GNU-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 <corrupt> + 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .rela.dyn + Type: SHT_RELA + Link: .dynsym + Relocations: + - Offset: 0x0 + Symbol: 1 ## Index of a dynamic symbol with a broken st_name. + Type: R_X86_64_NONE + - Name: .dynamic + Type: SHT_DYNAMIC + Entries: + - Tag: DT_RELA + Value: 0x0000000000000000 + - Tag: DT_RELASZ + Value: 0x0000000000000018 + - Tag: DT_RELAENT + Value: 0x0000000000000018 + - Tag: DT_NULL + Value: 0x0000000000000000 +DynamicSymbols: + - NameIndex: 0x1234 +ProgramHeaders: + - Type: PT_LOAD + Sections: + - Section: .rela.dyn + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/broken-dynsym-link.test b/llvm/test/tools/llvm-readobj/ELF/broken-dynsym-link.test new file mode 100644 index 00000000000..d64b1dfb11a --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/broken-dynsym-link.test @@ -0,0 +1,68 @@ +## Test that we are able to dump section headers even if the +## .dynsym section's sh_link field is broken. + +## Case 1: sh_link is set to 0. +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readobj -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefixes=LLVM,ERR +# RUN: llvm-readelf -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefixes=GNU,ERR + +# ERR: warning: '[[FILE]]': invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL + +# LLVM: Name: .dynsym +# LLVM-NEXT: Type: SHT_DYNSYM +# LLVM-NEXT: Flags [ +# LLVM-NEXT: SHF_ALLOC +# LLVM-NEXT: ] +# LLVM-NEXT: Address: 0x0 +# LLVM-NEXT: Offset: 0x40 +# LLVM-NEXT: Size: 24 +# LLVM-NEXT: Link: 0 + +# GNU: Section Headers: +# GNU-NEXT: [Nr] Name Type Address Off Size ES Flg Lk +# GNU-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 +# GNU-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynsym + Type: SHT_DYNSYM + +## Case 2: sh_link is set to 255, which is larger than the number of the sections. +# RUN: yaml2obj --docnum=2 %s -o %t2 + +# RUN: llvm-readobj -S %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefixes=LLVM2,ERR2 +# RUN: llvm-readelf -S %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefixes=GNU2,ERR2 + +# ERR2: warning: '[[FILE]]': invalid section index + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynsym + Type: SHT_DYNSYM + Link: 255 + +# LLVM2: Name: .dynsym +# LLVM2-NEXT: Type: SHT_DYNSYM +# LLVM2-NEXT: Flags [ +# LLVM2-NEXT: SHF_ALLOC +# LLVM2-NEXT: ] +# LLVM2-NEXT: Address: 0x0 +# LLVM2-NEXT: Offset: 0x40 +# LLVM2-NEXT: Size: 24 +# LLVM2-NEXT: Link: 255 + +# GNU2: Section Headers: +# GNU2-NEXT: [Nr] Name Type Address Off Size ES Flg Lk +# GNU2-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 +# GNU2-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 255 diff --git a/llvm/test/tools/llvm-readobj/ELF/broken-group.test b/llvm/test/tools/llvm-readobj/ELF/broken-group.test new file mode 100644 index 00000000000..23bd76a821e --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/broken-group.test @@ -0,0 +1,80 @@ +# RUN: yaml2obj %s -o %t.o + +# RUN: llvm-readelf --elf-section-groups \ +# RUN: %t.o >%tout.log 2>%terr.log +# RUN: FileCheck %s -check-prefix=GNU-STDERR < %terr.log +# GNU-STDERR: Error: section [ 3] in group section [ 4] already in group section [ 2] +# RUN: FileCheck %s -check-prefix=GNU-STDOUT < %tout.log +# GNU-STDOUT: COMDAT group section [ 2] `.group' [bar] contains 1 sections: +# GNU-STDOUT-NEXT: [Index] Name +# GNU-STDOUT-NEXT: [ 3] .foo +# GNU-STDOUT: COMDAT group section [ 4] `.group1' [zed] contains 1 sections: +# GNU-STDOUT-NEXT: [Index] Name + +# RUN: llvm-readobj --elf-section-groups \ +# RUN: %t.o >%t2out.log 2>%t2err.log %t.o +# RUN: FileCheck %s -check-prefix=LLVM-STDERR < %t2err.log +# LLVM-STDERR: Error: .foo (3) in a group .group1 (4) is already in a group .group (2) +# RUN: FileCheck %s -check-prefix=LLVM-STDOUT < %t2out.log +# LLVM-STDOUT: Groups { +# LLVM-STDOUT-NEXT: Group { +# LLVM-STDOUT-NEXT: Name: .group +# LLVM-STDOUT-NEXT: Index: 2 +# LLVM-STDOUT-NEXT: Link: 5 +# LLVM-STDOUT-NEXT: Info: 1 +# LLVM-STDOUT-NEXT: Type: COMDAT +# LLVM-STDOUT-NEXT: Signature: bar +# LLVM-STDOUT-NEXT: Section(s) in group [ +# LLVM-STDOUT-NEXT: .foo (3) +# LLVM-STDOUT-NEXT: ] +# LLVM-STDOUT-NEXT: } +# LLVM-STDOUT-NEXT: Group { +# LLVM-STDOUT-NEXT: Name: .group1 +# LLVM-STDOUT-NEXT: Index: 4 +# LLVM-STDOUT-NEXT: Link: 5 +# LLVM-STDOUT-NEXT: Info: 2 +# LLVM-STDOUT-NEXT: Type: COMDAT +# LLVM-STDOUT-NEXT: Signature: zed +# LLVM-STDOUT-NEXT: Section(s) in group [ +# LLVM-STDOUT-NEXT: ] +# LLVM-STDOUT-NEXT: } +# LLVM-STDOUT-NEXT: } + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: bar + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 + Content: '' + - Name: .group1 + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000004 + Info: zed + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo +Symbols: + - Name: bar + Section: .group + - Name: zed + Section: .group1 diff --git a/llvm/test/tools/llvm-readobj/ELF/check-output-order.test b/llvm/test/tools/llvm-readobj/ELF/check-output-order.test new file mode 100644 index 00000000000..36fce3ac642 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/check-output-order.test @@ -0,0 +1,46 @@ +## This test checks that `--all --needed-libs` output is the same as the +## printing order in code. One common reason the output could become +## out-of-order is when more than one stream are printing at the same time. +## https://bugs.llvm.org/show_bug.cgi?id=42140 + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readelf --all --needed-libs %t | FileCheck %s + +# CHECK: ELF Header +# CHECK: Section header string table index +# CHECK: There are 5 section headers, starting at offset +# CHECK: Section Headers: +# CHECK: O (extra OS processing required) o (OS specific), p (processor specific) +# CHECK: There are no relocations in this file. +# CHECK: Symbol table '.symtab' contains 1 entries +# CHECK: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +# CHECK: Dynamic section at offset +# CHECK: 0x0000000000000000 (NULL) 0x0 +# CHECK: NeededLibraries [ +# CHECK: ] +# CHECK: Elf file type is DYN (Shared object file) +# CHECK: Entry point 0x0 +# CHECK: There are 1 program headers, starting at offset 64 +# CHECK: DYNAMIC +# CHECK: Section to Segment mapping: +# CHECK: None .symtab .strtab .shstrtab +# CHECK: There are no section groups in this file. + + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Entries: + - Tag: DT_NULL + Value: 0 +Symbols: [] +ProgramHeaders: + - Type: PT_DYNAMIC + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/demangle.test b/llvm/test/tools/llvm-readobj/ELF/demangle.test new file mode 100644 index 00000000000..29181cf1b4c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/demangle.test @@ -0,0 +1,227 @@ +## Show that llvm-readelf + llvm-readobj demangle symbol names in symbol tables +## (including dynamic symbols), relocations (including dynamic relocations), and groups. + +# RUN: yaml2obj %s > %t.so + +## Check LLVM output style. +# RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \ +# RUN: --elf-section-groups --elf-cg-profile --addrsig \ +# RUN: --demangle %t.so > %t.llvm.long +# RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \ +# RUN: --elf-section-groups --elf-cg-profile --addrsig \ +# RUN: -C %t.so > %t.llvm.short +# RUN: FileCheck %s --input-file %t.llvm.long --check-prefixes=LLVM-COMMON,LLVM-DEMANGLE +# RUN: diff %t.llvm.long %t.llvm.short + +## Check that default is no demangling. +# RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \ +# RUN: --elf-section-groups --elf-cg-profile --addrsig \ +# RUN: %t.so > %t.llvm.default +# RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \ +# RUN: --elf-section-groups --elf-cg-profile --addrsig \ +# RUN: --demangle=false %t.so > %t.llvm.nodemangle +# RUN: FileCheck %s --input-file %t.llvm.default --check-prefixes=LLVM-COMMON,LLVM-MANGLED +# RUN: diff %t.llvm.default %t.llvm.nodemangle + +# LLVM-COMMON: Relocations [ +# LLVM-COMMON: Section {{.*}} .rela.text.foo { +# LLVM-DEMANGLE-NEXT: {{ }}foo(char){{ }} +# LLVM-MANGLED-NEXT: {{ }}_Z3fooc{{ }} +# LLVM-COMMON-NEXT: } +# LLVM-COMMON: ] + +# LLVM-COMMON: Dynamic Relocations { +# LLVM-DEMANGLE-NEXT: {{ }}foo(int){{ }} +# LLVM-MANGLED-NEXT: {{ }}_Z3fooi{{ }} +# LLVM-COMMON-NEXT: } + +# LLVM-COMMON: Symbols [ +# LLVM-DEMANGLE: Name: foo(char){{ }} +# LLVM-DEMANGLE: Name: blah(float){{ }} +# LLVM-MANGLED: Name: _Z3fooc{{ }} +# LLVM-MANGLED: Name: _Z4blahf{{ }} +# LLVM-COMMON: ] + +# LLVM-COMMON: DynamicSymbols [ +# LLVM-DEMANGLE: Name: foo(int){{ }} +# LLVM-MANGLED: Name: _Z3fooi{{ }} +# LLVM-COMMON: ] + +# LLVM-COMMON: Groups { +# LLVM-DEMANGLE: Signature: foo(char){{$}} +# LLVM-MANGLED: Signature: _Z3fooc{{$}} +# LLVM-COMMON: } + +# LLVM-COMMON: CGProfile [ +# LLVM-DEMANGLE: From: foo(char){{ }} +# LLVM-DEMANGLE: To: blah(float){{ }} +# LLVM-MANGLED: From: _Z3fooc{{ }} +# LLVM-MANGLED: To: _Z4blahf{{ }} +# LLVM-COMMON: ] + +# LLVM-COMMON: Addrsig [ +# LLVM-DEMANGLE-NEXT: Sym: foo(char){{ }} +# LLVM-DEMANGLE-NEXT: Sym: blah(float){{ }} +# LLVM-MANGLED-NEXT: Sym: _Z3fooc{{ }} +# LLVM-MANGLED-NEXT: Sym: _Z4blahf{{ }} +# LLVM-COMMON-NEXT: ] + +## Check GNU output style. +# RUN: llvm-readelf --symbols --relocations --dyn-symbols --dyn-relocations \ +# RUN: --elf-section-groups --demangle %t.so > %t.gnu.long +# RUN: llvm-readelf --symbols --relocations --dyn-symbols --dyn-relocations \ +# RUN: --elf-section-groups -C %t.so > %t.gnu.short +# RUN: FileCheck %s --input-file %t.gnu.long --check-prefixes=GNU-COMMON,GNU-DEMANGLE +# RUN: diff %t.gnu.long %t.gnu.short + +## Check that default is no demangling. +# RUN: llvm-readelf --symbols --relocations --dyn-symbols --dyn-relocations \ +# RUN: --elf-section-groups %t.so > %t.gnu.default +# RUN: llvm-readelf --symbols --relocations --dyn-symbols --dyn-relocations \ +# RUN: --elf-section-groups --demangle=false %t.so > %t.gnu.nodemangle +# RUN: FileCheck %s --input-file %t.gnu.default --check-prefixes=GNU-COMMON,GNU-MANGLED +# RUN: diff %t.gnu.default %t.gnu.nodemangle + +# GNU-COMMON: Relocation section '.rela.text.foo' at offset {{.*}} contains 1 entries: +# GNU-COMMON-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# GNU-DEMANGLE-NEXT: foo(char){{ }} +# GNU-MANGLED-NEXT: _Z3fooc{{ }} + +# GNU-COMMON: 'RELA' relocation section at offset {{.*}} contains 24 bytes: +# GNU-COMMON-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# GNU-DEMANGLE-NEXT: foo(int){{ }} +# GNU-MANGLED-NEXT: _Z3fooi{{ }} + +# GNU-COMMON: Symbol table '.dynsym' contains 2 entries: +# GNU-COMMON-NEXT: Num: Value Size Type Bind Vis Ndx Name +# GNU-COMMON-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +# GNU-DEMANGLE-NEXT: foo(int){{$}} +# GNU-MANGLED-NEXT: _Z3fooi{{$}} + +# GNU-COMMON: Symbol table '.symtab' contains 3 entries: +# GNU-COMMON-NEXT: Num: Value Size Type Bind Vis Ndx Name +# GNU-COMMON-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +# GNU-DEMANGLE-NEXT: foo(char){{$}} +# GNU-DEMANGLE-NEXT: blah(float){{$}} +# GNU-MANGLED-NEXT: _Z3fooc{{$}} +# GNU-MANGLED-NEXT: _Z4blahf{{$}} + +# GNU-COMMON: COMDAT group section [{{.*}}] `.group' +# GNU-DEMANGLE-SAME: [foo(char)] +# GNU-MANGLED-SAME: [_Z3fooc] + +!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: .rela.dyn + Type: SHT_RELA + Flags: [ SHF_ALLOC ] + Link: .dynsym + Info: .text.foo + Address: 0x200 + AddressAlign: 0x100 + EntSize: 0x18 + Relocations: + - Offset: 0x10 + Symbol: _Z3fooi + Type: R_X86_64_PC32 + Addend: 0x4 + - 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_RELA + Value: 0x0000000000000200 + - Tag: DT_RELASZ + Value: 0x0000000000000018 + - Tag: DT_RELAENT + 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 + - Name: .group + Type: SHT_GROUP + Link: .symtab + Info: _Z3fooc + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .text.foo + - Name: .rela.text.foo + Type: SHT_RELA + Link: .symtab + Info: .text.foo + Relocations: + - Offset: 0x10 + Symbol: _Z3fooc + Type: R_X86_64_PC32 + - Name: .llvm.call-graph-profile + Type: SHT_LLVM_CALL_GRAPH_PROFILE + Link: .symtab + EntSize: 16 + Content: "01000000020000002000000000000000" + - Name: .llvm_addrsig + Type: SHT_LLVM_ADDRSIG + Link: .symtab + Content: "0102" +Symbols: + - Name: _Z3fooc + Type: STT_FUNC + Section: .text.foo + Binding: STB_GLOBAL + - Name: _Z4blahf + Type: STT_FUNC + Section: .text.foo + Binding: STB_GLOBAL +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: .rela.dyn + - Section: .dynamic + - Section: .text.foo + - Type: PT_DYNAMIC + Flags: [ PF_R ] + VAddr: 0x1000 + PAddr: 0x1000 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/dependent-libraries.test b/llvm/test/tools/llvm-readobj/ELF/dependent-libraries.test new file mode 100644 index 00000000000..feb56a52dae --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dependent-libraries.test @@ -0,0 +1,74 @@ +## Check that we can use the --dependent-libraries option +## to dump SHT_LLVM_DEPENDENT_LIBRARIES sections. + +## Check how we dump a file that has a single valid SHT_LLVM_DEPENDENT_LIBRARIES +## section with multiple entries. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readobj --dependent-libraries %t1 2>&1 | FileCheck %s -DFILE=%t + +# CHECK: DependentLibs [ +# CHECK-NEXT: foo +# CHECK-NEXT: bar +# CHECK-NEXT: foo +# CHECK-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .deplibs + Type: SHT_LLVM_DEPENDENT_LIBRARIES + Libraries: [ foo, bar, foo ] + +## Now, check how we dump a mix of valid, empty and invalid SHT_LLVM_DEPENDENT_LIBRARIES sections. + +# RUN: yaml2obj --docnum=2 %s -o %t2 +# RUN: llvm-readobj --dependent-libraries %t2 2>&1 | FileCheck %s --check-prefix=MIX -DFILE=%t2 + +# MIX: DependentLibs [ +# MIX-EMPTY: +# MIX-NEXT: warning: '[[FILE]]': SHT_LLVM_DEPENDENT_LIBRARIES section at index 1 is broken: the content is not null-terminated +# MIX-NEXT: abc +# MIX-EMPTY: +# MIX-NEXT: warning: '[[FILE]]': SHT_LLVM_DEPENDENT_LIBRARIES section at index 4 is broken: section [index 4] has a sh_offset (0xffff0000) + sh_size (0x4) that is greater than the file size (0x2c0) +# MIX-NEXT: bar +# MIX-NEXT: xxx +# MIX-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: +## Case 1: test we report a warning for a non-null-terminated section. + - Name: .deplibs.nonul + Type: SHT_LLVM_DEPENDENT_LIBRARIES + Content: "666f6f" ## 'f', 'o', 'o' +## Case 2: test we can dump an entry from a valid section that has a single entry. + - Name: .deplibs.single + Type: SHT_LLVM_DEPENDENT_LIBRARIES + Libraries: [ abc ] +## Case 3: test we do not display warnings for an empty section. + - Name: .deplibs.empty + Type: SHT_LLVM_DEPENDENT_LIBRARIES + Content: "" +## Case 4: test we report a warning when the section offset is invalid. + - Name: .deplibs.broken.shoffset + Type: SHT_LLVM_DEPENDENT_LIBRARIES + Libraries: [ yyy ] + ShOffset: 0xffff0000 +## Case 5: test we can dump all entries from a valid section that has more than one entry. + - Name: .deplibs.multiple + Type: SHT_LLVM_DEPENDENT_LIBRARIES + Libraries: [ bar, xxx ] + +## llvm-readelf doesn't support --dependent-libraries yet. +# RUN: llvm-readelf --dependent-libraries %t1 2>&1 | FileCheck %s --check-prefix=READELF + +# READELF: printDependentLibs not implemented! diff --git a/llvm/test/tools/llvm-readobj/ELF/dyn-symbols.test b/llvm/test/tools/llvm-readobj/ELF/dyn-symbols.test new file mode 100644 index 00000000000..bfcd821e0f9 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dyn-symbols.test @@ -0,0 +1,286 @@ +# RUN: llvm-readobj --dyn-symbols %p/Inputs/dynamic-table-so.x86 | FileCheck %s + +## Check the two-letter alias --dt is equivalent to the --dyn-symbols full flag +## name. + +# RUN: llvm-readobj --dt %p/Inputs/dynamic-table-so.x86 > %t.readobj-dt-alias +# RUN: llvm-readobj --dyn-symbols %p/Inputs/dynamic-table-so.x86 > %t.readobj-dt-no-alias +# RUN: diff %t.readobj-dt-alias %t.readobj-dt-no-alias + +# CHECK: DynamicSymbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: +# CHECK-NEXT: Value: 0x618 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local +# CHECK-NEXT: Type: Section +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .init +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: +# CHECK-NEXT: Value: 0x200DC0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local +# CHECK-NEXT: Type: Section +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .tbss +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _ITM_deregisterTMCloneTable{{ }} +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Weak +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: puts@GLIBC_2.2.5{{ }} +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: __tls_get_addr@GLIBC_2.3{{ }} +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: __gmon_start__{{ }} +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Weak +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _Jv_RegisterClasses{{ }} +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Weak +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _ITM_registerTMCloneTable{{ }} +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Weak +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: __cxa_finalize@GLIBC_2.2.5{{ }} +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Weak +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _edata{{ }} +# CHECK-NEXT: Value: 0x201030 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .data +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: foo{{ }} +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 4 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: TLS +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .tbss +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _end{{ }} +# CHECK-NEXT: Value: 0x201038 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .bss +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: __bss_start{{ }} +# CHECK-NEXT: Value: 0x201030 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: None +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .bss +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: main{{ }} +# CHECK-NEXT: Value: 0x780 +# CHECK-NEXT: Size: 59 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _init{{ }} +# CHECK-NEXT: Value: 0x618 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .init +# CHECK-NEXT: } +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: _fini{{ }} +# CHECK-NEXT: Value: 0x7BC +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Global +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .fini +# CHECK-NEXT: } +# CHECK-NEXT: ] + +## Check that we are able to dump the dynamic symbol table even when we have no program headers. +## In this case we find the table by it's type (SHT_DYNSYM) and ignore the DT_SYMTAB value. + +# RUN: yaml2obj --docnum=1 %s -o %t1.so +# RUN: llvm-readobj %t1.so --dyn-symbols | FileCheck %s --check-prefix=NOPHDRS + +# NOPHDRS: Name: foo + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Entries: + - Tag: DT_SYMTAB + Value: 0xffff1234 + - Tag: DT_NULL + Value: 0 +DynamicSymbols: + - Name: foo + +## Check we report a warning when there is no SHT_DYNSYM section and we can't map the DT_SYMTAB value +## to an address because of the absence of a corresponding PT_LOAD program header. + +# RUN: yaml2obj --docnum=2 %s -o %t2.so +# RUN: llvm-readobj %t2.so --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t2.so --check-prefix=NOSHT-DYNSYM + +# NOSHT-DYNSYM: warning: '[[FILE]]': Unable to parse DT_SYMTAB: virtual address is not in any segment: 0x0 +# NOSHT-DYNSYM: DynamicSymbols [ +# NOSHT-DYNSYM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynsym + Type: SHT_PROGBITS + - Name: .dynamic + Type: SHT_DYNAMIC + Entries: + - Tag: DT_SYMTAB + Value: 0 + - Tag: DT_NULL + Value: 0 +DynamicSymbols: + - Name: foo + +## Check that when we can't map the value of the DT_SYMTAB tag to an address, we report a warning and +## use the information in the section header table to locate the dynamic symbol table. + +# RUN: yaml2obj --docnum=3 %s -o %t3.so +# RUN: llvm-readobj %t3.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=BROKEN-DTSYMTAB + +# BROKEN-DTSYMTAB: warning: '[[FILE]]': Unable to parse DT_SYMTAB: virtual address is not in any segment: 0xffff1234 +# BROKEN-DTSYMTAB: Name: foo + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Entries: + - Tag: DT_SYMTAB + Value: 0xffff1234 + - Tag: DT_NULL + Value: 0 +DynamicSymbols: + - Name: foo +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x0000 + Sections: + - Section: .dynsym + +## Check that if we can get the location of the dynamic symbol table using both the DT_SYMTAB value +## and the section headers table then we prefer the former and report a warning. + +# RUN: yaml2obj --docnum=4 %s -o %t4.so +# RUN: llvm-readobj %t4.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefix=PREFER-DTSYMTAB + +# PREFER-DTSYMTAB: warning: '[[FILE]]': SHT_DYNSYM section header and DT_SYMTAB disagree about the location of the dynamic symbol table +# PREFER-DTSYMTAB: Name: o + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Entries: + - Tag: DT_SYMTAB + Value: 0x0 + - Tag: DT_NULL + Value: 0 + - Name: .dynsym + Type: SHT_DYNSYM + - Name: .mydynsym + Type: SHT_DYNSYM +## The Content describes 2 symbols: zero symbol and symbol with st_name == 3. + Content: "000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000" +DynamicSymbols: + - Name: foo +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x0000 + Sections: + - Section: .mydynsym diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-empty.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-empty.test new file mode 100644 index 00000000000..8759d3751c3 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-empty.test @@ -0,0 +1,29 @@ +# Show that llvm-readobj can handle an empty .dynamic section. + +# RUN: yaml2obj %s -o %t.o +# RUN: llvm-readobj --dynamic-table %t.o | FileCheck %s --check-prefix LLVM +# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --check-prefix GNU --allow-empty + +# LLVM: File: {{.*}}.o +# LLVM-NOT: DynamicSection +# GNU-NOT: {{.}} + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1000 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-malformed.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-malformed.test new file mode 100644 index 00000000000..1a31fa39e9f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-malformed.test @@ -0,0 +1,247 @@ +## 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: [<Invalid offset 0x1>] +# BAD-STRING-LLVM: 0x000000007FFFFFFF FILTER Filter library: [<Invalid offset 0x1>] +# BAD-STRING-LLVM: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [<Invalid offset 0x1>] +# BAD-STRING-LLVM: 0x000000007FFFFFFE USED Not needed object: [<Invalid offset 0x1>] +# BAD-STRING-LLVM: 0x000000000000000E SONAME Library soname: [<Invalid offset 0x1>] +# BAD-STRING-LLVM: 0x000000000000000F RPATH Library rpath: [<Invalid offset 0x1>] +# BAD-STRING-LLVM: 0x000000000000001D RUNPATH Library runpath: [<Invalid offset 0x1>] + +# BAD-STRING-GNU: 0x000000000000000a (STRSZ) 1 (bytes) +# BAD-STRING-GNU: 0x0000000000000001 (NEEDED) Shared library: [<Invalid offset 0x1>] +# BAD-STRING-GNU: 0x000000007fffffff (FILTER) Filter library: [<Invalid offset 0x1>] +# BAD-STRING-GNU: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [<Invalid offset 0x1>] +# BAD-STRING-GNU: 0x000000007ffffffe (USED) Not needed object: [<Invalid offset 0x1>] +# BAD-STRING-GNU: 0x000000000000000e (SONAME) Library soname: [<Invalid offset 0x1>] +# BAD-STRING-GNU: 0x000000000000000f (RPATH) Library rpath: [<Invalid offset 0x1>] +# BAD-STRING-GNU: 0x000000000000001d (RUNPATH) Library runpath: [<Invalid offset 0x1>] + +--- !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: <String table is empty or was not found> +# BAD-STRTAB-LLVM: 0x0000000000000001 NEEDED Shared library: [<String table is empty or was not found>] +# BAD-STRTAB-GNU: 0x0000000000000001 (NEEDED) Shared library: [<String table is empty or was not found>] +# BAD-STRTAB: NeededLibraries [ +# BAD-STRTAB: <String table is empty or was not found> +# 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 diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-no-pt-dynamic.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-no-pt-dynamic.test new file mode 100644 index 00000000000..8fa7f655249 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-no-pt-dynamic.test @@ -0,0 +1,38 @@ +## Show that dumping occurs even if there is no PT_DYNAMIC header. +## This is inconsistent with the GNU behavior, but seems to be more reasonable. +# RUN: yaml2obj %s -o %t.no-phdr +# RUN: llvm-readobj --dynamic-table %t.no-phdr | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --dynamic-table %t.no-phdr | FileCheck %s --check-prefix=GNU + +# LLVM: File: {{.*}}.no-phdr +# LLVM-NEXT: Format: ELF64-x86-64 +# LLVM-NEXT: Arch: x86_64 +# LLVM-NEXT: AddressSize: 64bit +# LLVM-NEXT: LoadName:{{ *}} +# LLVM-NEXT: DynamicSection [ (1 entries) +# LLVM-NEXT: Tag Type Name/Value +# LLVM-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM-NEXT: ] + +# GNU: Dynamic section at offset 0x78 contains 1 entries: +# GNU-NEXT: Tag Type Name/Value +# 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_NULL + Value: 0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-not-in-pt-dynamic.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-not-in-pt-dynamic.test new file mode 100644 index 00000000000..cb8da637e00 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-not-in-pt-dynamic.test @@ -0,0 +1,159 @@ +## Show that llvm-readobj/llvm-readelf tools sometimes can dump the +## dynamic table when it is not in a PT_DYNAMIC segment. + +## Case 1: The dynamic table found using the dynamic program header is corrupted +## (<size of data> % <size of dynamic entry> != 0). So the table is taken +## from the section header. + +# RUN: yaml2obj --docnum=1 %s -o %t1.o +# RUN: llvm-readobj --dynamic-table %t1.o 2>&1 \ +# RUN: | FileCheck -DFILE=%t1.o --check-prefixes=WARNING1,LLVM1 %s +# RUN: llvm-readelf --dynamic-table %t1.o 2>&1 \ +# RUN: | FileCheck -DFILE=%t1.o --check-prefixes=WARNING1,GNU1 %s + +# WARNING1: warning: '[[FILE]]': The SHT_DYNAMIC section '.dynamic' is not contained within the PT_DYNAMIC segment +# WARNING1: warning: '[[FILE]]': invalid section size (1) or entity size (16) +# WARNING1: warning: '[[FILE]]': SHT_DYNAMIC section header and PT_DYNAMIC program header disagree about the location of the dynamic table +# WARNING1: warning: '[[FILE]]': PT_DYNAMIC dynamic table is invalid: SHT_DYNAMIC will be used + +# LLVM1: DynamicSection [ (2 entries) +# LLVM1-NEXT: Tag Type Name/Value +# LLVM1-NEXT: 0x0000000000000018 BIND_NOW 0x1 +# LLVM1-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM1-NEXT: ] + +# GNU1: Dynamic section at offset 0x{{.*}} contains 2 entries: +# GNU1-NEXT: Tag Type Name/Value +# GNU1-NEXT: 0x0000000000000018 (BIND_NOW) 0x1 +# GNU1-NEXT: 0x0000000000000000 (NULL) 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [SHF_ALLOC] + Address: 0x1000 + AddressAlign: 0x1000 + Entries: + - Tag: DT_BIND_NOW + Value: 0x1 + - Tag: DT_NULL + Value: 0x0 + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Address: 0x1100 + AddressAlign: 0x100 + Content: "00" +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Section: .text + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .text + +## Case 2: The dynamic table found using the dynamic program header is different from the +## table found using the section header table. + +# RUN: yaml2obj --docnum=2 %s -o %t2.o +# RUN: llvm-readobj --dynamic-table %t2.o 2>&1 \ +# RUN: | FileCheck -DFILE=%t2.o --check-prefixes=WARNING2,LLVM2 %s +# RUN: llvm-readelf --dynamic-table %t2.o 2>&1 \ +# RUN: | FileCheck -DFILE=%t2.o --check-prefixes=WARNING2,GNU2 %s + +# WARNING2: warning: '[[FILE]]': The SHT_DYNAMIC section '.dynamic' is not contained within the PT_DYNAMIC segment +# WARNING2: warning: '[[FILE]]': SHT_DYNAMIC section header and PT_DYNAMIC program header disagree about the location of the dynamic table + +# LLVM2: DynamicSection [ (1 entries) +# LLVM2-NEXT: Tag Type Name/Value +# LLVM2-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM2-NEXT: ] + +# GNU2: Dynamic section at offset 0x{{.*}} contains 1 entries: +# GNU2-NEXT: Tag Type Name/Value +# GNU2-NEXT: 0x0000000000000000 (NULL) 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [SHF_ALLOC] + Address: 0x1000 + AddressAlign: 0x1000 + Entries: + - Tag: DT_BIND_NOW + Value: 0x1 + - Tag: DT_NULL + Value: 0x0 + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Address: 0x1100 + AddressAlign: 0x100 + Content: "00000000000000000000000000000000" +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Section: .text + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .text + +## Case 3: Both dynamic tables found using SHT_DYNAMIC/PT_DYNAMIC are corrupted. + +# RUN: yaml2obj --docnum=3 %s -o %t3.o +# RUN: llvm-readobj --dynamic-table %t3.o 2>&1 \ +# RUN: | FileCheck -DFILE=%t3.o --check-prefix=WARNING3 --implicit-check-not="Dynamic" %s +# RUN: llvm-readelf --dynamic-table %t3.o 2>&1 \ +# RUN: | FileCheck -DFILE=%t3.o --check-prefix=WARNING3 --implicit-check-not="Dynamic" %s + +# WARNING3: warning: '[[FILE]]': invalid section size (1) or entity size (16) +# WARNING3: warning: '[[FILE]]': SHT_DYNAMIC section header and PT_DYNAMIC program header disagree about the location of the dynamic table +# WARNING3: warning: '[[FILE]]': no valid dynamic table was found + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [SHF_ALLOC] + Address: 0x1000 + AddressAlign: 0x1000 + Content: "00" + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Address: 0x1100 + AddressAlign: 0x100 + Content: "00" +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Section: .text + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .text diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-table-dtnull.s b/llvm/test/tools/llvm-readobj/ELF/dynamic-table-dtnull.s new file mode 100644 index 00000000000..b613e4137d1 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-table-dtnull.s @@ -0,0 +1,87 @@ +# Check we are able to dump the dynamic section without a DT_NULL entry correctly. + +# RUN: yaml2obj -docnum=1 %s -o %t.o +# RUN: llvm-readobj --dynamic-table %t.o | FileCheck %s --check-prefix=NONULL-LLVM +# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --check-prefix=NONULL-GNU + +# NONULL-LLVM: DynamicSection [ (1 entries) +# NONULL-LLVM-NEXT: Tag Type Name/Value +# NONULL-LLVM-NEXT: 0x0000000000000015 DEBUG 0x0 +# NONULL-LLVM-NEXT: ] + +# NONULL-GNU: Dynamic section at offset {{.*}} contains 1 entries: +# NONULL-GNU-NEXT: Tag Type Name/Value +# NONULL-GNU-NEXT: 0x0000000000000015 (DEBUG) 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x0000000000001010 + AddressAlign: 0x0000000000000010 + EntSize: 0x0000000000000010 + Entries: + - Tag: DT_DEBUG + Value: 0x0000000000000000 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1010 + Sections: + - Section: .dynamic + +# Sometimes .dynamic section content length can be greater than the +# length of its entries. In this case, we should not try to dump anything +# past the DT_NULL entry, which works as a terminator. + +# RUN: yaml2obj -docnum=2 %s -o %t.o +# RUN: llvm-readobj --dynamic-table %t.o | FileCheck %s --check-prefix=LONG-LLVM +# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --check-prefix=LONG-GNU + +# LONG-LLVM: DynamicSection [ (2 entries) +# LONG-LLVM-NEXT: Tag Type Name/Value +# LONG-LLVM-NEXT: 0x0000000000000015 DEBUG 0x0 +# LONG-LLVM-NEXT: 0x0000000000000000 NULL 0x0 +# LONG-LLVM-NEXT: ] + +# LONG-GNU: Dynamic section at offset {{.*}} contains 2 entries: +# LONG-GNU-NEXT: Tag Type Name/Value +# LONG-GNU-NEXT: 0x0000000000000015 (DEBUG) 0x0 +# LONG-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: 0x0000000000001010 + AddressAlign: 0x0000000000000010 + EntSize: 0x0000000000000010 + Entries: + - Tag: DT_DEBUG + Value: 0x0000000000000000 + - Tag: DT_NULL + Value: 0x0000000000000000 + - Tag: DT_NULL + Value: 0x0000000000000000 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1010 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test new file mode 100644 index 00000000000..cebb1cbac72 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test @@ -0,0 +1,196 @@ +# Test that hexagon machine-specific tags can be dumped. +# RUN: yaml2obj --docnum=1 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.hex +# RUN: llvm-readobj --dynamic-table %t.hex | FileCheck %s --check-prefix=LLVM-HEXAGON +# RUN: llvm-readelf --dynamic-table %t.hex | FileCheck %s --check-prefix=GNU-HEXAGON + +# LLVM-HEXAGON: DynamicSection [ (6 entries) +# LLVM-HEXAGON-NEXT: Tag Type Name/Value +# LLVM-HEXAGON-NEXT: 0x0000000000000004 HASH 0x1000 +# LLVM-HEXAGON-NEXT: 0x0000000070000000 HEXAGON_SYMSZ 0x10 +# LLVM-HEXAGON-NEXT: 0x0000000070000001 HEXAGON_VER 4096 +# LLVM-HEXAGON-NEXT: 0x0000000070000002 HEXAGON_PLT 0x1000 +# LLVM-HEXAGON-NEXT: 0x000000001234ABCD unknown 0x1 +# LLVM-HEXAGON-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM-HEXAGON-NEXT: ] + +# GNU-HEXAGON: Dynamic section at offset {{.*}} contains 6 entries: +# GNU-HEXAGON-NEXT: Tag Type Name/Value +# GNU-HEXAGON-NEXT: 0x0000000000000004 (HASH) 0x1000 +# GNU-HEXAGON-NEXT: 0x0000000070000000 (HEXAGON_SYMSZ) 0x10 +# GNU-HEXAGON-NEXT: 0x0000000070000001 (HEXAGON_VER) 4096 +# GNU-HEXAGON-NEXT: 0x0000000070000002 (HEXAGON_PLT) 0x1000 +# GNU-HEXAGON-NEXT: 0x000000001234abcd (unknown) 0x1 +# GNU-HEXAGON-NEXT: 0x0000000000000000 (NULL) 0x0 + + +# Test that MIPS machine-specific tags can be dumped. +# RUN: yaml2obj --docnum=2 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.mips +# RUN: llvm-readobj --dynamic-table %t.mips | FileCheck %s --check-prefix=LLVM-MIPS +# RUN: llvm-readelf --dynamic-table %t.mips | FileCheck %s --check-prefix=GNU-MIPS + +# LLVM-MIPS: DynamicSection [ (48 entries) +# LLVM-MIPS-NEXT: Tag Type Name/Value +# LLVM-MIPS-NEXT: 0x0000000000000004 HASH 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000001 MIPS_RLD_VERSION 305419896 +# LLVM-MIPS-NEXT: 0x0000000070000002 MIPS_TIME_STAMP 0x11223344 +# LLVM-MIPS-NEXT: 0x0000000070000003 MIPS_ICHECKSUM 0x11112222 +# LLVM-MIPS-NEXT: 0x0000000070000004 MIPS_IVERSION 0x1 +# LLVM-MIPS-NEXT: 0x0000000070000005 MIPS_FLAGS QUICKSTART SGI_ONLY PIXIE CORD +# LLVM-MIPS-NEXT: 0x0000000070000006 MIPS_BASE_ADDRESS 0x87654321 +# LLVM-MIPS-NEXT: 0x0000000070000007 MIPS_MSYM 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000008 MIPS_CONFLICT 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000009 MIPS_LIBLIST 0x1000 +# LLVM-MIPS-NEXT: 0x000000007000000A MIPS_LOCAL_GOTNO 1 +# LLVM-MIPS-NEXT: 0x000000007000000B MIPS_CONFLICTNO 0x1 +# LLVM-MIPS-NEXT: 0x0000000070000010 MIPS_LIBLISTNO 0x1 +# LLVM-MIPS-NEXT: 0x0000000070000011 MIPS_SYMTABNO 1 +# LLVM-MIPS-NEXT: 0x0000000070000012 MIPS_UNREFEXTNO 0 +# LLVM-MIPS-NEXT: 0x0000000070000013 MIPS_GOTSYM 0x0 +# LLVM-MIPS-NEXT: 0x0000000070000014 MIPS_HIPAGENO 0x88776655 +# LLVM-MIPS-NEXT: 0x0000000070000016 MIPS_RLD_MAP 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000017 MIPS_DELTA_CLASS 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000018 MIPS_DELTA_CLASS_NO 0x1 +# LLVM-MIPS-NEXT: 0x0000000070000019 MIPS_DELTA_INSTANCE 0x1000 +# LLVM-MIPS-NEXT: 0x000000007000001A MIPS_DELTA_INSTANCE_NO0x1 +# LLVM-MIPS-NEXT: 0x000000007000001B MIPS_DELTA_RELOC 0x1000 +# LLVM-MIPS-NEXT: 0x000000007000001C MIPS_DELTA_RELOC_NO 0x1 +# LLVM-MIPS-NEXT: 0x000000007000001D MIPS_DELTA_SYM 0x1000 +# LLVM-MIPS-NEXT: 0x000000007000001E MIPS_DELTA_SYM_NO 0x1 +# LLVM-MIPS-NEXT: 0x0000000070000020 MIPS_DELTA_CLASSSYM 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000021 MIPS_DELTA_CLASSSYM_NO0x1 +# LLVM-MIPS-NEXT: 0x0000000070000022 MIPS_CXX_FLAGS 0x88887777 +# LLVM-MIPS-NEXT: 0x0000000070000023 MIPS_PIXIE_INIT 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000025 MIPS_LOCALPAGE_GOTIDX0x1 +# LLVM-MIPS-NEXT: 0x0000000070000026 MIPS_LOCAL_GOTIDX 0x1 +# LLVM-MIPS-NEXT: 0x0000000070000027 MIPS_HIDDEN_GOTIDX 0x1 +# LLVM-MIPS-NEXT: 0x0000000070000028 MIPS_PROTECTED_GOTIDX0x1 +# LLVM-MIPS-NEXT: 0x0000000070000029 MIPS_OPTIONS 0x1000 +# LLVM-MIPS-NEXT: 0x000000007000002A MIPS_INTERFACE 0x1000 +# LLVM-MIPS-NEXT: 0x000000007000002B MIPS_DYNSTR_ALIGN 0x88888888 +# LLVM-MIPS-NEXT: 0x000000007000002C MIPS_INTERFACE_SIZE 0x10 +# LLVM-MIPS-NEXT: 0x000000007000002D MIPS_RLD_TEXT_RESOLVE_ADDR0x8 +# LLVM-MIPS-NEXT: 0x000000007000002E MIPS_PERF_SUFFIX 0x0 +# LLVM-MIPS-NEXT: 0x000000007000002F MIPS_COMPACT_SIZE 0x10 +# LLVM-MIPS-NEXT: 0x0000000070000030 MIPS_GP_VALUE 0x1 +# LLVM-MIPS-NEXT: 0x0000000070000031 MIPS_AUX_DYNAMIC 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000032 MIPS_PLTGOT 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000034 MIPS_RWPLT 0x1000 +# LLVM-MIPS-NEXT: 0x0000000070000035 MIPS_RLD_MAP_REL 0x1000 +# LLVM-MIPS-NEXT: 0x000000001234ABCD unknown 0x1 +# LLVM-MIPS-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM-MIPS-NEXT: ] + +# GNU-MIPS: Dynamic section at offset {{.*}} contains 48 entries: +# GNU-MIPS-NEXT: Tag Type Name/Value +# GNU-MIPS-NEXT: 0x0000000000000004 (HASH) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000001 (MIPS_RLD_VERSION) 305419896 +# GNU-MIPS-NEXT: 0x0000000070000002 (MIPS_TIME_STAMP) 0x11223344 +# GNU-MIPS-NEXT: 0x0000000070000003 (MIPS_ICHECKSUM) 0x11112222 +# GNU-MIPS-NEXT: 0x0000000070000004 (MIPS_IVERSION) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000005 (MIPS_FLAGS) QUICKSTART SGI_ONLY PIXIE CORD +# GNU-MIPS-NEXT: 0x0000000070000006 (MIPS_BASE_ADDRESS) 0x87654321 +# GNU-MIPS-NEXT: 0x0000000070000007 (MIPS_MSYM) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000008 (MIPS_CONFLICT) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000009 (MIPS_LIBLIST) 0x1000 +# GNU-MIPS-NEXT: 0x000000007000000a (MIPS_LOCAL_GOTNO) 1 +# GNU-MIPS-NEXT: 0x000000007000000b (MIPS_CONFLICTNO) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000010 (MIPS_LIBLISTNO) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000011 (MIPS_SYMTABNO) 1 +# GNU-MIPS-NEXT: 0x0000000070000012 (MIPS_UNREFEXTNO) 0 +# GNU-MIPS-NEXT: 0x0000000070000013 (MIPS_GOTSYM) 0x0 +# GNU-MIPS-NEXT: 0x0000000070000014 (MIPS_HIPAGENO) 0x88776655 +# GNU-MIPS-NEXT: 0x0000000070000016 (MIPS_RLD_MAP) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000017 (MIPS_DELTA_CLASS) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000018 (MIPS_DELTA_CLASS_NO) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000019 (MIPS_DELTA_INSTANCE) 0x1000 +# GNU-MIPS-NEXT: 0x000000007000001a (MIPS_DELTA_INSTANCE_NO) 0x1 +# GNU-MIPS-NEXT: 0x000000007000001b (MIPS_DELTA_RELOC) 0x1000 +# GNU-MIPS-NEXT: 0x000000007000001c (MIPS_DELTA_RELOC_NO) 0x1 +# GNU-MIPS-NEXT: 0x000000007000001d (MIPS_DELTA_SYM) 0x1000 +# GNU-MIPS-NEXT: 0x000000007000001e (MIPS_DELTA_SYM_NO) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000020 (MIPS_DELTA_CLASSSYM) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000021 (MIPS_DELTA_CLASSSYM_NO) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000022 (MIPS_CXX_FLAGS) 0x88887777 +# GNU-MIPS-NEXT: 0x0000000070000023 (MIPS_PIXIE_INIT) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000025 (MIPS_LOCALPAGE_GOTIDX) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000026 (MIPS_LOCAL_GOTIDX) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000027 (MIPS_HIDDEN_GOTIDX) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000028 (MIPS_PROTECTED_GOTIDX) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000029 (MIPS_OPTIONS) 0x1000 +# GNU-MIPS-NEXT: 0x000000007000002a (MIPS_INTERFACE) 0x1000 +# GNU-MIPS-NEXT: 0x000000007000002b (MIPS_DYNSTR_ALIGN) 0x88888888 +# GNU-MIPS-NEXT: 0x000000007000002c (MIPS_INTERFACE_SIZE) 0x10 +# GNU-MIPS-NEXT: 0x000000007000002d (MIPS_RLD_TEXT_RESOLVE_ADDR) 0x8 +# GNU-MIPS-NEXT: 0x000000007000002e (MIPS_PERF_SUFFIX) 0x0 +# GNU-MIPS-NEXT: 0x000000007000002f (MIPS_COMPACT_SIZE) 0x10 +# GNU-MIPS-NEXT: 0x0000000070000030 (MIPS_GP_VALUE) 0x1 +# GNU-MIPS-NEXT: 0x0000000070000031 (MIPS_AUX_DYNAMIC) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000032 (MIPS_PLTGOT) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000034 (MIPS_RWPLT) 0x1000 +# GNU-MIPS-NEXT: 0x0000000070000035 (MIPS_RLD_MAP_REL) 0x1000 +# GNU-MIPS-NEXT: 0x000000001234abcd (unknown) 0x1 +# GNU-MIPS-NEXT: 0x0000000000000000 (NULL) 0x0 + + +# Test that PPC machine-specific tags can be dumped. +# RUN: yaml2obj --docnum=3 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.ppc +# RUN: llvm-readobj --dynamic-table %t.ppc | FileCheck %s --check-prefix=LLVM-PPC +# RUN: llvm-readelf --dynamic-table %t.ppc | FileCheck %s --check-prefix=GNU-PPC + +# LLVM-PPC: DynamicSection [ (4 entries) +# LLVM-PPC-NEXT: Tag Type Name/Value +# LLVM-PPC-NEXT: 0x70000000 PPC_GOT 0x200C0 +# LLVM-PPC-NEXT: 0x70000001 PPC_OPT 0x1 +# LLVM-PPC-NEXT: 0x1234ABCD unknown 0x1 +# LLVM-PPC-NEXT: 0x00000000 NULL 0x0 +# LLVM-PPC-NEXT: ] + +# GNU-PPC: Dynamic section at offset {{.*}} contains 4 entries: +# GNU-PPC-NEXT: Tag Type Name/Value +# GNU-PPC-NEXT: 0x70000000 (PPC_GOT) 0x200c0 +# GNU-PPC-NEXT: 0x70000001 (PPC_OPT) 0x1 +# GNU-PPC-NEXT: 0x1234abcd (unknown) 0x1 +# GNU-PPC-NEXT: 0x00000000 (NULL) 0x0 + + +# Test that PPC64 machine-specific tags can be dumped. +# RUN: yaml2obj --docnum=4 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.ppc64 +# RUN: llvm-readobj --dynamic-table %t.ppc64 | FileCheck %s --check-prefix=LLVM-PPC64 +# RUN: llvm-readelf --dynamic-table %t.ppc64 | FileCheck %s --check-prefix=GNU-PPC64 + +# LLVM-PPC64: DynamicSection [ (4 entries) +# LLVM-PPC64-NEXT: Tag Type Name/Value +# LLVM-PPC64-NEXT: 0x0000000000000004 HASH 0x1000 +# LLVM-PPC64-NEXT: 0x0000000070000000 PPC64_GLINK 0x1000 +# LLVM-PPC64-NEXT: 0x000000001234ABCD unknown 0x1 +# LLVM-PPC64-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM-PPC64-NEXT: ] + +# GNU-PPC64: Dynamic section at offset {{.*}} contains 4 entries: +# GNU-PPC64-NEXT: Tag Type Name/Value +# GNU-PPC64-NEXT: 0x0000000000000004 (HASH) 0x1000 +# GNU-PPC64-NEXT: 0x0000000070000000 (PPC64_GLINK) 0x1000 +# GNU-PPC64-NEXT: 0x000000001234abcd (unknown) 0x1 +# GNU-PPC64-NEXT: 0x0000000000000000 (NULL) 0x0 + +# Test that AARCH64 machine-specific tags can be dumped. +# RUN: yaml2obj --docnum=5 %S/Inputs/elf-dynamic-tags-machine-specific.yaml -o %t.aarch64 +# RUN: llvm-readobj --dynamic-table %t.aarch64 | FileCheck %s --check-prefix=LLVM-AARCH64 +# RUN: llvm-readelf --dynamic-table %t.aarch64 | FileCheck %s --check-prefix=GNU-AARCH64 + +# LLVM-AARCH64: DynamicSection [ (5 entries) +# LLVM-AARCH64-NEXT: Tag Type Name/Value +# LLVM-AARCH64-NEXT: 0x0000000000000004 HASH 0x1000 +# LLVM-AARCH64-NEXT: 0x0000000070000001 AARCH64_BTI_PLT 0 +# LLVM-AARCH64-NEXT: 0x0000000070000003 AARCH64_PAC_PLT 0 +# LLVM-AARCH64-NEXT: 0x000000001234ABCD unknown 0x1 +# LLVM-AARCH64-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM-AARCH64-NEXT:] + +# GNU-AARCH64: Dynamic section at offset {{.*}} contains 5 entries: +# GNU-AARCH64-NEXT: Tag Type Name/Value +# GNU-AARCH64-NEXT: 0x0000000000000004 (HASH) 0x1000 +# GNU-AARCH64-NEXT: 0x0000000070000001 (AARCH64_BTI_PLT) 0 +# GNU-AARCH64-NEXT: 0x0000000070000003 (AARCH64_PAC_PLT) 0 +# GNU-AARCH64-NEXT: 0x000000001234abcd (unknown) 0x1 +# GNU-AARCH64-NEXT: 0x0000000000000000 (NULL) 0x0 diff --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test new file mode 100644 index 00000000000..bbf9f798cc6 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test @@ -0,0 +1,287 @@ +## Show that all non-machine specific tags can be read and printed correctly. +## Also show that -d is an alias for --dynamic-table. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj --dynamic-table %t | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readobj -d %t | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --dynamic-table %t | FileCheck %s --check-prefix=GNU +# RUN: llvm-readelf -d %t | FileCheck %s --check-prefix=GNU + +# LLVM: DynamicSection [ (61 entries) +# LLVM-NEXT: Tag Type Name/Value +# LLVM-NEXT: 0x0000000000000001 NEEDED Shared library: [D] +# LLVM-NEXT: 0x0000000000000002 PLTRELSZ 16 (bytes) +# LLVM-NEXT: 0x0000000000000003 PLTGOT 0x1000 +# LLVM-NEXT: 0x0000000000000004 HASH 0x1000 +# LLVM-NEXT: 0x0000000000000005 STRTAB 0x1000 +# LLVM-NEXT: 0x0000000000000006 SYMTAB 0x1000 +# LLVM-NEXT: 0x0000000000000007 RELA 0x1000 +# LLVM-NEXT: 0x0000000000000008 RELASZ 16 (bytes) +# LLVM-NEXT: 0x0000000000000009 RELAENT 1929 (bytes) +# LLVM-NEXT: 0x000000000000000A STRSZ 16 (bytes) +# LLVM-NEXT: 0x000000000000000B SYMENT 2439 (bytes) +# LLVM-NEXT: 0x000000000000000C INIT 0x1000 +# LLVM-NEXT: 0x000000000000000D FINI 0x1000 +# LLVM-NEXT: 0x000000000000000E SONAME Library soname: [U] +# LLVM-NEXT: 0x000000000000000F RPATH Library rpath: [f] +# LLVM-NEXT: 0x0000000000000010 SYMBOLIC 0x1234567890ABCDEF +# LLVM-NEXT: 0x0000000000000011 REL 0x1000 +# LLVM-NEXT: 0x0000000000000012 RELSZ 16 (bytes) +# LLVM-NEXT: 0x0000000000000013 RELENT 291 (bytes) +# LLVM-NEXT: 0x0000000000000014 PLTREL RELA +# LLVM-NEXT: 0x0000000000000015 DEBUG 0xFEDCBA0987654321 +# LLVM-NEXT: 0x0000000000000016 TEXTREL 0x1122334455667788 +# LLVM-NEXT: 0x0000000000000017 JMPREL 0x1000 +# LLVM-NEXT: 0x0000000000000018 BIND_NOW 0x8877665544332211 +# LLVM-NEXT: 0x0000000000000019 INIT_ARRAY 0x1000 +# LLVM-NEXT: 0x000000000000001A FINI_ARRAY 0x1000 +# LLVM-NEXT: 0x000000000000001B INIT_ARRAYSZ 16 (bytes) +# LLVM-NEXT: 0x000000000000001C FINI_ARRAYSZ 16 (bytes) +# LLVM-NEXT: 0x000000000000001D RUNPATH Library runpath: [w] +# LLVM-NEXT: 0x000000000000001E FLAGS ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS {{$}} +# LLVM-NEXT: 0x0000000000000020 PREINIT_ARRAY 0x1000 +# LLVM-NEXT: 0x0000000000000021 PREINIT_ARRAYSZ 16 (bytes) +# LLVM-NEXT: 0x0000000000000022 SYMTAB_SHNDX 0x1000 +# LLVM-NEXT: 0x0000000000000023 RELRSZ 0x10 +# LLVM-NEXT: 0x0000000000000024 RELR 0x1000 +# LLVM-NEXT: 0x0000000000000025 RELRENT 0x4321 +# LLVM-NEXT: 0x000000006000000F ANDROID_REL 0x1000 +# LLVM-NEXT: 0x0000000060000010 ANDROID_RELSZ 16 (bytes) +# LLVM-NEXT: 0x0000000060000011 ANDROID_RELA 0x1000 +# LLVM-NEXT: 0x0000000060000012 ANDROID_RELASZ 16 (bytes) +# LLVM-NEXT: 0x000000006FFFE000 ANDROID_RELR 0x1000 +# LLVM-NEXT: 0x000000006FFFE001 ANDROID_RELRSZ 0x10 +# LLVM-NEXT: 0x000000006FFFE003 ANDROID_RELRENT 0x1234 +# LLVM-NEXT: 0x000000006FFFFEF5 GNU_HASH 0x1000 +# LLVM-NEXT: 0x000000006FFFFEF6 TLSDESC_PLT 0x1000 +# LLVM-NEXT: 0x000000006FFFFEF7 TLSDESC_GOT 0x1000 +# LLVM-NEXT: 0x000000006FFFFFF9 RELACOUNT 0 +# LLVM-NEXT: 0x000000006FFFFFFA RELCOUNT 0 +# LLVM-NEXT: 0x000000006FFFFFFB FLAGS_1 NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON {{$}} +# LLVM-NEXT: 0x000000006FFFFFF0 VERSYM 0x1000 +# LLVM-NEXT: 0x000000006FFFFFFC VERDEF 0x1000 +# LLVM-NEXT: 0x000000006FFFFFFD VERDEFNUM 0 +# LLVM-NEXT: 0x000000006FFFFFFE VERNEED 0x1000 +# LLVM-NEXT: 0x000000006FFFFFFF VERNEEDNUM 0 +# LLVM-NEXT: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [D] +# LLVM-NEXT: 0x000000007FFFFFFE USED Not needed object: [U] +# LLVM-NEXT: 0x000000007FFFFFFF FILTER Filter library: [U] +# LLVM-NEXT: 0x0000000012345678 unknown 0x8765432187654321 +# LLVM-NEXT: 0x000000006ABCDEF0 unknown 0x9988776655443322 +# LLVM-NEXT: 0x0000000076543210 unknown 0x5555666677778888 +# LLVM-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM-NEXT: ] + +# GNU: Dynamic section at offset {{.*}} contains 61 entries: +# GNU-NEXT: Tag Type Name/Value +# GNU-NEXT: 0x0000000000000001 (NEEDED) Shared library: [D] +# GNU-NEXT: 0x0000000000000002 (PLTRELSZ) 16 (bytes) +# GNU-NEXT: 0x0000000000000003 (PLTGOT) 0x1000 +# GNU-NEXT: 0x0000000000000004 (HASH) 0x1000 +# GNU-NEXT: 0x0000000000000005 (STRTAB) 0x1000 +# GNU-NEXT: 0x0000000000000006 (SYMTAB) 0x1000 +# GNU-NEXT: 0x0000000000000007 (RELA) 0x1000 +# GNU-NEXT: 0x0000000000000008 (RELASZ) 16 (bytes) +# GNU-NEXT: 0x0000000000000009 (RELAENT) 1929 (bytes) +# GNU-NEXT: 0x000000000000000a (STRSZ) 16 (bytes) +# GNU-NEXT: 0x000000000000000b (SYMENT) 2439 (bytes) +# GNU-NEXT: 0x000000000000000c (INIT) 0x1000 +# GNU-NEXT: 0x000000000000000d (FINI) 0x1000 +# GNU-NEXT: 0x000000000000000e (SONAME) Library soname: [U] +# GNU-NEXT: 0x000000000000000f (RPATH) Library rpath: [f] +# GNU-NEXT: 0x0000000000000010 (SYMBOLIC) 0x1234567890abcdef +# GNU-NEXT: 0x0000000000000011 (REL) 0x1000 +# GNU-NEXT: 0x0000000000000012 (RELSZ) 16 (bytes) +# GNU-NEXT: 0x0000000000000013 (RELENT) 291 (bytes) +# GNU-NEXT: 0x0000000000000014 (PLTREL) RELA +# GNU-NEXT: 0x0000000000000015 (DEBUG) 0xfedcba0987654321 +# GNU-NEXT: 0x0000000000000016 (TEXTREL) 0x1122334455667788 +# GNU-NEXT: 0x0000000000000017 (JMPREL) 0x1000 +# GNU-NEXT: 0x0000000000000018 (BIND_NOW) 0x8877665544332211 +# GNU-NEXT: 0x0000000000000019 (INIT_ARRAY) 0x1000 +# GNU-NEXT: 0x000000000000001a (FINI_ARRAY) 0x1000 +# GNU-NEXT: 0x000000000000001b (INIT_ARRAYSZ) 16 (bytes) +# GNU-NEXT: 0x000000000000001c (FINI_ARRAYSZ) 16 (bytes) +# GNU-NEXT: 0x000000000000001d (RUNPATH) Library runpath: [w] +# GNU-NEXT: 0x000000000000001e (FLAGS) ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS {{$}} +# GNU-NEXT: 0x0000000000000020 (PREINIT_ARRAY) 0x1000 +# GNU-NEXT: 0x0000000000000021 (PREINIT_ARRAYSZ) 16 (bytes) +# GNU-NEXT: 0x0000000000000022 (SYMTAB_SHNDX) 0x1000 +# GNU-NEXT: 0x0000000000000023 (RELRSZ) 0x10 +# GNU-NEXT: 0x0000000000000024 (RELR) 0x1000 +# GNU-NEXT: 0x0000000000000025 (RELRENT) 0x4321 +# GNU-NEXT: 0x000000006000000f (ANDROID_REL) 0x1000 +# GNU-NEXT: 0x0000000060000010 (ANDROID_RELSZ) 16 (bytes) +# GNU-NEXT: 0x0000000060000011 (ANDROID_RELA) 0x1000 +# GNU-NEXT: 0x0000000060000012 (ANDROID_RELASZ) 16 (bytes) +# GNU-NEXT: 0x000000006fffe000 (ANDROID_RELR) 0x1000 +# GNU-NEXT: 0x000000006fffe001 (ANDROID_RELRSZ) 0x10 +# GNU-NEXT: 0x000000006fffe003 (ANDROID_RELRENT) 0x1234 +# GNU-NEXT: 0x000000006ffffef5 (GNU_HASH) 0x1000 +# GNU-NEXT: 0x000000006ffffef6 (TLSDESC_PLT) 0x1000 +# GNU-NEXT: 0x000000006ffffef7 (TLSDESC_GOT) 0x1000 +# GNU-NEXT: 0x000000006ffffff9 (RELACOUNT) 0 +# GNU-NEXT: 0x000000006ffffffa (RELCOUNT) 0 +# GNU-NEXT: 0x000000006ffffffb (FLAGS_1) NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON {{$}} +# GNU-NEXT: 0x000000006ffffff0 (VERSYM) 0x1000 +# GNU-NEXT: 0x000000006ffffffc (VERDEF) 0x1000 +# GNU-NEXT: 0x000000006ffffffd (VERDEFNUM) 0 +# GNU-NEXT: 0x000000006ffffffe (VERNEED) 0x1000 +# GNU-NEXT: 0x000000006fffffff (VERNEEDNUM) 0 +# GNU-NEXT: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [D] +# GNU-NEXT: 0x000000007ffffffe (USED) Not needed object: [U] +# GNU-NEXT: 0x000000007fffffff (FILTER) Filter library: [U] +# GNU-NEXT: 0x0000000012345678 (unknown) 0x8765432187654321 +# GNU-NEXT: 0x000000006abcdef0 (unknown) 0x9988776655443322 +# GNU-NEXT: 0x0000000076543210 (unknown) 0x5555666677778888 +# GNU-NEXT: 0x0000000000000000 (NULL) 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Address: 0x1000 + Size: 0x10 + Content: "004400550066007700" + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1010 + Entries: + - Tag: DT_NEEDED + Value: 0x1 + - Tag: DT_PLTRELSZ + Value: 0x10 + - Tag: DT_PLTGOT + Value: 0x1000 + - Tag: DT_HASH + Value: 0x1000 + - Tag: DT_STRTAB + Value: 0x1000 + - Tag: DT_SYMTAB + Value: 0x1000 + - Tag: DT_RELA + Value: 0x1000 + - Tag: DT_RELASZ + Value: 0x10 + - Tag: DT_RELAENT + Value: 0x789 + - Tag: DT_STRSZ + Value: 0x10 + - Tag: DT_SYMENT + Value: 0x987 + - Tag: DT_INIT + Value: 0x1000 + - Tag: DT_FINI + Value: 0x1000 + - Tag: DT_SONAME + Value: 0x3 + - Tag: DT_RPATH + Value: 0x5 + - Tag: DT_SYMBOLIC + Value: 0x1234567890abcdef + - Tag: DT_REL + Value: 0x1000 + - Tag: DT_RELSZ + Value: 0x10 + - Tag: DT_RELENT + Value: 0x123 + - Tag: DT_PLTREL + Value: 0x7 + - Tag: DT_DEBUG + Value: 0xfedcba0987654321 + - Tag: DT_TEXTREL + Value: 0x1122334455667788 + - Tag: DT_JMPREL + Value: 0x1000 + - Tag: DT_BIND_NOW + Value: 0x8877665544332211 + - Tag: DT_INIT_ARRAY + Value: 0x1000 + - Tag: DT_FINI_ARRAY + Value: 0x1000 + - Tag: DT_INIT_ARRAYSZ + Value: 0x10 + - Tag: DT_FINI_ARRAYSZ + Value: 0x10 + - Tag: DT_RUNPATH + Value: 0x7 + - Tag: DT_FLAGS + Value: 0xffffffffffffffff + - Tag: DT_PREINIT_ARRAY + Value: 0x1000 + - Tag: DT_PREINIT_ARRAYSZ + Value: 0x10 + - Tag: DT_SYMTAB_SHNDX + Value: 0x1000 + - Tag: DT_RELRSZ + Value: 0x10 + - Tag: DT_RELR + Value: 0x1000 + - Tag: DT_RELRENT + Value: 0x4321 + - Tag: DT_ANDROID_REL + Value: 0x1000 + - Tag: DT_ANDROID_RELSZ + Value: 0x10 + - Tag: DT_ANDROID_RELA + Value: 0x1000 + - Tag: DT_ANDROID_RELASZ + Value: 0x10 + - Tag: DT_ANDROID_RELR + Value: 0x1000 + - Tag: DT_ANDROID_RELRSZ + Value: 0x10 + - Tag: DT_ANDROID_RELRENT + Value: 0x1234 + - Tag: DT_GNU_HASH + Value: 0x1000 + - Tag: DT_TLSDESC_PLT + Value: 0x1000 + - Tag: DT_TLSDESC_GOT + Value: 0x1000 + - Tag: DT_RELACOUNT + Value: 0x0 + - Tag: DT_RELCOUNT + Value: 0x0 + - Tag: DT_FLAGS_1 + Value: 0xffffffffffffffff + - Tag: DT_VERSYM + Value: 0x1000 + - Tag: DT_VERDEF + Value: 0x1000 + - Tag: DT_VERDEFNUM + Value: 0x0 + - Tag: DT_VERNEED + Value: 0x1000 + - Tag: DT_VERNEEDNUM + Value: 0x0 + - Tag: DT_AUXILIARY + Value: 0x1 + - Tag: DT_USED + Value: 0x3 + - Tag: DT_FILTER + Value: 0x3 + # Show behaviour for unknown values in special and un-marked ranges. + - Tag: 0x12345678 + Value: 0x8765432187654321 + - Tag: 0x6abcdef0 + Value: 0x9988776655443322 + - Tag: 0x76543210 + Value: 0x5555666677778888 + - Tag: DT_NULL + Value: 0x0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynstr + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1010 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/file-headers.test b/llvm/test/tools/llvm-readobj/ELF/file-headers.test new file mode 100644 index 00000000000..d3282c804cc --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/file-headers.test @@ -0,0 +1,139 @@ +# RUN: yaml2obj %s --docnum=1 -o %t.i386 +# RUN: llvm-readobj -h %t.i386 | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386 +# RUN: llvm-readobj --file-header %t.i386 | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386 +# RUN: llvm-readobj --file-headers %t.i386 | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386 + +# I386:File: [[FILE]] +# I386-NEXT:Format: ELF32-i386 +# I386-NEXT:Arch: i386 +# I386-NEXT:AddressSize: 32bit +# I386-NEXT:LoadName: <Not found> +# I386-NEXT:ElfHeader { +# I386-NEXT: Ident { +# I386-NEXT: Magic: (7F 45 4C 46) +# I386-NEXT: Class: 32-bit (0x1) +# I386-NEXT: DataEncoding: LittleEndian (0x1) +# I386-NEXT: FileVersion: 1 +# I386-NEXT: OS/ABI: GNU/Linux (0x3) +# I386-NEXT: ABIVersion: 0 +# I386-NEXT: Unused: (00 00 00 00 00 00 00) +# I386-NEXT: } +# I386-NEXT: Type: Relocatable (0x1) +# I386-NEXT: Machine: EM_386 (0x3) +# I386-NEXT: Version: 1 +# I386-NEXT: Entry: 0x0 +# I386-NEXT: ProgramHeaderOffset: 0x0 +# I386-NEXT: SectionHeaderOffset: 0x48 +# I386-NEXT: Flags [ (0x0) +# I386-NEXT: ] +# I386-NEXT: HeaderSize: 52 +# I386-NEXT: ProgramHeaderEntrySize: 0 +# I386-NEXT: ProgramHeaderCount: 0 +# I386-NEXT: SectionHeaderEntrySize: 40 +# I386-NEXT: SectionHeaderCount: 3 +# I386-NEXT: StringTableSectionIndex: 2 +# I386-NEXT:} +# I386-NOT:{{.}} + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_386 + +# RUN: yaml2obj %s --docnum=2 -o %t.x86-64 +# RUN: llvm-readobj -h %t.x86-64 \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.x86-64 --check-prefix X86-64 +# RUN: llvm-readobj --file-header %t.x86-64 \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.x86-64 --check-prefix X86-64 +# RUN: llvm-readobj --file-headers %t.x86-64 \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.x86-64 --check-prefix X86-64 + +# X86-64:File: [[FILE]] +# X86-64-NEXT:Format: ELF64-x86-64 +# X86-64-NEXT:Arch: x86_64 +# X86-64-NEXT:AddressSize: 64bit +# X86-64-NEXT:LoadName: <Not found> +# X86-64-NEXT:ElfHeader { +# X86-64-NEXT: Ident { +# X86-64-NEXT: Magic: (7F 45 4C 46) +# X86-64-NEXT: Class: 64-bit (0x2) +# X86-64-NEXT: DataEncoding: LittleEndian (0x1) +# X86-64-NEXT: FileVersion: 1 +# X86-64-NEXT: OS/ABI: GNU/Linux (0x3) +# X86-64-NEXT: ABIVersion: 0 +# X86-64-NEXT: Unused: (00 00 00 00 00 00 00) +# X86-64-NEXT: } +# X86-64-NEXT: Type: Relocatable (0x1) +# X86-64-NEXT: Machine: EM_X86_64 (0x3E) +# X86-64-NEXT: Version: 1 +# X86-64-NEXT: Entry: 0x0 +# X86-64-NEXT: ProgramHeaderOffset: 0x0 +# X86-64-NEXT: SectionHeaderOffset: 0x58 +# X86-64-NEXT: Flags [ (0x0) +# X86-64-NEXT: ] +# X86-64-NEXT: HeaderSize: 64 +# X86-64-NEXT: ProgramHeaderEntrySize: 0 +# X86-64-NEXT: ProgramHeaderCount: 0 +# X86-64-NEXT: SectionHeaderEntrySize: 64 +# X86-64-NEXT: SectionHeaderCount: 3 +# X86-64-NEXT: StringTableSectionIndex: 2 +# X86-64-NEXT:} +# X86-64-NOT:{{.}} + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=3 -o %t.lanai +# RUN: llvm-readobj -h %t.lanai \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.lanai --check-prefix LANAI +# RUN: llvm-readobj --file-header %t.lanai \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.lanai --check-prefix LANAI +# RUN: llvm-readobj --file-headers %t.lanai \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.lanai --check-prefix LANAI + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_LANAI + +# LANAI:File: [[FILE]] +# LANAI-NEXT:Format: ELF32-lanai +# LANAI-NEXT:Arch: lanai +# LANAI-NEXT:AddressSize: 32bit +# LANAI-NEXT:LoadName: <Not found> +# LANAI-NEXT:ElfHeader { +# LANAI-NEXT: Ident { +# LANAI-NEXT: Magic: (7F 45 4C 46) +# LANAI-NEXT: Class: 32-bit (0x1) +# LANAI-NEXT: DataEncoding: BigEndian (0x2) +# LANAI-NEXT: FileVersion: 1 +# LANAI-NEXT: OS/ABI: SystemV (0x0) +# LANAI-NEXT: ABIVersion: 0 +# LANAI-NEXT: Unused: (00 00 00 00 00 00 00) +# LANAI-NEXT: } +# LANAI-NEXT: Type: Relocatable (0x1) +# LANAI-NEXT: Machine: EM_LANAI (0xF4) +# LANAI-NEXT: Version: 1 +# LANAI-NEXT: Entry: 0x0 +# LANAI-NEXT: ProgramHeaderOffset: 0x0 +# LANAI-NEXT: SectionHeaderOffset: 0x48 +# LANAI-NEXT: Flags [ (0x0) +# LANAI-NEXT: ] +# LANAI-NEXT: HeaderSize: 52 +# LANAI-NEXT: ProgramHeaderEntrySize: 0 +# LANAI-NEXT: ProgramHeaderCount: 0 +# LANAI-NEXT: SectionHeaderEntrySize: 40 +# LANAI-NEXT: SectionHeaderCount: 3 +# LANAI-NEXT: StringTableSectionIndex: 2 +# LANAI-NEXT:} +# LANAI-NOT:{{.}} diff --git a/llvm/test/tools/llvm-readobj/ELF/file-name.test b/llvm/test/tools/llvm-readobj/ELF/file-name.test new file mode 100644 index 00000000000..4a2244e9716 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/file-name.test @@ -0,0 +1,42 @@ +## This test shows that the name of the file is printed under the right +## circumstances and with the correct formatting for object inputs. + +# RUN: yaml2obj %s -o %t1 +# RUN: cp %t1 %t2 + +## Show that the file name is not printed for a single input for GNU output. +# RUN: llvm-readelf --file-headers %t1 \ +# RUN: | FileCheck %s --implicit-check-not=File: --check-prefix=GNU-SINGLE + +## Show that the very first line of the output is the one with "ELF Header" on. +# GNU-SINGLE: {{^}} +# GNU-SINGLE-SAME: ELF Header: + +## Show that the file names are printed for all inputs for GNU output. +# RUN: llvm-readelf --file-headers %t1 %t2 \ +# RUN: | FileCheck %s --check-prefixes=NAME1,GNU,NAME2 -DFILE1=%t1 -DFILE2=%t2 + +## Show that the file name is printed for a single input for LLVM output. +# RUN: llvm-readobj --file-headers %t1 | FileCheck %s --check-prefix=NAME1 -DFILE1=%t1 + +## Show that the file name is printed with correct spacing for multiple inputs +## with LLVM output. +# RUN: llvm-readobj --file-headers %t1 %t2 \ +# RUN: | FileCheck %s --check-prefixes=NAME1,LLVM,NAME2 -DFILE1=%t1 -DFILE2=%t2 + +## The very first line should be blank. CHECK-EMPTY isn't allowed on the first line. +# NAME1: {{^$}} +# NAME1-NEXT: {{^}}File: [[FILE1]]{{$}} + +# GNU: Section header string table index: +# LLVM: StringTableSectionIndex: +# LLVM-NEXT: } +# NAME2-EMPTY: +# NAME2-NEXT: {{^}}File: [[FILE2]]{{$}} + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/file-types.test b/llvm/test/tools/llvm-readobj/ELF/file-types.test new file mode 100644 index 00000000000..0765cff1040 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/file-types.test @@ -0,0 +1,154 @@ +## Check llvm-readobj and llvm-readelf can dump files of the different ELF types. + +# RUN: yaml2obj %s --docnum=1 -o %t1 +# RUN: llvm-readobj -h %t1 | FileCheck %s --match-full-lines --check-prefix LLVM-NONE +# RUN: llvm-readelf -h %t1 | FileCheck %s --match-full-lines --check-prefix GNU-NONE + +# LLVM-NONE: ElfHeader { +# LLVM-NONE: Type: None (0x0) + +# GNU-NONE: ELF Header: +# GNU-NONE: Type: NONE (none) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_NONE + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=2 -o %t2 +# RUN: llvm-readobj -h %t2 | FileCheck %s --match-full-lines --check-prefix LLVM-REL +# RUN: llvm-readelf -h %t2 | FileCheck %s --match-full-lines --check-prefix GNU-REL + +# LLVM-REL: ElfHeader { +# LLVM-REL: Type: Relocatable (0x1) + +# GNU-REL: ELF Header: +# GNU-REL: Type: REL (Relocatable file) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=3 -o %t3 +# RUN: llvm-readobj -h %t3 | FileCheck %s --match-full-lines --check-prefix LLVM-EXEC +# RUN: llvm-readelf -h %t3 | FileCheck %s --match-full-lines --check-prefix GNU-EXEC + +# LLVM-EXEC: ElfHeader { +# LLVM-EXEC: Type: Executable (0x2) + +# GNU-EXEC: ELF Header: +# GNU-EXEC: Type: EXEC (Executable file) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=4 -o %t4 +# RUN: llvm-readobj -h %t4 | FileCheck %s --match-full-lines --check-prefix LLVM-DYN +# RUN: llvm-readelf -h %t4 | FileCheck %s --match-full-lines --check-prefix GNU-DYN + +# LLVM-DYN: ElfHeader { +# LLVM-DYN: Type: SharedObject (0x3) + +# GNU-DYN: ELF Header: +# GNU-DYN: Type: DYN (Shared object file) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=5 -o %t5 +# RUN: llvm-readobj -h %t5 | FileCheck %s --match-full-lines --check-prefix LLVM-CORE +# RUN: llvm-readelf -h %t5 | FileCheck %s --match-full-lines --check-prefix GNU-CORE + +# LLVM-CORE: ElfHeader { +# LLVM-CORE: Type: Core (0x4) + +# GNU-CORE: ELF Header: +# GNU-CORE: Type: CORE (Core file) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=6 -o %t6 +# RUN: llvm-readobj -h %t6 | FileCheck %s --match-full-lines --check-prefix LLVM-LOOS +# RUN: llvm-readelf -h %t6 | FileCheck %s --match-full-lines --check-prefix GNU-LOOS + +# LLVM-LOOS: ElfHeader { +# LLVM-LOOS: Type: 0xFE00 + +# GNU-LOOS: ELF Header: +# GNU-LOOS: Type: fe00 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: 0xfe00 + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=7 -o %t7 +# RUN: llvm-readobj -h %t7 | FileCheck %s --match-full-lines --check-prefix LLVM-HIOS +# RUN: llvm-readelf -h %t7 | FileCheck %s --match-full-lines --check-prefix GNU-HIOS + +# LLVM-HIOS: ElfHeader { +# LLVM-HIOS: Type: 0xFEFF + +# GNU-HIOS: ELF Header: +# GNU-HIOS: Type: feff + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: 0xfeff + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=8 -o %t8 +# RUN: llvm-readobj -h %t8 | FileCheck %s --match-full-lines --check-prefix LLVM-LOPROC +# RUN: llvm-readelf -h %t8 | FileCheck %s --match-full-lines --check-prefix GNU-LOPROC + +# LLVM-LOPROC: ElfHeader { +# LLVM-LOPROC: Type: 0xFF00 + +# GNU-LOPROC: ELF Header: +# GNU-LOPROC: Type: ff00 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: 0xff00 + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=9 -o %t9 +# RUN: llvm-readobj -h %t9 | FileCheck %s --match-full-lines --check-prefix LLVM-HIPROC +# RUN: llvm-readelf -h %t9 | FileCheck %s --match-full-lines --check-prefix GNU-HIPROC + +# LLVM-HIPROC: ElfHeader { +# LLVM-HIPROC: Type: 0xFFFF + +# GNU-HIPROC: ELF Header: +# GNU-HIPROC: Type: ffff + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: 0xffff + Machine: EM_X86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-file-headers.test b/llvm/test/tools/llvm-readobj/ELF/gnu-file-headers.test new file mode 100644 index 00000000000..c6287450989 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-file-headers.test @@ -0,0 +1,81 @@ +RUN: llvm-readelf -h %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readelf --file-header %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readelf --file-headers %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readelf -h %p/Inputs/trivial.obj.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF64 +RUN: llvm-readelf --file-header %p/Inputs/trivial.obj.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF64 +RUN: llvm-readelf --file-headers %p/Inputs/trivial.obj.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF64 +RUN: llvm-readelf -h %p/Inputs/trivial.obj.elf-mipsel \ +RUN: | FileCheck %s -check-prefix MIPSEL +RUN: llvm-readelf --file-header %p/Inputs/trivial.obj.elf-mipsel \ +RUN: | FileCheck %s -check-prefix MIPSEL +RUN: llvm-readelf --file-headers %p/Inputs/trivial.obj.elf-mipsel \ +RUN: | FileCheck %s -check-prefix MIPSEL + +ELF32: ELF Header: +ELF32-NEXT: Magic: 7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00 +ELF32-NEXT: Class: ELF32 +ELF32-NEXT: Data: 2's complement, little endian +ELF32-NEXT: Version: 1 (current) +ELF32-NEXT: OS/ABI: UNIX - GNU +ELF32-NEXT: ABI Version: 0 +ELF32-NEXT: Type: REL (Relocatable file) +ELF32-NEXT: Machine: Intel 80386 +ELF32-NEXT: Version: 0x1 +ELF32-NEXT: Entry point address: 0x0 +ELF32-NEXT: Start of program headers: 0 (bytes into file) +ELF32-NEXT: Start of section headers: 200 (bytes into file) +ELF32-NEXT: Flags: 0x0 +ELF32-NEXT: Size of this header: 52 (bytes) +ELF32-NEXT: Size of program headers: 0 (bytes) +ELF32-NEXT: Number of program headers: 0 +ELF32-NEXT: Size of section headers: 40 (bytes) +ELF32-NEXT: Number of section headers: 10 +ELF32-NEXT: Section header string table index: 7 + +ELF64: ELF Header: +ELF64-NEXT: Magic: 7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00 +ELF64-NEXT: Class: ELF64 +ELF64-NEXT: Data: 2's complement, little endian +ELF64-NEXT: Version: 1 (current) +ELF64-NEXT: OS/ABI: UNIX - GNU +ELF64-NEXT: ABI Version: 0 +ELF64-NEXT: Type: REL (Relocatable file) +ELF64-NEXT: Machine: Advanced Micro Devices X86-64 +ELF64-NEXT: Version: 0x1 +ELF64-NEXT: Entry point address: 0x0 +ELF64-NEXT: Start of program headers: 0 (bytes into file) +ELF64-NEXT: Start of section headers: 184 (bytes into file) +ELF64-NEXT: Flags: 0x0 +ELF64-NEXT: Size of this header: 64 (bytes) +ELF64-NEXT: Size of program headers: 0 (bytes) +ELF64-NEXT: Number of program headers: 0 +ELF64-NEXT: Size of section headers: 64 (bytes) +ELF64-NEXT: Number of section headers: 10 +ELF64-NEXT: Section header string table index: 7 + +MIPSEL: ELF Header: +MIPSEL-NEXT: Magic: 7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00 +MIPSEL-NEXT: Class: ELF32 +MIPSEL-NEXT: Data: 2's complement, little endian +MIPSEL-NEXT: Version: 1 (current) +MIPSEL-NEXT: OS/ABI: UNIX - GNU +MIPSEL-NEXT: ABI Version: 0x0 +MIPSEL-NEXT: Type: REL (Relocatable file) +MIPSEL-NEXT: Machine: MIPS R3000 +MIPSEL-NEXT: Version: 0x1 +MIPSEL-NEXT: Entry point address: 0x0 +MIPSEL-NEXT: Start of program headers: 0 (bytes into file) +MIPSEL-NEXT: Start of section headers: 172 (bytes into file) +MIPSEL-NEXT: Flags: 0x50001000, o32, mips32 +MIPSEL-NEXT: Size of this header: 52 (bytes) +MIPSEL-NEXT: Size of program headers: 0 (bytes) +MIPSEL-NEXT: Number of program headers: 0 +MIPSEL-NEXT: Size of section headers: 40 (bytes) +MIPSEL-NEXT: Number of section headers: 9 +MIPSEL-NEXT: Section header string table index: 6 diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-note-size.test b/llvm/test/tools/llvm-readobj/ELF/gnu-note-size.test new file mode 100644 index 00000000000..ea01d5b7814 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-note-size.test @@ -0,0 +1,32 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU +# RUN: llvm-readobj --elf-output-style LLVM --notes %t | FileCheck %s --check-prefix=LLVM + +# GNU: Owner Data size Description +# GNU-NEXT: GNU 0x00000004 NT_GNU_ABI_TAG (ABI version tag) +# GNU-NEXT: <corrupt GNU_ABI_TAG> + +# LLVM: Notes [ +# LLVM-NEXT: NoteSection { +# LLVM-NEXT: Offset: +# LLVM-NEXT: Size: 0x14 +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: GNU +# LLVM-NEXT: Data size: 0x4 +# LLVM-NEXT: Type: NT_GNU_ABI_TAG (ABI version tag) +# LLVM-NEXT: ABI: <corrupt GNU_ABI_TAG> +# LLVM-NEXT: } +# LLVM-NEXT: } +# LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .note.ABI-tag + Type: SHT_NOTE + AddressAlign: 0x0000000000000004 + Content: 040000000400000001000000474E550000000000 diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-notes.test b/llvm/test/tools/llvm-readobj/ELF/gnu-notes.test new file mode 100644 index 00000000000..a625c024b00 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-notes.test @@ -0,0 +1,194 @@ +## Test tools are able to dump different types of notes. + +# RUN: yaml2obj --docnum=1 %s > %t1.so +# RUN: llvm-readelf --notes %t1.so | FileCheck %s --check-prefix=GNU --strict-whitespace --match-full-lines +# RUN: llvm-readobj --notes %t1.so | FileCheck %s --check-prefix=LLVM +# RUN: llvm-objcopy --strip-sections %t1.so %t1.stripped.so +# RUN: llvm-readelf --notes %t1.stripped.so | FileCheck %s --check-prefix=GNU-STRIPPED --strict-whitespace --match-full-lines +# RUN: llvm-readobj --notes %t1.stripped.so | FileCheck %s --check-prefix=LLVM-STRIPPED + +# GNU:Displaying notes found at file offset 0x00000078 with length 0x00000020: +# GNU-NEXT: Owner Data size Description +# GNU-NEXT: GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag) +# GNU-NEXT: OS: Linux, ABI: 2.6.32 + +# GNU:Displaying notes found at file offset 0x00000098 with length 0x00000020: +# GNU-NEXT: Owner Data size Description +# GNU-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring) +# GNU-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b + +# GNU:Displaying notes found at file offset 0x000000b8 with length 0x0000001c: +# GNU-NEXT: Owner Data size Description +# GNU-NEXT: GNU 0x00000009 NT_GNU_GOLD_VERSION (gold version) +# GNU-NEXT: Version: gold 1.11 + +# LLVM: Notes [ +# LLVM-NEXT: NoteSection { +# LLVM-NEXT: Offset: 0x78 +# LLVM-NEXT: Size: 0x20 +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: GNU +# LLVM-NEXT: Data size: 0x10 +# LLVM-NEXT: Type: NT_GNU_ABI_TAG (ABI version tag) +# LLVM-NEXT: OS: Linux +# LLVM-NEXT: ABI: 2.6.32 +# LLVM-NEXT: } +# LLVM-NEXT: } +# LLVM-NEXT: NoteSection { +# LLVM-NEXT: Offset: 0x98 +# LLVM-NEXT: Size: 0x20 +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: GNU +# LLVM-NEXT: Data size: 0x10 +# LLVM-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring) +# LLVM-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b +# LLVM-NEXT: } +# LLVM-NEXT: } +# LLVM-NEXT: NoteSection { +# LLVM-NEXT: Offset: 0xB8 +# LLVM-NEXT: Size: 0x1C +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: GNU +# LLVM-NEXT: Data size: 0x9 +# LLVM-NEXT: Type: NT_GNU_GOLD_VERSION (gold version) +# LLVM-NEXT: Version: gold 1.11 +# LLVM-NEXT: } +# LLVM-NEXT: } +# LLVM-NEXT: ] + +# LLVM-STRIPPED: Notes [ +# LLVM-STRIPPED-NEXT: NoteSection { +# LLVM-STRIPPED-NEXT: Offset: 0x78 +# LLVM-STRIPPED-NEXT: Size: 0x20 +# LLVM-STRIPPED-NEXT: Note { +# LLVM-STRIPPED-NEXT: Owner: GNU +# LLVM-STRIPPED-NEXT: Data size: 0x10 +# LLVM-STRIPPED-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring) +# LLVM-STRIPPED-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b +# LLVM-STRIPPED-NEXT: } +# LLVM-STRIPPED-NEXT: } +# LLVM-STRIPPED-NEXT: ] + +# GNU-STRIPPED:Displaying notes found at file offset 0x00000078 with length 0x00000020: +# GNU-STRIPPED-NEXT: Owner Data size Description +# GNU-STRIPPED-NEXT: GNU 0x00000010 NT_GNU_BUILD_ID (unique build ID bitstring) +# GNU-STRIPPED-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .note.ABI-tag + Type: SHT_NOTE + AddressAlign: 0x0000000000000004 + Content: 040000001000000001000000474E550000000000020000000600000020000000 + - Name: .note.gnu.build-id + Type: SHT_NOTE + Flags: [ SHF_ALLOC ] + Address: 0x0000000000400120 + AddressAlign: 0x0000000000000004 + Content: 040000001000000003000000474E55004FCB712AA6387724A9F465A32CD8C14B + - Name: .note.gnu.gold-version + Type: SHT_NOTE + AddressAlign: 0x0000000000000004 + Content: 040000000900000004000000474E5500676F6C6420312E3131000000 +ProgramHeaders: + - Type: PT_NOTE + FileSize: 0x20 + Sections: + - Section: .note.gnu.build-id + +## Test tools report an error if a note section has an invalid offset +## that goes past the end of file. + +# RUN: yaml2obj --docnum=2 %s > %t2.so +# RUN: not llvm-readelf --notes %t2.so 2>&1 | FileCheck -DFILE=%t2.so %s --check-prefix=ERR1 +# RUN: not llvm-readobj --notes %t2.so 2>&1 | FileCheck -DFILE=%t2.so %s --check-prefix=ERR1 + +# ERR1: error: '[[FILE]]': SHT_NOTE section [index 1] has invalid offset (0xffff0000) or size (0x0) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .note + Type: SHT_NOTE + Notes: [] + ShOffset: 0xffff0000 + +## Test tools report an error if a note section has invalid size +## that goes past the end of file. + +# RUN: yaml2obj --docnum=3 %s > %t3.so +# RUN: not llvm-readelf --notes %t3.so 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=ERR2 +# RUN: not llvm-readobj --notes %t3.so 2>&1 | FileCheck -DFILE=%t3.so %s --check-prefix=ERR2 + +# ERR2: error: '[[FILE]]': SHT_NOTE section [index 1] has invalid offset (0x40) or size (0xffff0000) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .note + Type: SHT_NOTE + ShSize: 0xffff0000 + Notes: [] + +## Test tools report an error if a note program header has an invalid offset that +## goes past the end of file. + +# RUN: yaml2obj --docnum=4 %s > %t4.so +# RUN: not llvm-readelf --notes %t4.so 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefix=ERR3 +# RUN: not llvm-readobj --notes %t4.so 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefix=ERR3 + +# ERR3: error: '[[FILE]]': PT_NOTE header has invalid offset (0xffff0000) or size (0x0) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 +Sections: + - Name: .note + Type: SHT_NOTE + Notes: [] +ProgramHeaders: + - Type: PT_NOTE + Offset: 0xffff0000 + Sections: + - Section: .note + +## Test tools report an error if a note program header has an invalid size that +## goes past the end of file. + +# RUN: yaml2obj --docnum=5 %s > %t5.so +# RUN: not llvm-readelf --notes %t5.so 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefix=ERR4 +# RUN: not llvm-readobj --notes %t5.so 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefix=ERR4 + +# ERR4: error: '[[FILE]]': PT_NOTE header has invalid offset (0x78) or size (0xffff0000) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 +Sections: + - Name: .note + Type: SHT_NOTE + Notes: [] +ProgramHeaders: + - Type: PT_NOTE + FileSize: 0xffff0000 + Sections: + - Section: .note diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-phdrs.test b/llvm/test/tools/llvm-readobj/ELF/gnu-phdrs.test new file mode 100644 index 00000000000..cf6ba17259a --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-phdrs.test @@ -0,0 +1,97 @@ +#Source : +#__thread int a = 1; +#__thread int b; +# +#int main () { +# b = 2; +# throw (a + b) ; +# return 0; +#} +# compiled as clang++ source.cpp +# and clang++ -m32 source.cpp + +RUN: llvm-readelf -l %p/Inputs/phdrs-elf.exe-i386 \ +RUN: | FileCheck %s -check-prefix ELF32 +RUN: llvm-readelf -l %p/Inputs/phdrs-elf.exe-x86_64 \ +RUN: | FileCheck %s -check-prefixes ELF64-PHDRS,ELF64-MAPPING +RUN: llvm-readelf -program-headers %p/Inputs/phdrs-elf.exe-x86_64 \ +RUN: | FileCheck %s -check-prefixes ELF64-PHDRS,ELF64-MAPPING + +# Check that -section-mapping produces a mapping and not the program headers. +RUN: llvm-readelf -section-mapping %p/Inputs/phdrs-elf.exe-x86_64 \ +RUN: | FileCheck %s -check-prefix ELF64-MAPPING -implicit-check-not="Program Headers:" + +# Check that -section-mapping=false -program-headers produces just program headers. +RUN: llvm-readelf -section-mapping=false -program-headers %p/Inputs/phdrs-elf.exe-x86_64 \ +RUN: | FileCheck %s -check-prefix ELF64-PHDRS -implicit-check-not="Section to Segment mapping:" + +# Check that only one copy of the section/segment mapping table is produced. +RUN: llvm-readelf -section-mapping -program-headers %p/Inputs/phdrs-elf.exe-x86_64 \ +RUN: | FileCheck %s -check-prefix ELF64-ONEMAPPING + +ELF32: Elf file type is EXEC (Executable file) +ELF32-NEXT: Entry point 0x8048460 +ELF32-NEXT: There are 10 program headers, starting at offset 52 + +ELF32: Program Headers: +ELF32-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align +ELF32-NEXT: PHDR 0x000034 0x08048034 0x08048034 0x00140 0x00140 R E 0x4 +ELF32-NEXT: INTERP 0x000174 0x08048174 0x08048174 0x00013 0x00013 R 0x1 +ELF32-NEXT: [Requesting program interpreter: /lib/ld-linux.so.2] +ELF32-NEXT: LOAD 0x000000 0x08048000 0x08048000 0x006d0 0x006d0 R E 0x1000 +ELF32-NEXT: LOAD 0x000ef0 0x08049ef0 0x08049ef0 0x00128 0x00140 RW 0x1000 +ELF32-NEXT: DYNAMIC 0x000f08 0x08049f08 0x08049f08 0x000e8 0x000e8 RW 0x4 +ELF32-NEXT: NOTE 0x000188 0x08048188 0x08048188 0x00044 0x00044 R 0x4 +ELF32-NEXT: TLS 0x000ef0 0x08049ef0 0x08049ef0 0x00004 0x00008 R 0x4 +ELF32-NEXT: GNU_EH_FRAME 0x000640 0x08048640 0x08048640 0x0001c 0x0001c R 0x4 +ELF32-NEXT: GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 +ELF32-NEXT: GNU_RELRO 0x000ef0 0x08049ef0 0x08049ef0 0x00110 0x00110 R 0x1 + +ELF32: Section to Segment mapping: +ELF32-NEXT: Segment Sections... +ELF32-NEXT: 00 +ELF32-NEXT: 01 .interp +ELF32-NEXT: 02 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame +ELF32-NEXT: 03 .tdata .ctors .dtors .jcr .dynamic .got .got.plt .data .bss +ELF32-NEXT: 04 .dynamic +ELF32-NEXT: 05 .note.ABI-tag .note.gnu.build-id +ELF32-NEXT: 06 .tdata .tbss +ELF32-NEXT: 07 .eh_frame_hdr +ELF32-NEXT: 08 +ELF32-NEXT: 09 .tdata .ctors .dtors .jcr .dynamic .got +ELF32-NEXT: None .comment .shstrtab .symtab .strtab + +ELF64-PHDRS: Elf file type is EXEC (Executable file) +ELF64-PHDRS-NEXT: Entry point 0x400610 +ELF64-PHDRS-NEXT: There are 10 program headers, starting at offset 64 + +ELF64-PHDRS: Program Headers: +ELF64-PHDRS-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align +ELF64-PHDRS-NEXT: PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x000230 0x000230 R E 0x8 +ELF64-PHDRS-NEXT: INTERP 0x000270 0x0000000000400270 0x0000000000400270 0x00001c 0x00001c R 0x1 +ELF64-PHDRS-NEXT: [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] +ELF64-PHDRS-NEXT: LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000924 0x000924 R E 0x200000 +ELF64-PHDRS-NEXT: LOAD 0x000db4 0x0000000000600db4 0x0000000000600db4 0x000274 0x0002a4 RW 0x200000 +ELF64-PHDRS-NEXT: DYNAMIC 0x000dd0 0x0000000000600dd0 0x0000000000600dd0 0x000210 0x000210 RW 0x8 +ELF64-PHDRS-NEXT: NOTE 0x00028c 0x000000000040028c 0x000000000040028c 0x000044 0x000044 R 0x4 +ELF64-PHDRS-NEXT: TLS 0x000db4 0x0000000000600db4 0x0000000000600db4 0x000004 0x000008 R 0x4 +ELF64-PHDRS-NEXT: GNU_EH_FRAME 0x00083c 0x000000000040083c 0x000000000040083c 0x00002c 0x00002c R 0x4 +ELF64-PHDRS-NEXT: GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x8 +ELF64-PHDRS-NEXT: GNU_RELRO 0x000db4 0x0000000000600db4 0x0000000000600db4 0x00024c 0x00024c R 0x1 + +ELF64-MAPPING: Section to Segment mapping: +ELF64-MAPPING-NEXT: Segment Sections... +ELF64-MAPPING-NEXT: 00 +ELF64-MAPPING-NEXT: 01 .interp +ELF64-MAPPING-NEXT: 02 .interp .note.ABI-tag .note.gnu.build-id .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame +ELF64-MAPPING-NEXT: 03 .tdata .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss +ELF64-MAPPING-NEXT: 04 .dynamic +ELF64-MAPPING-NEXT: 05 .note.ABI-tag .note.gnu.build-id +ELF64-MAPPING-NEXT: 06 .tdata .tbss +ELF64-MAPPING-NEXT: 07 .eh_frame_hdr +ELF64-MAPPING-NEXT: 08 +ELF64-MAPPING-NEXT: 09 .tdata .init_array .fini_array .jcr .dynamic .got +ELF64-MAPPING-NEXT: None .comment .shstrtab .symtab .strtab + +ELF64-ONEMAPPING: Section to Segment mapping: +ELF64-ONEMAPPING-NOT: Section to Segment mapping: diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test new file mode 100644 index 00000000000..f1a23921678 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-phdrs.test @@ -0,0 +1,5 @@ +RUN: llvm-readelf --section-mapping %p/Inputs/trivial.obj.elf-x86-64 | FileCheck %s +CHECK: Section to Segment mapping: +CHECK-NEXT: Segment Sections... +CHECK-NEXT: None .text .rela.text .data .bss .rodata.str1.1 .note.GNU-stack .shstrtab .symtab .strtab {{$}} +CHECK-NOT: {{.}} diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-shdrs.test b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-shdrs.test new file mode 100644 index 00000000000..94f827485a5 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-section-mapping-no-shdrs.test @@ -0,0 +1,15 @@ +RUN: llvm-objcopy --strip-sections %p/Inputs/phdrs-elf.exe-x86_64 %t.o +RUN: llvm-readelf --section-mapping %t.o | FileCheck %s +CHECK: Section to Segment mapping: +CHECK-NEXT: Segment Sections... +CHECK-NEXT: 00 {{$}} +CHECK-NEXT: 01 {{$}} +CHECK-NEXT: 02 {{$}} +CHECK-NEXT: 03 {{$}} +CHECK-NEXT: 04 {{$}} +CHECK-NEXT: 05 {{$}} +CHECK-NEXT: 06 {{$}} +CHECK-NEXT: 07 {{$}} +CHECK-NEXT: 08 {{$}} +CHECK-NEXT: 09 {{$}} +CHECK-NOT: {{.}} diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-sections.test b/llvm/test/tools/llvm-readobj/ELF/gnu-sections.test new file mode 100644 index 00000000000..c5c67330ef3 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-sections.test @@ -0,0 +1,115 @@ +# RUN: yaml2obj --docnum=1 %s -o %t-i386.o +# RUN: llvm-readelf -S %t-i386.o | FileCheck %s -check-prefix ELF32 + +# ELF32: There are 8 section headers, starting at offset 0x90: +# ELF32-EMPTY: +# ELF32-NEXT: Section Headers: +# ELF32-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# ELF32-NEXT: [ 0] NULL 00000000 000000 000000 00 0 0 0 +# ELF32-NEXT: [ 1] .text PROGBITS 00000000 000034 000001 00 AX 0 0 4 +# ELF32-NEXT: [ 2] .rel.text REL 00000000 000038 000000 08 5 1 4 +# ELF32-NEXT: [ 3] .data PROGBITS 00000000 000038 000000 00 WA 0 0 4 +# ELF32-NEXT: [ 4] .bss NOBITS 00000000 000038 000000 00 WA 0 0 4 +# ELF32-NEXT: [ 5] .symtab SYMTAB 00000000 000038 000020 10 6 2 8 +# ELF32-NEXT: [ 6] .strtab STRTAB 00000000 000058 000007 00 0 0 1 +# ELF32-NEXT: [ 7] .shstrtab STRTAB 00000000 00005f 000030 00 0 0 1 +# ELF32-NEXT: Key to Flags: +# ELF32-NEXT: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) +# ELF32-NEXT: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) +# ELF32-NEXT: O (extra OS processing required) o (OS specific), p (processor specific) + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + EntSize: 0x0000000000000008 + Info: .text + Relocations: + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + - Name: .text + Type: STT_SECTION + Section: .text + +# RUN: yaml2obj --docnum=2 %s -o %t-x64.o +# RUN: llvm-readelf -S %t-x64.o | FileCheck %s -check-prefix ELF64 + +## Check that --wide is the same as -W and ignored and also +## that --section is the same as -S. +# RUN: llvm-readobj --wide --sections %t-x64.o --elf-output-style=GNU \ +# RUN: | FileCheck %s -check-prefix ELF64 +# RUN: llvm-readobj -W --sections %t-x64.o --elf-output-style=GNU \ +# RUN: | FileCheck %s -check-prefix ELF64 +# RUN: llvm-readelf -W -S %t-x64.o | FileCheck %s -check-prefix ELF64 + +# ELF64: There are 8 section headers, starting at offset 0xb0: +# ELF64-EMPTY: +# ELF64-NEXT: Section Headers: +# ELF64-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# ELF64-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 +# ELF64-NEXT: [ 1] .text PROGBITS 0000000000000000 000040 000001 00 AX 0 0 4 +# ELF64-NEXT: [ 2] .rela.text RELA 0000000000000000 000048 000000 18 5 1 8 +# ELF64-NEXT: [ 3] .data PROGBITS 0000000000000000 000048 000000 00 WA 0 0 4 +# ELF64-NEXT: [ 4] .bss NOBITS 0000000000000000 000048 000000 00 WA 0 0 4 +# ELF64-NEXT: [ 5] .symtab SYMTAB 0000000000000000 000048 000030 18 6 2 8 +# ELF64-NEXT: [ 6] .strtab STRTAB 0000000000000000 000078 000007 00 0 0 1 +# ELF64-NEXT: [ 7] .shstrtab STRTAB 0000000000000000 00007f 000031 00 0 0 1 +# ELF64-NEXT: Key to Flags: +# ELF64-NEXT: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) +# ELF64-NEXT: I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) +# ELF64-NEXT: O (extra OS processing required) o (OS specific), p (processor specific) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + EntSize: 0x0000000000000018 + Info: .text + Relocations: + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 + Content: '' + - Name: .bss + Type: SHT_NOBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + AddressAlign: 0x0000000000000004 +Symbols: + - Name: .text + Type: STT_SECTION + Section: .text diff --git a/llvm/test/tools/llvm-readobj/ELF/gnu-symbols.test b/llvm/test/tools/llvm-readobj/ELF/gnu-symbols.test new file mode 100644 index 00000000000..3d087ac459b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnu-symbols.test @@ -0,0 +1,57 @@ +RUN: llvm-readelf --symbols %p/Inputs/symbols-proc-specific.elf-hexagon \ +RUN: | FileCheck %s --check-prefix ELF32 +RUN: llvm-readelf --symbols %p/Inputs/relocs.obj.elf-x86_64 \ +RUN: | FileCheck %s --check-prefix ELF64 +RUN: llvm-readelf --symbols %p/Inputs/gnuhash.so.elf-x86_64 \ +RUN: | FileCheck %s --check-prefixes=SYMTAB,DYN +RUN: llvm-readelf --dyn-symbols %p/Inputs/gnuhash.so.elf-x86_64 \ +RUN: | FileCheck %s --check-prefixes=NO-SYMTAB,DYN +RUN: llvm-readelf --symbols --dyn-symbols %p/Inputs/gnuhash.so.elf-x86_64 \ +RUN: | FileCheck %s --check-prefixes=SYMTAB,DYN + +ELF32: Symbol table '.symtab' contains 5 entries: +ELF32-NEXT: Num: Value Size Type Bind Vis Ndx Name +ELF32-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND +ELF32-NEXT: 1: 00000000 0 FILE LOCAL DEFAULT ABS a.c +ELF32-NEXT: 2: 00000000 20 FUNC GLOBAL DEFAULT 2 main +ELF32-NEXT: 3: 00000004 4 OBJECT GLOBAL DEFAULT PRC[0xff03] x +ELF32-NEXT: 4: 00000000 4 OBJECT GLOBAL DEFAULT 3 y + +ELF64: Symbol table '.symtab' contains 6 entries: +ELF64-NEXT: Num: Value Size Type Bind Vis Ndx Name +ELF64-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +ELF64-NEXT: 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text +ELF64-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 .data +ELF64-NEXT: 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 .bss +ELF64-NEXT: 4: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_ +ELF64-NEXT: 5: 0000000000000000 0 TLS GLOBAL DEFAULT UND sym + +NO-SYMTAB-NOT: Symbol table '.symtab' + +DYN: Symbol table '.dynsym' contains 5 entries: +DYN-NEXT: Num: Value Size Type Bind Vis Ndx Name +DYN-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +DYN-NEXT: 1: 00000000000001b8 0 NOTYPE GLOBAL DEFAULT 4 foo +DYN-NEXT: 2: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _edata +DYN-NEXT: 3: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _end +DYN-NEXT: 4: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 __bss_start + +DYN-NOT: .dynsym +NO-SYMTAB-NOT: Symbol table '.symtab' + +SYMTAB: Symbol table '.symtab' contains 12 entries: +SYMTAB-NEXT: Num: Value Size Type Bind Vis Ndx Name +SYMTAB-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +SYMTAB-NEXT: 1: 00000000000000e8 0 SECTION LOCAL DEFAULT 1 .gnu.hash +SYMTAB-NEXT: 2: 0000000000000120 0 SECTION LOCAL DEFAULT 2 .dynsym +SYMTAB-NEXT: 3: 0000000000000198 0 SECTION LOCAL DEFAULT 3 .dynstr +SYMTAB-NEXT: 4: 00000000000001b8 0 SECTION LOCAL DEFAULT 4 .eh_frame +SYMTAB-NEXT: 5: 00000000002001b8 0 SECTION LOCAL DEFAULT 5 .dynamic +SYMTAB-NEXT: 6: 00000000002001b8 0 OBJECT LOCAL DEFAULT 5 _DYNAMIC +SYMTAB-NEXT: 7: 0000000000200268 0 OBJECT LOCAL DEFAULT 5 _GLOBAL_OFFSET_TABLE_ +SYMTAB-NEXT: 8: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 __bss_start +SYMTAB-NEXT: 9: 00000000000001b8 0 NOTYPE GLOBAL DEFAULT 4 foo +SYMTAB-NEXT: 10: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _edata +SYMTAB-NEXT: 11: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 _end + +DYN-NOT: .dynsym diff --git a/llvm/test/tools/llvm-readobj/ELF/gnuhash.test b/llvm/test/tools/llvm-readobj/ELF/gnuhash.test new file mode 100644 index 00000000000..c7d15dc3153 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/gnuhash.test @@ -0,0 +1,63 @@ +// Check dumping of the GNU Hash section +// The input was generated using the following: +// $ llvm-mc -filetype=obj -triple=i386-pc-linux -o example-i386.o example.s +// $ llvm-mc -filetype=obj -triple=x86_64-pc-linux -o example-x86_64.o example.s +// $ llvm-mc -filetype=obj -triple=powerpc-pc-linux -o example-ppc.o example.s +// $ llvm-mc -filetype=obj -triple=powerpc64-pc-linux -o example-ppc64.o example.s +// $ ld -shared -m elf_i386 -hash-style=gnu -o gnuhash.so.elf-i386 example-i386.o +// $ ld -shared -m elf_x86_64 -hash-style=gnu -o gnuhash.so.elf-x86_64 example-x86_64.o +// $ ld -shared -m elf32ppc -hash-style=gnu -o gnuhash.so.elf-ppc example-ppc.o +// $ ld -shared -m elf64ppc -hash-style=gnu -o gnuhash.so.elf-ppc64 example-ppc64.o +// $ cat example.s +// .globl foo +// foo: + +RUN: llvm-readobj --gnu-hash-table %p/Inputs/gnuhash.so.elf-i386 | FileCheck %s -check-prefix I386 +RUN: llvm-readobj --gnu-hash-table %p/Inputs/gnuhash.so.elf-x86_64 | FileCheck %s -check-prefix X86_64 +RUN: llvm-readobj --gnu-hash-table %p/Inputs/gnuhash.so.elf-ppc | FileCheck %s -check-prefix PPC +RUN: llvm-readobj --gnu-hash-table %p/Inputs/gnuhash.so.elf-ppc64 | FileCheck %s -check-prefix PPC64 + +I386: Arch: i386 +I386: GnuHashTable { +I386-NEXT: Num Buckets: 3 +I386-NEXT: First Hashed Symbol Index: 1 +I386-NEXT: Num Mask Words: 1 +I386-NEXT: Shift Count: 5 +I386-NEXT: Bloom Filter: [0x39004608] +I386-NEXT: Buckets: [1, 4, 0] +I386-NEXT: Values: [0xB887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9] +I386-NEXT: } + +X86_64: Arch: x86_64 +X86_64: GnuHashTable { +X86_64-NEXT: Num Buckets: 3 +X86_64-NEXT: First Hashed Symbol Index: 1 +X86_64-NEXT: Num Mask Words: 1 +X86_64-NEXT: Shift Count: 6 +X86_64-NEXT: Bloom Filter: [0x800000001204288] +X86_64-NEXT: Buckets: [1, 4, 0] +X86_64-NEXT: Values: [0xB887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9] +X86_64-NEXT: } + +PPC: Arch: powerpc +PPC: GnuHashTable { +PPC-NEXT: Num Buckets: 3 +PPC-NEXT: First Hashed Symbol Index: 1 +PPC-NEXT: Num Mask Words: 1 +PPC-NEXT: Shift Count: 5 +PPC-NEXT: Bloom Filter: [0x3D00460A] +PPC-NEXT: Buckets: [1, 5, 0] +PPC-NEXT: Values: [0xEEBEC3A, 0xB887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9] +PPC-NEXT: } + +PPC64: Arch: powerpc64 +PPC64: GnuHashTable { +PPC64-NEXT: Num Buckets: 3 +PPC64-NEXT: First Hashed Symbol Index: 1 +PPC64-NEXT: Num Mask Words: 1 +PPC64-NEXT: Shift Count: 6 +PPC64-NEXT: Bloom Filter: [0x800000001204288] +PPC64-NEXT: Buckets: [1, 4, 0] +PPC64-NEXT: Values: [0xB887388, 0xECD54542, 0x7C92E3BB, 0x1C5871D9] +PPC64-NEXT: } + diff --git a/llvm/test/tools/llvm-readobj/ELF/groups.test b/llvm/test/tools/llvm-readobj/ELF/groups.test new file mode 100644 index 00000000000..4e165311ecf --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/groups.test @@ -0,0 +1,82 @@ +## Check that llvm-readelf and llvm-readobj can +## dump SHT_GROUP sections properly. + +# RUN: yaml2obj %s -o %t.o +# RUN: llvm-readobj -g %t.o | FileCheck %s +# RUN: llvm-readelf -g %t.o | FileCheck --check-prefix=GNU %s + +# CHECK: Groups { +# CHECK-NEXT: Group { +# CHECK-NEXT: Name: .group +# CHECK-NEXT: Index: 1 +# CHECK-NEXT: Link: 7 +# CHECK-NEXT: Info: 1 +# CHECK-NEXT: Type: COMDAT +# CHECK-NEXT: Signature: foo +# CHECK-NEXT: Section(s) in group [ +# CHECK-NEXT: .text.foo +# CHECK-NEXT: .rela.text.foo +# CHECK-NEXT: ] +# CHECK-NEXT: } +# CHECK-NEXT: Group { +# CHECK-NEXT: Name: .group1 +# CHECK-NEXT: Index: 2 +# CHECK-NEXT: Link: 7 +# CHECK-NEXT: Info: 2 +# CHECK-NEXT: Type: COMDAT +# CHECK-NEXT: Signature: bar +# CHECK-NEXT: Section(s) in group [ +# CHECK-NEXT: .text.bar +# CHECK-NEXT: .rela.text.bar +# CHECK-NEXT: ] +# CHECK-NEXT: } + +# GNU: COMDAT group section [ 1] `.group' [foo] contains 2 sections: +# GNU-NEXT: [Index] Name +# GNU-NEXT: [ 3] .text.foo +# GNU-NEXT: [ 4] .rela.text.foo +# GNU: COMDAT group section [ 2] `.group1' [bar] contains 2 sections: +# GNU-NEXT: [Index] Name +# GNU-NEXT: [ 5] .text.bar +# GNU-NEXT: [ 6] .rela.text.bar + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + Info: foo + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .text.foo + - SectionOrType: .rela.text.foo + - Name: .group1 + Type: SHT_GROUP + Link: .symtab + Info: bar + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .text.bar + - SectionOrType: .rela.text.bar + - Name: .text.foo + Type: SHT_PROGBITS + - Name: .rela.text.foo + Type: SHT_RELA + Link: .symtab + Info: .text.foo + - Name: .text.bar + Type: SHT_PROGBITS + - Name: .rela.text.bar + Type: SHT_RELA + Link: .symtab + Info: .text.bar +Symbols: + - Name: foo + Section: .text.foo + - Name: bar + Section: .text.bar diff --git a/llvm/test/tools/llvm-readobj/ELF/hash-histogram.test b/llvm/test/tools/llvm-readobj/ELF/hash-histogram.test new file mode 100644 index 00000000000..e0c29d15abc --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/hash-histogram.test @@ -0,0 +1,70 @@ +# RUN: llvm-readelf --elf-hash-histogram %p/Inputs/gnuhash.so.elf-ppc64 \ +# RUN: | FileCheck %s -check-prefix PPC64GNU +# RUN: llvm-readelf --elf-hash-histogram %p/Inputs/gnuhash.so.elf-x86_64 \ +# RUN: | FileCheck %s -check-prefix X86GNU +# RUN: llvm-readelf --elf-hash-histogram %p/Inputs/got-plt.exe.elf-mipsel \ +# RUN: | FileCheck %s -check-prefix SYSV + +# PPC64GNU: Histogram for `.gnu.hash' bucket list length (total of 3 buckets) +# PPC64GNU-NEXT: Length Number % of total Coverage +# PPC64GNU-NEXT: 0 1 ( 33.3%) 0.0% +# PPC64GNU-NEXT: 1 1 ( 33.3%) 25.0% +# PPC64GNU-NEXT: 2 0 ( 0.0%) 25.0% +# PPC64GNU-NEXT: 3 1 ( 33.3%) 100.0% + +# X86GNU: Histogram for `.gnu.hash' bucket list length (total of 3 buckets) +# X86GNU-NEXT: Length Number % of total Coverage +# X86GNU-NEXT: 0 1 ( 33.3%) 0.0% +# X86GNU-NEXT: 1 1 ( 33.3%) 25.0% +# X86GNU-NEXT: 2 0 ( 0.0%) 25.0% +# X86GNU-NEXT: 3 1 ( 33.3%) 100.0% + +# SYSV: Histogram for bucket list length (total of 3 buckets) +# SYSV-NEXT: Length Number % of total Coverage +# SYSV-NEXT: 0 0 ( 0.0%) 0.0% +# SYSV-NEXT: 1 0 ( 0.0%) 0.0% +# SYSV-NEXT: 2 2 ( 66.7%) 57.1% +# SYSV-NEXT: 3 1 ( 33.3%) 100.0% + +## Show that we report a warning for a hash table which contains an entry of +## the bucket array pointing to a cycle. + +# RUN: yaml2obj %s -o %t.o +# RUN: llvm-readelf --elf-hash-histogram 2>&1 %t.o | FileCheck -DFILE=%t.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 diff --git a/llvm/test/tools/llvm-readobj/ELF/hash-symbols.test b/llvm/test/tools/llvm-readobj/ELF/hash-symbols.test new file mode 100644 index 00000000000..e4515b692eb --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/hash-symbols.test @@ -0,0 +1,417 @@ +## 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.so +# RUN: llvm-readelf --hash-symbols %t1-32.so \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix HASH-32 + +# HASH-32: Symbol table of .hash for image: +# HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# HASH-32-NEXT: 1 0: 00000000 0 NOTYPE GLOBAL DEFAULT UND ccc +# HASH-32-NEXT: 5 0: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb +# HASH-32-NEXT: 3 0: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# HASH-32-NEXT: 2 0: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa +# HASH-32-NEXT: 4 0: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee +# HASH-32-EMPTY: +# HASH-32: Symbol table of .gnu.hash for image: +# HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# HASH-32-NEXT: 2 1: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa +# HASH-32-NEXT: 3 1: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# HASH-32-NEXT: 4 2: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee +# HASH-32-NEXT: 5 2: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb +# HASH-32-NOT: {{.}} + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 +Sections: + - Name: .hash + Type: SHT_HASH + Flags: [ SHF_ALLOC ] + Link: .dynsym + Bucket: [ 1, 0, 0 ] + Chain: [ 0, 5, 4, 2, 0, 3 ] + - Name: .gnu.hash + Type: SHT_GNU_HASH + Flags: [ SHF_ALLOC ] + Link: .dynsym + Header: + SymNdx: 0x2 + Shift2: 0x0 + BloomFilter: [ 0x0 ] + HashBuckets: [ 0x0, 0x2, 0x4 ] + HashValues: [ 0x0B885C68, 0x0B886991, 0x0B886DF4, 0x0B8860CB ] + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [ 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 + +# RUN: yaml2obj --docnum=2 %s -o %t1-64.so +# RUN: llvm-readelf --hash-symbols %t1-64.so | FileCheck %s --check-prefix HASH-64 + +# HASH-64: Symbol table of .hash for image: +# HASH-64-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# HASH-64-NEXT: 1 0: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND ccc +# HASH-64-NEXT: 5 0: 0000000000001001 0 NOTYPE WEAK DEFAULT 1 bbb +# HASH-64-NEXT: 3 0: 0000000000000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# HASH-64-NEXT: 2 0: 0000000000001000 0 NOTYPE GLOBAL DEFAULT 1 aaa +# HASH-64-NEXT: 4 0: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 eee +# HASH-64-EMPTY: +# HASH-64-NEXT: Symbol table of .gnu.hash for image: +# HASH-64-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# HASH-64-NEXT: 2 1: 0000000000001000 0 NOTYPE GLOBAL DEFAULT 1 aaa +# HASH-64-NEXT: 3 1: 0000000000000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# HASH-64-NEXT: 4 2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 2 eee +# HASH-64-NEXT: 5 2: 0000000000001001 0 NOTYPE WEAK DEFAULT 1 bbb +# HASH-64-NOT: {{.}} + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .hash + Type: SHT_HASH + Flags: [ SHF_ALLOC ] + Link: .dynsym + Bucket: [ 1, 0, 0 ] + Chain: [ 0, 5, 4, 2, 0, 3 ] + - Name: .gnu.hash + Type: SHT_GNU_HASH + Flags: [ SHF_ALLOC ] + Link: .dynsym + Header: + SymNdx: 0x2 + Shift2: 0x0 + BloomFilter: [ 0x0 ] + HashBuckets: [ 0x00000000, 0x00000002, 0x00000004 ] + HashValues: [ 0x0B885C68, 0x0B886991, 0x0B886DF4, 0x0B8860CB ] + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [ SHF_ALLOC ] + Link: .dynstr + Entries: + - Tag: DT_HASH +## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x2b8. DT_HASH value is 0x0. +## llvm-readelf will read .hash content from p_offset + (p_vaddr - DT_HASH value) = 0x2b8. +## This matches the file offset of the .hash section. + Value: 0x0000000000000000 + - Tag: DT_GNU_HASH +## PT_LOAD's p_vaddr is 0x0. PT_LOAD's p_offset = 0x2b8. 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) = 0x2e4. +## 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=3 %s -o %t2-32.so +# RUN: llvm-readelf --hash-symbols %t2-32.so \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-HASH-32 + +# ONLY-HASH-32: Symbol table of .hash for image: +# ONLY-HASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# ONLY-HASH-32-NEXT: 1 0: 00000000 0 NOTYPE GLOBAL DEFAULT UND ccc +# ONLY-HASH-32-NEXT: 5 0: 00001001 0 NOTYPE WEAK DEFAULT 1 bbb +# ONLY-HASH-32-NEXT: 3 0: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# ONLY-HASH-32-NEXT: 2 0: 00001000 0 NOTYPE GLOBAL DEFAULT 1 aaa +# ONLY-HASH-32-NEXT: 4 0: 00000000 0 NOTYPE GLOBAL DEFAULT 2 eee +# ONLY-HASH-32-NOT: {{.}} + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 +Sections: + - Name: .hash + Type: SHT_HASH + Flags: [ SHF_ALLOC ] + Link: .dynsym + Bucket: [ 1, 0, 0 ] + Chain: [ 0, 5, 4, 2, 0, 3 ] + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [ 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=4 %s -o %t3-32.so +# RUN: llvm-readelf --hash-symbols %t3-32.so \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix ONLY-GNUHASH-32 + +# ONLY-GNUHASH-32: Symbol table of .gnu.hash for image: +# ONLY-GNUHASH-32-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# ONLY-GNUHASH-32-NEXT: 2 1: 00001000 0 NOTYPE GLOBAL DEFAULT 2 aaa +# ONLY-GNUHASH-32-NEXT: 3 1: 00000001 0 NOTYPE GLOBAL DEFAULT ABS ddd +# ONLY-GNUHASH-32-NEXT: 4 2: 00000000 0 NOTYPE GLOBAL DEFAULT 1 eee +# ONLY-GNUHASH-32-NEXT: 5 2: 00001001 0 NOTYPE WEAK DEFAULT 2 bbb +# ONLY-GNUHASH-32-NOT: {{.}} + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 +Sections: + - Name: .gnu.hash + Type: SHT_GNU_HASH + Flags: [ SHF_ALLOC ] + Link: .dynsym + Header: + SymNdx: 0x2 + Shift2: 0x0 + BloomFilter: [ 0x0 ] + HashBuckets: [ 0x0, 0x2, 0x4 ] + HashValues: [ 0x0B885C68, 0x0B886991, 0x0B886DF4, 0x0B8860CB ] + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [ 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=5 %s -o %t4.so +# RUN: llvm-readelf --hash-symbols %t4.so \ +# 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.so | 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 + +## 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=6 %s -o %t6.so +# RUN: llvm-readelf --hash-symbols %t6.so 2>&1 | FileCheck %s -DFILE=%t6.so --check-prefix=BROKEN + +# BROKEN: Symbol table of .hash for image: +# BROKEN-NEXT: Num Buc: Value Size Type Bind Vis Ndx Name +# BROKEN-NEXT: 1 0: 00000000 0 NOTYPE LOCAL DEFAULT UND aaa +# BROKEN: warning: '[[FILE]]': .hash section is invalid: bucket 1: a cycle was detected in the linked chain + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 +Sections: + - Name: .hash + Type: SHT_HASH + Link: .dynsym + Bucket: [ 1 ] + Chain: [ 1, 1 ] + - Name: .dynamic + Type: SHT_DYNAMIC + 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 +DynamicSymbols: + - Name: aaa + - Name: bbb +ProgramHeaders: + - Type: PT_LOAD + Sections: + - Section: .hash + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/headers.test b/llvm/test/tools/llvm-readobj/ELF/headers.test new file mode 100644 index 00000000000..cc05ece49fb --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/headers.test @@ -0,0 +1,5 @@ +RUN: llvm-readelf -e %p/Inputs/trivial.obj.elf-i386 > %t.e +RUN: llvm-readelf --headers %p/Inputs/trivial.obj.elf-i386 > %t.headers +RUN: llvm-readelf -h -l -S %p/Inputs/trivial.obj.elf-i386 > %t.hlS +RUN: cmp %t.e %t.headers +RUN: cmp %t.e %t.hlS diff --git a/llvm/test/tools/llvm-readobj/ELF/hex-dump-multi.s b/llvm/test/tools/llvm-readobj/ELF/hex-dump-multi.s new file mode 100644 index 00000000000..33ef534e81e --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/hex-dump-multi.s @@ -0,0 +1,21 @@ +# REQUIRES: x86-registered-target + +# RUN: llvm-mc -filetype=obj -triple x86_64 %s -o %t.o +# RUN: llvm-readobj -x .a -x .b %t.o | FileCheck %s +# RUN: llvm-readelf -x .a -x .b %t.o | FileCheck %s + +# CHECK: Hex dump of section '.a': +# CHECK-NEXT: 0x00000000 00 +# CHECK-EMPTY: +# CHECK-NEXT: Hex dump of section '.b': +# CHECK-NEXT: 0x00000000 01 +# CHECK-EMPTY: +# CHECK-NEXT: Hex dump of section '.a': +# CHECK-NEXT: 0x00000000 02 + +.section .a,"a",@progbits,unique,0 +.byte 0 +.section .b,"a",@progbits +.byte 1 +.section .a,"a",@progbits,unique,1 +.byte 2 diff --git a/llvm/test/tools/llvm-readobj/ELF/hidden-versym.test b/llvm/test/tools/llvm-readobj/ELF/hidden-versym.test new file mode 100644 index 00000000000..0dcee4ab09d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/hidden-versym.test @@ -0,0 +1,42 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readelf -V %t | FileCheck %s --check-prefix=HIDDEN + +# HIDDEN: Version symbols section '.gnu.version' contains 2 entries: +# HIDDEN-NEXT: Addr: 0000000000200210 Offset: 0x000040 Link: 5 (.dynsym) +# HIDDEN-NEXT: 000: 0 (*local*) 3h(hiddensym) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x0000000000201000 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Address: 0x0000000000200210 + Link: .dynsym + AddressAlign: 0x0000000000000002 + EntSize: 0x0000000000000002 + Entries: [ 0, 0x8003 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Address: 0x0000000000200250 + Link: .dynstr + AddressAlign: 0x0000000000000004 + Info: 0x0000000000000001 + Dependencies: + - Version: 1 + File: somefile + Entries: + - Name: hiddensym + Hash: 1234 + Flags: 0 + Other: 3 +DynamicSymbols: + - Name: h + Binding: STB_GLOBAL +... diff --git a/llvm/test/tools/llvm-readobj/ELF/invalid-shstrndx.test b/llvm/test/tools/llvm-readobj/ELF/invalid-shstrndx.test new file mode 100644 index 00000000000..f57f7e83c9a --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/invalid-shstrndx.test @@ -0,0 +1,26 @@ +# RUN: yaml2obj %s -o %t +# RUN: not llvm-readelf --headers -S 2>&1 %t | FileCheck %s -DFILE=%t --check-prefix=GNU +# RUN: not llvm-readobj --headers -S 2>&1 %t | FileCheck %s -DFILE=%t --check-prefix=LLVM + +# GNU: ELF Header: +# GNU: Section header string table index: 255 +# GNU-NEXT: There are 3 section headers, starting at offset 0x58: +# GNU: Section Headers: +# GNU-NEXT: [Nr] Name +# GNU-EMPTY: +# GNU-NEXT: error: '[[FILE]]': section header string table index 255 does not exist + +# LLVM: ElfHeader { +# LLVM: StringTableSectionIndex: 255 +# LLVM-NEXT: } +# LLVM-NEXT: Sections [ +# LLVM-EMPTY: +# LLVM-NEXT: error: '[[FILE]]': section header string table index 255 does not exist + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + SHStrNdx: 0xFF diff --git a/llvm/test/tools/llvm-readobj/ELF/linker-options.test b/llvm/test/tools/llvm-readobj/ELF/linker-options.test new file mode 100644 index 00000000000..488f2b16f2d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/linker-options.test @@ -0,0 +1,59 @@ +## Check that we can use the --elf-linker-options option +## to dump SHT_LLVM_LINKER_OPTIONS sections. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readobj --elf-linker-options %t1 2>&1 | FileCheck %s --check-prefix=CHECK -DFILE=%t1 + +# CHECK: LinkerOptions [ +# CHECK: option 0: value 0 +# CHECK: option 1: value 1 +# CHECK-EMPTY: +# CHECK-NEXT: warning: '[[FILE]]': SHT_LLVM_LINKER_OPTIONS section at index 2 is broken: an incomplete key-value pair was found. The last possible key was: "c" +# CHECK-EMPTY: +# CHECK-NEXT: warning: '[[FILE]]': SHT_LLVM_LINKER_OPTIONS section at index 4 is broken: the content is not null-terminated +# CHECK-NEXT: option 3: value 3 +# CHECK-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: +## Case 1: a correct case. + - Name: .linker-options.valid1 + Type: SHT_LLVM_LINKER_OPTIONS + Options: + - Name: option 0 + Value: value 0 + - Name: option 1 + Value: value 1 +## Case 2: check we do not attempt to dump data from outside the SHT_LLVM_LINKER_OPTIONS section +## when it contains an incomplete key-value pair. + - Name: .linker-options.incomplete + Type: SHT_LLVM_LINKER_OPTIONS + Content: "610062006300" ## 'a', '\0', 'b', '\0', 'c', '\0' + - Type: Fill + Pattern: "FF" + Size: "1" +## Case 3: in case of an empty section we dump nothing. + - Name: .linker-options.empty + Type: SHT_LLVM_LINKER_OPTIONS + Content: "" +## Case 4: check we do not attempt to dump data from outside the SHT_LLVM_LINKER_OPTIONS section +## when it is not null-terminated. + - Name: .linker-options.nonul + Type: SHT_LLVM_LINKER_OPTIONS + Content: "61" +## Case 5: another correct case to show we do not stop dumping after reporting a warning. + - Name: .linker-options.valid2 + Type: SHT_LLVM_LINKER_OPTIONS + Options: + - Name: option 3 + Value: value 3 + +## llvm-readelf doesn't support --elf-linker-options yet. +# RUN: llvm-readelf --elf-linker-options %t1 2>&1 | FileCheck %s --check-prefix=READELF + +# READELF: printELFLinkerOptions not implemented! diff --git a/llvm/test/tools/llvm-readobj/ELF/loadname.test b/llvm/test/tools/llvm-readobj/ELF/loadname.test new file mode 100644 index 00000000000..d12076fd46c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/loadname.test @@ -0,0 +1,50 @@ +## Check we are able to dump library soname properly. + +# RUN: yaml2obj %s -o %t.o +# RUN: llvm-readobj %t.o | FileCheck %s --check-prefix LLVM +# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --check-prefix GNU + +# LLVM: Format: ELF64-x86-64 +# LLVM-NEXT: Arch: x86_64 +# LLVM-NEXT: AddressSize: 64bit +# LLVM-NEXT: LoadName: test.so + +# GNU: Dynamic section at offset 0x80 contains 4 entries: +# GNU-NEXT: Tag Type Name/Value +# GNU-NEXT: 0x0000000000000005 (STRTAB) 0x0 +# GNU-NEXT: 0x000000000000000a (STRSZ) 7 (bytes) +# GNU-NEXT: 0x000000000000000e (SONAME) Library soname: [test.so] +# GNU-NEXT: 0x0000000000000000 (NULL) 0x0 + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Flags: [ SHF_ALLOC ] + Content: '746573742e736f00' ## "test.so" + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [ SHF_ALLOC ] + Link: .dynstr + Entries: + - Tag: DT_STRTAB + Value: 0x0000000000000000 + - Tag: DT_STRSZ + Value: 0x0000000000000007 + - Tag: DT_SONAME + Value: 0x0000000000000000 + - Tag: DT_NULL + Value: 0x0000000000000000 +ProgramHeaders: + - Type: PT_LOAD + Flags: [ PF_R ] + VAddr: 0x0000 + PAddr: 0x0000 + Sections: + - Section: .dynstr + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/machine-specific-section-types.test b/llvm/test/tools/llvm-readobj/ELF/machine-specific-section-types.test new file mode 100644 index 00000000000..e564bf19987 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/machine-specific-section-types.test @@ -0,0 +1,95 @@ +# Show that all machine-specific section types are properly printed for both LLVM and +# GNU styles for ELF files with that machine type. + +# RUN: yaml2obj %s --docnum=1 -o %t-arm.o +# RUN: llvm-readobj --section-headers %t-arm.o | FileCheck %s --check-prefix=ARM-LLVM +# RUN: llvm-readelf --section-headers %t-arm.o | FileCheck %s --check-prefix=ARM-GNU + +# RUN: yaml2obj %s --docnum=2 -o %t-x86_64.o +# RUN: llvm-readobj --section-headers %t-x86_64.o | FileCheck %s --check-prefix=X86-LLVM +# RUN: llvm-readelf --section-headers %t-x86_64.o | FileCheck %s --check-prefix=X86-GNU + +# RUN: yaml2obj %s --docnum=3 -o %t-mips.o +# RUN: llvm-readobj --section-headers %t-mips.o | FileCheck %s --check-prefix=MIPS-LLVM +# RUN: llvm-readelf --section-headers %t-mips.o | FileCheck %s --check-prefix=MIPS-GNU + +# ARM-LLVM: Name: exidx +# ARM-LLVM: Type: SHT_ARM_EXIDX +# ARM-LLVM: Name: preemptmap +# ARM-LLVM: Type: SHT_ARM_PREEMPTMAP +# ARM-LLVM: Name: attributes +# ARM-LLVM: Type: SHT_ARM_ATTRIBUTES +# ARM-LLVM: Name: debugoverlay +# ARM-LLVM: Type: SHT_ARM_DEBUGOVERLAY +# ARM-LLVM: Name: overlaysection +# ARM-LLVM: Type: SHT_ARM_OVERLAYSECTION + +# ARM-GNU: exidx ARM_EXIDX +# ARM-GNU: preemptmap ARM_PREEMPTMAP +# ARM-GNU: attributes ARM_ATTRIBUTES +# ARM-GNU: debugoverlay ARM_DEBUGOVERLAY +# ARM-GNU: overlaysection ARM_OVERLAYSECTION + +# X86-LLVM: Name: unwind +# X86-LLVM: Type: SHT_X86_64_UNWIND + +# X86-GNU: unwind X86_64_UNWIND + +# MIPS-LLVM: Name: reginfo +# MIPS-LLVM: Type: SHT_MIPS_REGINFO +# MIPS-LLVM: Name: options +# MIPS-LLVM: Type: SHT_MIPS_OPTIONS +# MIPS-LLVM: Name: abiflags +# MIPS-LLVM: Type: SHT_MIPS_ABIFLAGS +# MIPS-LLVM: Name: dwarf +# MIPS-LLVM: Type: SHT_MIPS_DWARF + +# MIPS-GNU: reginfo MIPS_REGINFO +# MIPS-GNU: options MIPS_OPTIONS +# MIPS-GNU: abiflags MIPS_ABIFLAGS +# MIPS-GNU: dwarf MIPS_DWARF + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM +Sections: + - Name: exidx + Type: SHT_ARM_EXIDX + - Name: preemptmap + Type: SHT_ARM_PREEMPTMAP + - Name: attributes + Type: SHT_ARM_ATTRIBUTES + - Name: debugoverlay + Type: SHT_ARM_DEBUGOVERLAY + - Name: overlaysection + Type: SHT_ARM_OVERLAYSECTION + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: unwind + Type: SHT_X86_64_UNWIND + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS +Sections: + - Name: reginfo + Type: SHT_MIPS_REGINFO + - Name: options + Type: SHT_MIPS_OPTIONS + - Name: abiflags + Type: SHT_MIPS_ABIFLAGS + ISA: MIPS64 + - Name: dwarf + Type: SHT_MIPS_DWARF diff --git a/llvm/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test b/llvm/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test new file mode 100644 index 00000000000..a6aa2915aa4 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test @@ -0,0 +1,47 @@ +# If the offset and/or size fields of the PT_DYNAMIC field become corrupted, +# we should report a sensible message. + +# Creating such a malformed file is hard. The easiest way to simulate it is to +# truncate the file. Note that the section headers must first be stripped or +# llvm-readobj will fail to parse the file due to the section header table +# offset pointing outside the file. + +# RUN: yaml2obj %s -o %t.base +# RUN: llvm-objcopy --strip-sections %t.base %t.stripped + +# Test case where the size is too large to fit in the file, but the start is +# within the file. +# RUN: cp %t.stripped %t.truncated1 +# RUN: %python -c "with open(r'%t.truncated1', 'r+') as f: f.truncate(0x1001)" +# RUN: llvm-readobj %t.truncated1 --dynamic-table 2>&1 | FileCheck -DFILE=%t.truncated1 %s + +# Test case where the offset is too large to be in the file. +# RUN: cp %t.stripped %t.truncated2 +# RUN: %python -c "with open(r'%t.truncated2', 'r+') as f: f.truncate(0xFFF)" +# RUN: llvm-readobj %t.truncated2 --dynamic-table 2>&1 | FileCheck -DFILE=%t.truncated2 %s + +# CHECK: warning: '[[FILE]]': PT_DYNAMIC segment offset + size exceeds the size of the file + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1000 + AddressAlign: 0x1000 + Entries: + - Tag: DT_NULL + Value: 0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/many-sections.s b/llvm/test/tools/llvm-readobj/ELF/many-sections.s new file mode 100644 index 00000000000..ae7ce34706c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/many-sections.s @@ -0,0 +1,57 @@ +## Here we simulate an object with more than ~65k sections and check how we dump it. +## When an ELF object has SHN_LORESERVE (0xff00) or more sections, its e_shnum field +## should be zero and sh_size of the section header at index 0 is used +## to store the value. If the section name string table section index is +## greater than or equal to SHN_LORESERVE, then e_shstrndx field +## should have the value of SHN_XINDEX and sh_link of the section header +## at index 0 is used to store the value. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readelf --file-headers -S %t1 | FileCheck %s --check-prefix=GNU1 +# GNU1: Number of section headers: 0 (3) +# GNU1: Section header string table index: 65535 (2) +# GNU1: There are 3 section headers, starting at offset 0x58 + +# RUN: llvm-readobj --file-headers %t1 | FileCheck %s --check-prefix=LLVM1 +# LLVM1: SectionHeaderCount: 0 (3) +# LLVM1: StringTableSectionIndex: 65535 (2) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + SHNum: 0 + SHStrNdx: 0xffff ## SHN_XINDEX +Sections: + - Type: SHT_NULL + Link: .shstrtab + Size: 0x3 + +## Another case is when e_shoff field set to zero, but not e_shstrndx. +## We want to show that this corrupt case is handled correctly. + +# RUN: yaml2obj --docnum=2 %s -o %t2 + +# RUN: llvm-readelf --file-headers %t2 | FileCheck %s --check-prefix=GNU2 +# GNU2: Number of section headers: 0 +# GNU2: Section header string table index: 65535 (corrupt: out of range) + +# RUN: llvm-readobj --file-headers %t2 | FileCheck %s --check-prefix=LLVM2 +# LLVM2: SectionHeaderCount: 0 +# LLVM2: StringTableSectionIndex: 65535 (corrupt: out of range) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + SHOff: 0 + SHNum: 0 + SHStrNdx: 0xffff ## SHN_XINDEX +Sections: + - Type: SHT_NULL + Link: .shstrtab + Size: 0x3 diff --git a/llvm/test/tools/llvm-readobj/ELF/many-sections2.s b/llvm/test/tools/llvm-readobj/ELF/many-sections2.s new file mode 100644 index 00000000000..60c42faea39 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/many-sections2.s @@ -0,0 +1,24 @@ +# Tests that symbols whose section index is SHN_XINDEX are displayed +# correctly. They should not be treated as processor/OS specific or +# reserved. +# REQUIRES: x86-registered-target +# RUN: llvm-mc %s -filetype=obj -triple=x86_64-pc-linux -o %t +# RUN: llvm-readelf -s %t | FileCheck %s + +.irp i, 0, 1, 2, 3, 4, 5, 6, + .irp j, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + .irp k, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + .irp l, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + .irp q, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + .section sec_\i\j\k\l\q + .globl sym_\i\j\k\l\q + sym_\i\j\k\l\q: + .endr + .endr + .endr + .endr +.endr + +# CHECK: 65278: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 65280 sym_65277 +# CHECK: 65310: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 65312 sym_65309 +# CHECK: 65342: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 65344 sym_65341 diff --git a/llvm/test/tools/llvm-readobj/ELF/merged.test b/llvm/test/tools/llvm-readobj/ELF/merged.test new file mode 100644 index 00000000000..a6f567cda6c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/merged.test @@ -0,0 +1,13 @@ +# Check merged args produce identical output to when not merged. +RUN: llvm-readelf -aeWhSrnudlVgIs %p/Inputs/trivial.obj.elf-i386 > %t.merged +RUN: llvm-readelf -a -e -W -h -S -r -n -u -d -l -V -g -I -s %p/Inputs/trivial.obj.elf-i386 > %t.not-merged +RUN: cmp %t.merged %t.not-merged +RUN: FileCheck %s --input-file %t.merged + +# llvm-readobj does not support merged args, because it also supports some old +# flags (-st, -sd, etc.), and it would be confusing if only some merged args +# were supported. +RUN: not llvm-readobj -aeWhSrnudlVgIs %p/Inputs/trivial.obj.elf-i386 2>&1 | FileCheck %s --check-prefix=UNKNOWN + +CHECK-NOT: Unknown command line argument +UNKNOWN: for the --section-headers option: may only occur zero or one times! diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-abiflags.test b/llvm/test/tools/llvm-readobj/ELF/mips-abiflags.test new file mode 100644 index 00000000000..54797bfa76f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-abiflags.test @@ -0,0 +1,71 @@ +RUN: llvm-readobj -A %p/Inputs/abiflags.obj.elf-mipsel | \ +RUN: FileCheck -check-prefix=EL64 %s +RUN: llvm-readobj -A %p/Inputs/abiflags.obj.elf-mips | \ +RUN: FileCheck -check-prefix=BE32 %s + +RUN: llvm-readelf -A %p/Inputs/abiflags.obj.elf-mipsel | \ +RUN: FileCheck -check-prefix=GNU-EL64 %s +RUN: llvm-readelf -A %p/Inputs/abiflags.obj.elf-mips | \ +RUN: FileCheck -check-prefix=GNU-BE32 %s + +EL64: MIPS ABI Flags { +EL64-NEXT: Version: 0 +EL64-NEXT: ISA: MIPS64r5 +EL64-NEXT: ISA Extension: Cavium Networks Octeon3 (0x13) +EL64-NEXT: ASEs [ (0x103) +EL64-NEXT: DSP (0x1) +EL64-NEXT: DSPR2 (0x2) +EL64-NEXT: VZ (0x100) +EL64-NEXT: ] +EL64-NEXT: FP ABI: Hard float (double precision) (0x1) +EL64-NEXT: GPR size: 64 +EL64-NEXT: CPR1 size: 64 +EL64-NEXT: CPR2 size: 0 +EL64-NEXT: Flags 1 [ (0x1) +EL64-NEXT: ODDSPREG (0x1) +EL64-NEXT: ] +EL64-NEXT: Flags 2: 0x0 +EL64-NEXT: } + +BE32: MIPS ABI Flags { +BE32-NEXT: Version: 0 +BE32-NEXT: ISA: MIPS32r2 +BE32-NEXT: ISA Extension: None (0x0) +BE32-NEXT: ASEs [ (0x803) +BE32-NEXT: DSP (0x1) +BE32-NEXT: DSPR2 (0x2) +BE32-NEXT: microMIPS (0x800) +BE32-NEXT: ] +BE32-NEXT: FP ABI: Soft float (0x3) +BE32-NEXT: GPR size: 32 +BE32-NEXT: CPR1 size: 0 +BE32-NEXT: CPR2 size: 0 +BE32-NEXT: Flags 1 [ (0x1) +BE32-NEXT: ODDSPREG (0x1) +BE32-NEXT: ] +BE32-NEXT: Flags 2: 0x0 +BE32-NEXT: } + +GNU-EL64: MIPS ABI Flags Version: 0 +GNU-EL64-EMPTY: +GNU-EL64-NEXT: ISA: MIPS64r5 +GNU-EL64-NEXT: GPR size: 64 +GNU-EL64-NEXT: CPR1 size: 64 +GNU-EL64-NEXT: CPR2 size: 0 +GNU-EL64-NEXT: FP ABI: Hard float (double precision) +GNU-EL64-NEXT: ISA Extension: Cavium Networks Octeon3 +GNU-EL64-NEXT: ASEs: DSP, DSPR2, VZ +GNU-EL64-NEXT: FLAGS 1: 00000001 +GNU-EL64-NEXT: FLAGS 2: 00000000 + +GNU-BE32: MIPS ABI Flags Version: 0 +GNU-BE32-EMPTY: +GNU-BE32-NEXT: ISA: MIPS32r2 +GNU-BE32-NEXT: GPR size: 32 +GNU-BE32-NEXT: CPR1 size: 0 +GNU-BE32-NEXT: CPR2 size: 0 +GNU-BE32-NEXT: FP ABI: Soft float +GNU-BE32-NEXT: ISA Extension: None +GNU-BE32-NEXT: ASEs: DSP, DSPR2, microMIPS +GNU-BE32-NEXT: FLAGS 1: 00000001 +GNU-BE32-NEXT: FLAGS 2: 00000000 diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-got-overlapped.test b/llvm/test/tools/llvm-readobj/ELF/mips-got-overlapped.test new file mode 100644 index 00000000000..881c63b79a4 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-got-overlapped.test @@ -0,0 +1,45 @@ +# Check that llvm-readobj -A correctly shows .got section +# content if there are some other zero-sized sections with the same +# address as the .got. got-over.exe.elf-mips has zero-sized .data +# section at the same offset .got section. + +RUN: llvm-readobj -A %p/Inputs/got-over.exe.elf-mips | FileCheck %s + +GOT-OBJ: Cannot find PLTGOT dynamic table tag. + +CHECK: Primary GOT { +CHECK-NEXT: Canonical gp value: 0x418270 +CHECK-NEXT: Reserved entries [ +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410280 +CHECK-NEXT: Access: -32752 +CHECK-NEXT: Initial: 0x0 +CHECK-NEXT: Purpose: Lazy resolver +CHECK-NEXT: } +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410284 +CHECK-NEXT: Access: -32748 +CHECK-NEXT: Initial: 0x80000000 +CHECK-NEXT: Purpose: Module pointer (GNU extension) +CHECK-NEXT: } +CHECK-NEXT: ] +CHECK-NEXT: Local entries [ +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410288 +CHECK-NEXT: Access: -32744 +CHECK-NEXT: Initial: 0x4001B8 +CHECK-NEXT: } +CHECK-NEXT: ] +CHECK-NEXT: Global entries [ +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x41028C +CHECK-NEXT: Access: -32740 +CHECK-NEXT: Initial: 0x0 +CHECK-NEXT: Value: 0x0 +CHECK-NEXT: Type: None +CHECK-NEXT: Section: Undefined +CHECK-NEXT: Name: _foo +CHECK-NEXT: } +CHECK-NEXT: ] +CHECK-NEXT: Number of TLS and multi-GOT entries: 0 +CHECK-NEXT: } diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-got.test b/llvm/test/tools/llvm-readobj/ELF/mips-got.test new file mode 100644 index 00000000000..8ed35d4b68e --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-got.test @@ -0,0 +1,486 @@ +RUN: llvm-readobj -A %p/Inputs/dynamic-table-exe.mips | \ +RUN: FileCheck %s -check-prefix GOT-EXE +RUN: llvm-readobj -A %p/Inputs/dynamic-table-so.mips | \ +RUN: FileCheck %s -check-prefix GOT-SO +RUN: llvm-readobj -A %p/Inputs/got-tls.so.elf-mips64el | \ +RUN: FileCheck %s -check-prefix GOT-TLS +RUN: llvm-readobj -A %p/Inputs/got-empty.exe.mipsel | \ +RUN: FileCheck %s -check-prefix GOT-EMPTY +RUN: llvm-readobj -A %p/Inputs/got-static.exe.mips | \ +RUN: FileCheck %s -check-prefix GOT-STATIC + +RUN: llvm-readelf -A %p/Inputs/dynamic-table-exe.mips | \ +RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-EXE +RUN: llvm-readelf -A %p/Inputs/dynamic-table-so.mips | \ +RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-SO +RUN: llvm-readelf -A %p/Inputs/got-tls.so.elf-mips64el | \ +RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-TLS +RUN: llvm-readelf -A %p/Inputs/got-empty.exe.mipsel | \ +RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-EMPTY +RUN: llvm-readelf -A %p/Inputs/got-static.exe.mips | \ +RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-STATIC + +GOT-EXE: Primary GOT { +GOT-EXE-NEXT: Canonical gp value: 0x418880 +GOT-EXE-NEXT: Reserved entries [ +GOT-EXE-NEXT: Entry { +GOT-EXE-NEXT: Address: 0x410890 +GOT-EXE-NEXT: Access: -32752 +GOT-EXE-NEXT: Initial: 0x0 +GOT-EXE-NEXT: Purpose: Lazy resolver +GOT-EXE-NEXT: } +GOT-EXE-NEXT: Entry { +GOT-EXE-NEXT: Address: 0x410894 +GOT-EXE-NEXT: Access: -32748 +GOT-EXE-NEXT: Initial: 0x80000000 +GOT-EXE-NEXT: Purpose: Module pointer (GNU extension) +GOT-EXE-NEXT: } +GOT-EXE-NEXT: ] +GOT-EXE-NEXT: Local entries [ +GOT-EXE-NEXT: Entry { +GOT-EXE-NEXT: Address: 0x410898 +GOT-EXE-NEXT: Access: -32744 +GOT-EXE-NEXT: Initial: 0x400418 +GOT-EXE-NEXT: } +GOT-EXE-NEXT: Entry { +GOT-EXE-NEXT: Address: 0x41089C +GOT-EXE-NEXT: Access: -32740 +GOT-EXE-NEXT: Initial: 0x410840 +GOT-EXE-NEXT: } +GOT-EXE-NEXT: Entry { +GOT-EXE-NEXT: Address: 0x4108A0 +GOT-EXE-NEXT: Access: -32736 +GOT-EXE-NEXT: Initial: 0x0 +GOT-EXE-NEXT: } +GOT-EXE-NEXT: ] +GOT-EXE-NEXT: Global entries [ +GOT-EXE-NEXT: Entry { +GOT-EXE-NEXT: Address: 0x4108A4 +GOT-EXE-NEXT: Access: -32732 +GOT-EXE-NEXT: Initial: 0x0 +GOT-EXE-NEXT: Value: 0x0 +GOT-EXE-NEXT: Type: Function (0x2) +GOT-EXE-NEXT: Section: Undefined (0x0) +GOT-EXE-NEXT: Name: __gmon_start__ (1) +GOT-EXE-NEXT: } +GOT-EXE-NEXT: ] +GOT-EXE-NEXT: Number of TLS and multi-GOT entries: 0 +GOT-EXE-NEXT: } + +GOT-SO: Primary GOT { +GOT-SO-NEXT: Canonical gp value: 0x188D0 +GOT-SO-NEXT: Reserved entries [ +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x108E0 +GOT-SO-NEXT: Access: -32752 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: Purpose: Lazy resolver +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x108E4 +GOT-SO-NEXT: Access: -32748 +GOT-SO-NEXT: Initial: 0x80000000 +GOT-SO-NEXT: Purpose: Module pointer (GNU extension) +GOT-SO-NEXT: } +GOT-SO-NEXT: ] +GOT-SO-NEXT: Local entries [ +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x108E8 +GOT-SO-NEXT: Access: -32744 +GOT-SO-NEXT: Initial: 0x108E0 +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x108EC +GOT-SO-NEXT: Access: -32740 +GOT-SO-NEXT: Initial: 0x10000 +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x108F0 +GOT-SO-NEXT: Access: -32736 +GOT-SO-NEXT: Initial: 0x10920 +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x108F4 +GOT-SO-NEXT: Access: -32732 +GOT-SO-NEXT: Initial: 0x108CC +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x108F8 +GOT-SO-NEXT: Access: -32728 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x108FC +GOT-SO-NEXT: Access: -32724 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x10900 +GOT-SO-NEXT: Access: -32720 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x10904 +GOT-SO-NEXT: Access: -32716 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: } +GOT-SO-NEXT: ] +GOT-SO-NEXT: Global entries [ +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x10908 +GOT-SO-NEXT: Access: -32712 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: Value: 0x0 +GOT-SO-NEXT: Type: None (0x0) +GOT-SO-NEXT: Section: Undefined (0x0) +GOT-SO-NEXT: Name: _ITM_registerTMCloneTable (87) +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x1090C +GOT-SO-NEXT: Access: -32708 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: Value: 0x0 +GOT-SO-NEXT: Type: None (0x0) +GOT-SO-NEXT: Section: Undefined (0x0) +GOT-SO-NEXT: Name: _Jv_RegisterClasses (128) +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x10910 +GOT-SO-NEXT: Access: -32704 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: Value: 0x0 +GOT-SO-NEXT: Type: Function (0x2) +GOT-SO-NEXT: Section: Undefined (0x0) +GOT-SO-NEXT: Name: __gmon_start__ (23) +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x10914 +GOT-SO-NEXT: Access: -32700 +GOT-SO-NEXT: Initial: 0x840 +GOT-SO-NEXT: Value: 0x840 +GOT-SO-NEXT: Type: Function (0x2) +GOT-SO-NEXT: Section: Undefined (0x0) +GOT-SO-NEXT: Name: puts@GLIBC_2.0 (162) +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x10918 +GOT-SO-NEXT: Access: -32696 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: Value: 0x0 +GOT-SO-NEXT: Type: None (0x0) +GOT-SO-NEXT: Section: Undefined (0x0) +GOT-SO-NEXT: Name: _ITM_deregisterTMCloneTable (59) +GOT-SO-NEXT: } +GOT-SO-NEXT: Entry { +GOT-SO-NEXT: Address: 0x1091C +GOT-SO-NEXT: Access: -32692 +GOT-SO-NEXT: Initial: 0x0 +GOT-SO-NEXT: Value: 0x0 +GOT-SO-NEXT: Type: Function (0x2) +GOT-SO-NEXT: Section: Undefined (0x0) +GOT-SO-NEXT: Name: __cxa_finalize@GLIBC_2.2 (113) +GOT-SO-NEXT: } +GOT-SO-NEXT: ] +GOT-SO-NEXT: Number of TLS and multi-GOT entries: 0 +GOT-SO-NEXT: } + +GOT-TLS: Primary GOT { +GOT-TLS-NEXT: Canonical gp value: 0x18BF0 +GOT-TLS-NEXT: Reserved entries [ +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C00 +GOT-TLS-NEXT: Access: -32752 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: Purpose: Lazy resolver +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C08 +GOT-TLS-NEXT: Access: -32744 +GOT-TLS-NEXT: Initial: 0x8000000000000000 +GOT-TLS-NEXT: Purpose: Module pointer (GNU extension) +GOT-TLS-NEXT: } +GOT-TLS-NEXT: ] +GOT-TLS-NEXT: Local entries [ +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C10 +GOT-TLS-NEXT: Access: -32736 +GOT-TLS-NEXT: Initial: 0x10000 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C18 +GOT-TLS-NEXT: Access: -32728 +GOT-TLS-NEXT: Initial: 0x10C00 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C20 +GOT-TLS-NEXT: Access: -32720 +GOT-TLS-NEXT: Initial: 0x10CB8 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C28 +GOT-TLS-NEXT: Access: -32712 +GOT-TLS-NEXT: Initial: 0x10BF0 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C30 +GOT-TLS-NEXT: Access: -32704 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C38 +GOT-TLS-NEXT: Access: -32696 +GOT-TLS-NEXT: Initial: 0x948 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C40 +GOT-TLS-NEXT: Access: -32688 +GOT-TLS-NEXT: Initial: 0xA20 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C48 +GOT-TLS-NEXT: Access: -32680 +GOT-TLS-NEXT: Initial: 0xAF0 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C50 +GOT-TLS-NEXT: Access: -32672 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C58 +GOT-TLS-NEXT: Access: -32664 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C60 +GOT-TLS-NEXT: Access: -32656 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: } +GOT-TLS-NEXT: ] +GOT-TLS-NEXT: Global entries [ +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C68 +GOT-TLS-NEXT: Access: -32648 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: Value: 0x0 +GOT-TLS-NEXT: Type: None (0x0) +GOT-TLS-NEXT: Section: Undefined (0x0) +GOT-TLS-NEXT: Name: _ITM_registerTMCloneTable (78) +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C70 +GOT-TLS-NEXT: Access: -32640 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: Value: 0x0 +GOT-TLS-NEXT: Type: None (0x0) +GOT-TLS-NEXT: Section: Undefined (0x0) +GOT-TLS-NEXT: Name: _Jv_RegisterClasses (119) +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C78 +GOT-TLS-NEXT: Access: -32632 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: Value: 0x0 +GOT-TLS-NEXT: Type: Function (0x2) +GOT-TLS-NEXT: Section: Undefined (0x0) +GOT-TLS-NEXT: Name: __gmon_start__ (23) +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C80 +GOT-TLS-NEXT: Access: -32624 +GOT-TLS-NEXT: Initial: 0xB60 +GOT-TLS-NEXT: Value: 0xB60 +GOT-TLS-NEXT: Type: Function (0x2) +GOT-TLS-NEXT: Section: Undefined (0x0) +GOT-TLS-NEXT: Name: __tls_get_addr@GLIBC_2.3 (150) +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C88 +GOT-TLS-NEXT: Access: -32616 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: Value: 0x0 +GOT-TLS-NEXT: Type: None (0x0) +GOT-TLS-NEXT: Section: Undefined (0x0) +GOT-TLS-NEXT: Name: _ITM_deregisterTMCloneTable (50) +GOT-TLS-NEXT: } +GOT-TLS-NEXT: Entry { +GOT-TLS-NEXT: Address: 0x10C90 +GOT-TLS-NEXT: Access: -32608 +GOT-TLS-NEXT: Initial: 0x0 +GOT-TLS-NEXT: Value: 0x0 +GOT-TLS-NEXT: Type: Function (0x2) +GOT-TLS-NEXT: Section: Undefined (0x0) +GOT-TLS-NEXT: Name: __cxa_finalize@GLIBC_2.2 (104) +GOT-TLS-NEXT: } +GOT-TLS-NEXT: ] +GOT-TLS-NEXT: Number of TLS and multi-GOT entries: 4 +GOT-TLS-NEXT: } + +GOT-EMPTY: Primary GOT { +GOT-EMPTY-NEXT: Canonical gp value: 0x409FF0 +GOT-EMPTY-NEXT: Reserved entries [ +GOT-EMPTY-NEXT: Entry { +GOT-EMPTY-NEXT: Address: 0x402000 +GOT-EMPTY-NEXT: Access: -32752 +GOT-EMPTY-NEXT: Initial: 0x0 +GOT-EMPTY-NEXT: Purpose: Lazy resolver +GOT-EMPTY-NEXT: } +GOT-EMPTY-NEXT: Entry { +GOT-EMPTY-NEXT: Address: 0x402004 +GOT-EMPTY-NEXT: Access: -32748 +GOT-EMPTY-NEXT: Initial: 0x80000000 +GOT-EMPTY-NEXT: Purpose: Module pointer (GNU extension) +GOT-EMPTY-NEXT: } +GOT-EMPTY-NEXT: ] +GOT-EMPTY-NEXT: Local entries [ +GOT-EMPTY-NEXT: ] +GOT-EMPTY-NEXT: Global entries [ +GOT-EMPTY-NEXT: ] +GOT-EMPTY-NEXT: Number of TLS and multi-GOT entries: 2 +GOT-EMPTY-NEXT: } + +GOT-STATIC: Static GOT { +GOT-STATIC-NEXT: Canonical gp value: 0x418100 +GOT-STATIC-NEXT: Reserved entries [ +GOT-STATIC-NEXT: Entry { +GOT-STATIC-NEXT: Address: 0x410110 +GOT-STATIC-NEXT: Access: -32752 +GOT-STATIC-NEXT: Initial: 0x0 +GOT-STATIC-NEXT: Purpose: Lazy resolver +GOT-STATIC-NEXT: } +GOT-STATIC-NEXT: Entry { +GOT-STATIC-NEXT: Address: 0x410114 +GOT-STATIC-NEXT: Access: -32748 +GOT-STATIC-NEXT: Initial: 0x80000000 +GOT-STATIC-NEXT: Purpose: Module pointer (GNU extension) +GOT-STATIC-NEXT: } +GOT-STATIC-NEXT: ] +GOT-STATIC-NEXT: Local entries [ +GOT-STATIC-NEXT: Entry { +GOT-STATIC-NEXT: Address: 0x410118 +GOT-STATIC-NEXT: Access: -32744 +GOT-STATIC-NEXT: Initial: 0x400000 +GOT-STATIC-NEXT: } +GOT-STATIC-NEXT: Entry { +GOT-STATIC-NEXT: Address: 0x41011C +GOT-STATIC-NEXT: Access: -32740 +GOT-STATIC-NEXT: Initial: 0x400100 +GOT-STATIC-NEXT: } +GOT-STATIC-NEXT: Entry { +GOT-STATIC-NEXT: Address: 0x410120 +GOT-STATIC-NEXT: Access: -32736 +GOT-STATIC-NEXT: Initial: 0x400104 +GOT-STATIC-NEXT: } +GOT-STATIC-NEXT: ] +GOT-STATIC-NEXT: } + +GNU-GOT-EXE: Primary GOT: +GNU-GOT-EXE-NEXT: Canonical gp value: 00418880 + +GNU-GOT-EXE: Reserved entries: +GNU-GOT-EXE-NEXT: Address Access Initial Purpose +GNU-GOT-EXE-NEXT: 00410890 -32752(gp) 00000000 Lazy resolver +GNU-GOT-EXE-NEXT: 00410894 -32748(gp) 80000000 Module pointer (GNU extension) + +GNU-GOT-EXE: Local entries: +GNU-GOT-EXE-NEXT: Address Access Initial +GNU-GOT-EXE-NEXT: 00410898 -32744(gp) 00400418 +GNU-GOT-EXE-NEXT: 0041089c -32740(gp) 00410840 +GNU-GOT-EXE-NEXT: 004108a0 -32736(gp) 00000000 + +GNU-GOT-EXE: Global entries: +GNU-GOT-EXE-NEXT: Address Access Initial Sym.Val. Type Ndx Name +GNU-GOT-EXE-NEXT: 004108a4 -32732(gp) 00000000 00000000 FUNC UND __gmon_start__ + +GNU-GOT-EXE: PLT GOT: + +GNU-GOT-EXE: Reserved entries: +GNU-GOT-EXE-NEXT: Address Initial Purpose +GNU-GOT-EXE-NEXT: 00410854 00000000 PLT lazy resolver +GNU-GOT-EXE-NEXT: 00410858 00000000 Module pointer + +GNU-GOT-EXE: Entries: +GNU-GOT-EXE-NEXT: Address Initial Sym.Val. Type Ndx Name +GNU-GOT-EXE-NEXT: 0041085c 00400800 00000000 FUNC UND puts +GNU-GOT-EXE-NEXT: 00410860 00400800 00000000 FUNC UND __libc_start_main + +GNU-GOT-SO: Primary GOT: +GNU-GOT-SO-NEXT: Canonical gp value: 000188d0 + +GNU-GOT-SO: Reserved entries: +GNU-GOT-SO-NEXT: Address Access Initial Purpose +GNU-GOT-SO-NEXT: 000108e0 -32752(gp) 00000000 Lazy resolver +GNU-GOT-SO-NEXT: 000108e4 -32748(gp) 80000000 Module pointer (GNU extension) + +GNU-GOT-SO: Local entries: +GNU-GOT-SO-NEXT: Address Access Initial +GNU-GOT-SO-NEXT: 000108e8 -32744(gp) 000108e0 +GNU-GOT-SO-NEXT: 000108ec -32740(gp) 00010000 +GNU-GOT-SO-NEXT: 000108f0 -32736(gp) 00010920 +GNU-GOT-SO-NEXT: 000108f4 -32732(gp) 000108cc +GNU-GOT-SO-NEXT: 000108f8 -32728(gp) 00000000 +GNU-GOT-SO-NEXT: 000108fc -32724(gp) 00000000 +GNU-GOT-SO-NEXT: 00010900 -32720(gp) 00000000 +GNU-GOT-SO-NEXT: 00010904 -32716(gp) 00000000 + +GNU-GOT-SO: Global entries: +GNU-GOT-SO-NEXT: Address Access Initial Sym.Val. Type Ndx Name +GNU-GOT-SO-NEXT: 00010908 -32712(gp) 00000000 00000000 NOTYPE UND _ITM_registerTMCloneTable +GNU-GOT-SO-NEXT: 0001090c -32708(gp) 00000000 00000000 NOTYPE UND _Jv_RegisterClasses +GNU-GOT-SO-NEXT: 00010910 -32704(gp) 00000000 00000000 FUNC UND __gmon_start__ +GNU-GOT-SO-NEXT: 00010914 -32700(gp) 00000840 00000840 FUNC UND puts +GNU-GOT-SO-NEXT: 00010918 -32696(gp) 00000000 00000000 NOTYPE UND _ITM_deregisterTMCloneTable +GNU-GOT-SO-NEXT: 0001091c -32692(gp) 00000000 00000000 FUNC UND __cxa_finalize + +GNU-GOT-TLS: Primary GOT: +GNU-GOT-TLS-NEXT: Canonical gp value: 0000000000018bf0 + +GNU-GOT-TLS: Reserved entries: +GNU-GOT-TLS-NEXT: Address Access Initial Purpose +GNU-GOT-TLS-NEXT: 0000000000010c00 -32752(gp) 0000000000000000 Lazy resolver +GNU-GOT-TLS-NEXT: 0000000000010c08 -32744(gp) 8000000000000000 Module pointer (GNU extension) + +GNU-GOT-TLS: Local entries: +GNU-GOT-TLS-NEXT: Address Access Initial +GNU-GOT-TLS-NEXT: 0000000000010c10 -32736(gp) 0000000000010000 +GNU-GOT-TLS-NEXT: 0000000000010c18 -32728(gp) 0000000000010c00 +GNU-GOT-TLS-NEXT: 0000000000010c20 -32720(gp) 0000000000010cb8 +GNU-GOT-TLS-NEXT: 0000000000010c28 -32712(gp) 0000000000010bf0 +GNU-GOT-TLS-NEXT: 0000000000010c30 -32704(gp) 0000000000000000 +GNU-GOT-TLS-NEXT: 0000000000010c38 -32696(gp) 0000000000000948 +GNU-GOT-TLS-NEXT: 0000000000010c40 -32688(gp) 0000000000000a20 +GNU-GOT-TLS-NEXT: 0000000000010c48 -32680(gp) 0000000000000af0 +GNU-GOT-TLS-NEXT: 0000000000010c50 -32672(gp) 0000000000000000 +GNU-GOT-TLS-NEXT: 0000000000010c58 -32664(gp) 0000000000000000 +GNU-GOT-TLS-NEXT: 0000000000010c60 -32656(gp) 0000000000000000 + +GNU-GOT-TLS: Global entries: +GNU-GOT-TLS-NEXT: Address Access Initial Sym.Val. Type Ndx Name +GNU-GOT-TLS-NEXT: 0000000000010c68 -32648(gp) 0000000000000000 0000000000000000 NOTYPE UND _ITM_registerTMCloneTable +GNU-GOT-TLS-NEXT: 0000000000010c70 -32640(gp) 0000000000000000 0000000000000000 NOTYPE UND _Jv_RegisterClasses +GNU-GOT-TLS-NEXT: 0000000000010c78 -32632(gp) 0000000000000000 0000000000000000 FUNC UND __gmon_start__ +GNU-GOT-TLS-NEXT: 0000000000010c80 -32624(gp) 0000000000000b60 0000000000000b60 FUNC UND __tls_get_addr +GNU-GOT-TLS-NEXT: 0000000000010c88 -32616(gp) 0000000000000000 0000000000000000 NOTYPE UND _ITM_deregisterTMCloneTable +GNU-GOT-TLS-NEXT: 0000000000010c90 -32608(gp) 0000000000000000 0000000000000000 FUNC UND __cxa_finalize + +GNU-GOTY : Primary GOT: +GNU-GOT-EMPTY: Canonical gp value: 00409ff0 + +GNU-GOTY : Reserved entries: +GNU-GOT-EMPTY: Address Access Initial Purpose +GNU-GOT-EMPTY: 00402000 -32752(gp) 00000000 Lazy resolver +GNU-GOT-EMPTY: 00402004 -32748(gp) 80000000 Module pointer (GNU extension) + +GNU-GOT-STATIC: Static GOT: +GNU-GOT-STATIC-NEXT: Canonical gp value: 00418100 + +GNU-GOT-STATIC: Reserved entries: +GNU-GOT-STATIC-NEXT: Address Access Initial Purpose +GNU-GOT-STATIC-NEXT: 00410110 -32752(gp) 00000000 Lazy resolver +GNU-GOT-STATIC-NEXT: 00410114 -32748(gp) 80000000 Module pointer (GNU extension) + +GNU-GOT-STATIC: Local entries: +GNU-GOT-STATIC-NEXT: Address Access Initial +GNU-GOT-STATIC-NEXT: 00410118 -32744(gp) 00400000 +GNU-GOT-STATIC-NEXT: 0041011c -32740(gp) 00400100 +GNU-GOT-STATIC-NEXT: 00410120 -32736(gp) 00400104 diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-options-sec.test b/llvm/test/tools/llvm-readobj/ELF/mips-options-sec.test new file mode 100644 index 00000000000..3636d56cfe6 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-options-sec.test @@ -0,0 +1,12 @@ +RUN: llvm-readobj -A %p/Inputs/options.obj.elf-mipsel | FileCheck %s + +CHECK: MIPS Options { +CHECK-NEXT: ODK_REGINFO { +CHECK-NEXT: GP: 0x0 +CHECK-NEXT: General Mask: 0xF2000017 +CHECK-NEXT: Co-Proc Mask0: 0x0 +CHECK-NEXT: Co-Proc Mask1: 0x0 +CHECK-NEXT: Co-Proc Mask2: 0x0 +CHECK-NEXT: Co-Proc Mask3: 0x0 +CHECK-NEXT: } +CHECK-NEXT: } diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-options.test b/llvm/test/tools/llvm-readobj/ELF/mips-options.test new file mode 100644 index 00000000000..d44b3c0096a --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-options.test @@ -0,0 +1,22 @@ +# Check DT_MIPS_OPTIONS .dynamic section tag reading + +RUN: llvm-readobj --dynamic-table %p/Inputs/mips-options.elf-mips64el | \ +RUN: FileCheck %s + +CHECK: DynamicSection [ (14 entries) +CHECK-NEXT: Tag Type Name/Value +CHECK-NEXT: 0x0000000000000004 HASH 0x158 +CHECK-NEXT: 0x0000000000000005 STRTAB 0x1C0 +CHECK-NEXT: 0x0000000000000006 SYMTAB 0x178 +CHECK-NEXT: 0x000000000000000A STRSZ 7 (bytes) +CHECK-NEXT: 0x000000000000000B SYMENT 24 (bytes) +CHECK-NEXT: 0x0000000070000001 MIPS_RLD_VERSION 1 +CHECK-NEXT: 0x0000000070000005 MIPS_FLAGS NOTPOT +CHECK-NEXT: 0x0000000070000006 MIPS_BASE_ADDRESS 0x0 +CHECK-NEXT: 0x000000007000000A MIPS_LOCAL_GOTNO 2 +CHECK-NEXT: 0x0000000070000011 MIPS_SYMTABNO 3 +CHECK-NEXT: 0x0000000070000013 MIPS_GOTSYM 0x3 +CHECK-NEXT: 0x0000000000000003 PLTGOT 0x2000 +CHECK-NEXT: 0x0000000070000029 MIPS_OPTIONS 0x1000 +CHECK-NEXT: 0x0000000000000000 NULL 0x0 +CHECK-NEXT: ] diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-plt.test b/llvm/test/tools/llvm-readobj/ELF/mips-plt.test new file mode 100644 index 00000000000..4e40ca6aa2c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-plt.test @@ -0,0 +1,64 @@ +RUN: llvm-readobj -A %p/Inputs/got-plt.exe.elf-mipsel | FileCheck %s +RUN: llvm-readelf -A %p/Inputs/got-plt.exe.elf-mipsel | FileCheck --check-prefix=GNU %s + +CHECK: PLT GOT { +CHECK-NEXT: Reserved entries [ +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410814 +CHECK-NEXT: Initial: 0x0 +CHECK-NEXT: Purpose: PLT lazy resolver +CHECK-NEXT: } +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410818 +CHECK-NEXT: Initial: 0x0 +CHECK-NEXT: Purpose: Module pointer +CHECK-NEXT: } +CHECK-NEXT: ] +CHECK-NEXT: Entries [ +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x41081C +CHECK-NEXT: Initial: 0x4007C0 +CHECK-NEXT: Value: 0x0 +CHECK-NEXT: Type: Function (0x2) +CHECK-NEXT: Section: Undefined (0x0) +CHECK-NEXT: Name: puts@GLIBC_2.0 (71) +CHECK-NEXT: } +CHECK-NEXT: Entry { +CHECK-NEXT: Address: 0x410820 +CHECK-NEXT: Initial: 0x4007C0 +CHECK-NEXT: Value: 0x0 +CHECK-NEXT: Type: Function (0x2) +CHECK-NEXT: Section: Undefined (0x0) +CHECK-NEXT: Name: __libc_start_main@GLIBC_2.0 (53) +CHECK-NEXT: } +CHECK-NEXT: ] +CHECK-NEXT: } + +GNU: Primary GOT: +GNU-NEXT: Canonical gp value: 00418840 + +GNU: Reserved entries: +GNU-NEXT: Address Access Initial Purpose +GNU-NEXT: 00410850 -32752(gp) 00000000 Lazy resolver +GNU-NEXT: 00410854 -32748(gp) 80000000 Module pointer (GNU extension) + +GNU: Local entries: +GNU-NEXT: Address Access Initial +GNU-NEXT: 00410858 -32744(gp) 004003d4 +GNU-NEXT: 0041085c -32740(gp) 00410800 +GNU-NEXT: 00410860 -32736(gp) 00000000 + +GNU: Global entries: +GNU-NEXT: Address Access Initial Sym.Val. Type Ndx Name +GNU-NEXT: 00410864 -32732(gp) 00000000 00000000 FUNC UND __gmon_start__ +GNU-NEXT: PLT GOT: + +GNU: Reserved entries: +GNU-NEXT: Address Initial Purpose +GNU-NEXT: 00410814 00000000 PLT lazy resolver +GNU-NEXT: 00410818 00000000 Module pointer + +GNU: Entries: +GNU-NEXT: Address Initial Sym.Val. Type Ndx Name +GNU-NEXT: 0041081c 004007c0 00000000 FUNC UND puts +GNU-NEXT: 00410820 004007c0 00000000 FUNC UND __libc_start_main diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-reginfo.test b/llvm/test/tools/llvm-readobj/ELF/mips-reginfo.test new file mode 100644 index 00000000000..20177a99d8c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-reginfo.test @@ -0,0 +1,10 @@ +RUN: llvm-readobj -A %p/Inputs/reginfo.obj.elf-mipsel | FileCheck %s + +CHECK: MIPS RegInfo { +CHECK-NEXT: GP: 0x7FEF +CHECK-NEXT: General Mask: 0xB00001F6 +CHECK-NEXT: Co-Proc Mask0: 0x0 +CHECK-NEXT: Co-Proc Mask1: 0x0 +CHECK-NEXT: Co-Proc Mask2: 0x0 +CHECK-NEXT: Co-Proc Mask3: 0x0 +CHECK-NEXT: } diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-rld-map-rel.test b/llvm/test/tools/llvm-readobj/ELF/mips-rld-map-rel.test new file mode 100644 index 00000000000..05e541120a6 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-rld-map-rel.test @@ -0,0 +1,24 @@ +# Check DT_MIPS_RLD_MAP_REL .dynamic section tag reading + +RUN: llvm-readobj --dynamic-table %p/Inputs/mips-rld-map-rel.elf-mipsel | \ +RUN: FileCheck %s + +CHECK: DynamicSection [ (16 entries) +CHECK-NEXT: Tag Type Name/Value +CHECK-NEXT: 0x00000004 HASH 0x220 +CHECK-NEXT: 0x00000005 STRTAB 0x2FC +CHECK-NEXT: 0x00000006 SYMTAB 0x25C +CHECK-NEXT: 0x0000000A STRSZ 72 (bytes) +CHECK-NEXT: 0x0000000B SYMENT 16 (bytes) +CHECK-NEXT: 0x70000035 MIPS_RLD_MAP_REL 0x101E0 +CHECK-NEXT: 0x00000015 DEBUG 0x0 +CHECK-NEXT: 0x00000003 PLTGOT 0x10390 +CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1 +CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT +CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x0 +CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2 +CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 10 +CHECK-NEXT: 0x70000012 MIPS_UNREFEXTNO 15 +CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0xA +CHECK-NEXT: 0x00000000 NULL 0x0 +CHECK-NEXT: ] diff --git a/llvm/test/tools/llvm-readobj/ELF/mips-st-other.test b/llvm/test/tools/llvm-readobj/ELF/mips-st-other.test new file mode 100644 index 00000000000..c164004c141 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/mips-st-other.test @@ -0,0 +1,25 @@ +RUN: llvm-readobj --symbols %p/Inputs/st-other.obj.elf-mips \ +RUN: | FileCheck -check-prefix=MREG %s +RUN: llvm-readobj --symbols %p/Inputs/st-other.obj.elf-mips16 \ +RUN: | FileCheck -check-prefix=M16 %s + +MREG: Name: foo +MREG-NEXT: Value: 0x0 +MREG-NEXT: Size: 0 +MREG-NEXT: Binding: Global +MREG-NEXT: Type: None +MREG-NEXT: Other [ (0x29) +MREG-NEXT: STO_MIPS_PIC (0x20) +MREG-NEXT: STO_MIPS_PLT (0x8) +MREG-NEXT: STV_INTERNAL (0x1) +MREG-NEXT: ] + +M16: Name: foo +M16-NEXT: Value: 0x0 +M16-NEXT: Size: 0 +M16-NEXT: Binding: Global +M16-NEXT: Type: None +M16-NEXT: Other [ (0xF1) +M16-NEXT: STO_MIPS_MIPS16 (0xF0) +M16-NEXT: STV_INTERNAL (0x1) +M16-NEXT: ] diff --git a/llvm/test/tools/llvm-readobj/ELF/no-action.test b/llvm/test/tools/llvm-readobj/ELF/no-action.test new file mode 100644 index 00000000000..964db74bf30 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/no-action.test @@ -0,0 +1,50 @@ +## Show the behavior of llvm-readobj/llvm-readelf when no operations are requested. + +## Check the behavior on ET_EXEC input. + +# RUN: yaml2obj --docnum=1 %s -o %t.exe +# RUN: llvm-readobj %t.exe | FileCheck %s -DFILE=%t.exe --check-prefix LLVM +# RUN: llvm-readelf %t.exe | FileCheck %s -DFILE=%t.exe --check-prefix GNU --allow-empty + +# LLVM: File: [[FILE]] +# LLVM: Format: ELF64-x86-64 +# LLVM: Arch: x86_64 +# LLVM: AddressSize: 64bit +# LLVM: LoadName: <Not found>{{$}} +# LLVM-EMPTY: +# LLVM-NOT: {{.}} + +# GNU-NOT: {{.}} + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + +## Check the behavior on ET_REL input. + +# RUN: yaml2obj --docnum=2 %s -o %t.o +# RUN: llvm-readobj %t.o | FileCheck %s -DFILE=%t.o --check-prefix LLVM +# RUN: llvm-readelf %t.o | FileCheck %s -DFILE=%t.o --check-prefix GNU --allow-empty + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +## Check the behavior on ET_DYN input. + +# RUN: yaml2obj --docnum=3 %s -o %t.so +# RUN: llvm-readobj %t.so | FileCheck %s -DFILE=%t.so --check-prefix LLVM +# RUN: llvm-readelf %t.so | FileCheck %s -DFILE=%t.so --check-prefix GNU --allow-empty + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test b/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test new file mode 100644 index 00000000000..f01569596ac --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/no-phdrs.test @@ -0,0 +1,24 @@ +# Show that llvm-readobj can handle no program headers when --program-headers +# is requested, both for LLVM and GNU output. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj %t --program-headers | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf %t --program-headers | FileCheck %s --check-prefix=GNU + +# LLVM: ProgramHeaders [ +# LLVM-NEXT: ] + +# GNU: There are 0 program headers +# GNU: Program Headers: +# GNU-NEXT: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align +# GNU-EMPTY: +# GNU-NEXT: Section to Segment mapping: +# GNU-NEXT: Segment Sections... +# GNU-NEXT: None .strtab .shstrtab + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/no-relocs.test b/llvm/test/tools/llvm-readobj/ELF/no-relocs.test new file mode 100644 index 00000000000..c632e9751dd --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/no-relocs.test @@ -0,0 +1,46 @@ +# Show that llvm-readobj can handle no relocations when --relocations is +# requested, both for LLVM and GNU output, both for no relocation sections and +# for empty relocation sections. + +# RUN: yaml2obj %s -o %t.no_relocs +# RUN: llvm-readobj %t.no_relocs --relocations | FileCheck %s --check-prefix NO-RELOCS-LLVM +# RUN: llvm-readelf %t.no_relocs --relocations | FileCheck %s --check-prefix NO-RELOCS-GNU + +# RUN: llvm-objcopy -R .rela.text -R .rel.text %t.no_relocs %t.no_sec +# RUN: llvm-readobj %t.no_sec --relocations | FileCheck %s --check-prefix NO-SEC-LLVM +# RUN: llvm-readelf %t.no_sec --relocations | FileCheck %s --check-prefix NO-SEC-GNU + +# NO-RELOCS-LLVM: Relocations [ +# NO-RELOCS-LLVM-NEXT: Section (2) .rela.text { +# NO-RELOCS-LLVM-NEXT: } +# NO-RELOCS-LLVM-NEXT: Section (3) .rel.text { +# NO-RELOCS-LLVM-NEXT: } +# NO-RELOCS-LLVM-NEXT: ] + +# NO-RELOCS-GNU: Relocation section '.rela.text' at offset {{.*}} contains 0 entries: +# NO-RELOCS-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# NO-RELOCS-GNU-EMPTY: +# NO-RELOCS-GNU-NEXT: Relocation section '.rel.text' at offset {{.*}} contains 0 entries: +# NO-RELOCS-GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name +# NO-RELOCS-GNU-EMPTY: + +# NO-SEC-LLVM: Relocations [ +# NO-SEC-LLVM-NEXT: ] + +# NO-SEC-GNU: There are no relocations in this file. + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + - Name: .rela.text + Type: SHT_RELA + Info: .text + - Name: .rel.text + Type: SHT_REL + Info: .text diff --git a/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test b/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test new file mode 100644 index 00000000000..4e21ae70e4d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/no-shdrs.test @@ -0,0 +1,33 @@ +# Show that llvm-readobj can handle ELF files where the section header table has +# been stripped, both for GNU and LLVM style output. + +# RUN: yaml2obj %s -o %t.raw +# RUN: llvm-objcopy --strip-sections %t.raw %t.o +# RUN: llvm-readobj --file-headers --section-headers --symbols %t.o | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --file-headers --section-headers --symbols %t.o | FileCheck %s --check-prefix=GNU --allow-empty + +# LLVM: SectionHeaderCount: 0 +# LLVM: StringTableSectionIndex: 0 +# LLVM: Sections [ +# LLVM-NEXT: ] +# LLVM-NEXT: Symbols [ +# LLVM-NEXT: ] + +# GNU: Number of section headers: 0 +# GNU: Section header string table index: 0 +# GNU: There are 0 section headers +# GNU-NOT: Symbol table '{{.*}}' contains {{.*}} entries + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: foobar + Section: .text + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-readobj/ELF/non-dynamic-in-pt-dynamic.test b/llvm/test/tools/llvm-readobj/ELF/non-dynamic-in-pt-dynamic.test new file mode 100644 index 00000000000..77dea95903e --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/non-dynamic-in-pt-dynamic.test @@ -0,0 +1,172 @@ +## Show that llvm-readobj/llvm-readelf tools can dump the .dynamic section which +## is not alone in PT_DYNAMIC segment. + +## In the first case .text is placed before .dynamic. +## We check that we warn about this case. + +# RUN: yaml2obj --docnum=1 %s -o %t1.o +# RUN: llvm-readobj --dynamic-table %t1.o 2>&1 \ +# RUN: | FileCheck %s --DFILE=%t1.o --check-prefixes=WARNING,LLVM +# RUN: llvm-readelf --dynamic-table %t1.o 2>&1 \ +# RUN: | FileCheck %s --DFILE=%t1.o --check-prefixes=WARNING,GNU + +# WARNING: warning: '[[FILE]]': The SHT_DYNAMIC section '.dynamic' is not at the start of PT_DYNAMIC segment +# WARNING: warning: '[[FILE]]': invalid section size (33) or entity size (16) +# WARNING: warning: '[[FILE]]': SHT_DYNAMIC section header and PT_DYNAMIC program header disagree about the location of the dynamic table +# WARNING: warning: '[[FILE]]': PT_DYNAMIC dynamic table is invalid: SHT_DYNAMIC will be used + +# LLVM: DynamicSection [ (2 entries) +# LLVM-NEXT: Tag Type Name/Value +# LLVM-NEXT: 0x0000000000000018 BIND_NOW 0x1 +# LLVM-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM-NEXT: ] + +# GNU: Dynamic section at offset 0x{{.*}} contains 2 entries: +# GNU-NEXT: Tag Type Name/Value +# GNU-NEXT: 0x0000000000000018 (BIND_NOW) 0x1 +# GNU-NEXT: 0x0000000000000000 (NULL) 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Address: 0x1000 + AddressAlign: 0x100 + Content: "00" + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [SHF_ALLOC] + Address: 0x1001 + Entries: + - Tag: DT_BIND_NOW + Value: 0x1 + - Tag: DT_NULL + Value: 0x0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .text + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .text + - Section: .dynamic + +## In this case .text goes after .dynamic and we don't display any warnings, +## though the content of the .text is used for dumping the dynamic table. + +# RUN: yaml2obj --docnum=2 %s -o %t2.o +# RUN: llvm-readobj --dynamic-table %t2.o 2>&1 | FileCheck %s --check-prefix=LLVM2 +# RUN: llvm-readelf --dynamic-table %t2.o 2>&1 | FileCheck %s --check-prefix=GNU2 + +# LLVM2: DynamicSection [ (3 entries) +# LLVM2-NEXT: Tag Type Name/Value +# LLVM2-NEXT: 0x0000000000000018 BIND_NOW 0x1 +# LLVM2-NEXT: 0x0000000000000018 BIND_NOW 0x2 +# LLVM2-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM2-NEXT: ] + +# GNU2: Dynamic section at offset 0x{{.*}} contains 3 entries: +# GNU2-NEXT: Tag Type Name/Value +# GNU2-NEXT: 0x0000000000000018 (BIND_NOW) 0x1 +# GNU2-NEXT: 0x0000000000000018 (BIND_NOW) 0x2 +# GNU2-NEXT: 0x0000000000000000 (NULL) 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [SHF_ALLOC] + Address: 0x1000 + AddressAlign: 0x1000 + Entries: + - Tag: DT_BIND_NOW + Value: 0x1 + - Tag: DT_BIND_NOW + Value: 0x2 + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Address: 0x1100 + AddressAlign: 0x100 + Content: "00000000000000000000000000000000" +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Section: .text + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Section: .text + +## In this case .text goes after .dynamic, but (PT_DYNAMIC segment size % dynamic entry size != 0) +## and we have to use the information from the section header instead. + +# RUN: yaml2obj --docnum=3 %s -o %t3.o +# RUN: llvm-readobj --dynamic-table %t3.o 2>&1 | FileCheck %s --DFILE=%t3.o --check-prefixes=WARNING2,LLVM3 +# RUN: llvm-readelf --dynamic-table %t3.o 2>&1 | FileCheck %s --DFILE=%t3.o --check-prefixes=WARNING2,GNU3 + +# WARNING2: warning: '[[FILE]]': invalid section size (257) or entity size (16) +# WARNING2: warning: '[[FILE]]': PT_DYNAMIC dynamic table is invalid: SHT_DYNAMIC will be used + +# LLVM3: DynamicSection [ (2 entries) +# LLVM3-NEXT: Tag Type Name/Value +# LLVM3-NEXT: 0x0000000000000018 BIND_NOW 0x1 +# LLVM3-NEXT: 0x0000000000000000 NULL 0x0 +# LLVM3-NEXT: ] + +# GNU3: Dynamic section at offset 0x{{.*}} contains 2 entries: +# GNU3-NEXT: Tag Type Name/Value +# GNU3-NEXT: 0x0000000000000018 (BIND_NOW) 0x1 +# GNU3-NEXT: 0x0000000000000000 (NULL) 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [SHF_ALLOC] + Address: 0x1000 + AddressAlign: 0x1000 + Entries: + - Tag: DT_BIND_NOW + Value: 0x1 + - Tag: DT_NULL + Value: 0x0 + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Address: 0x1100 + AddressAlign: 0x100 + Content: "00" +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Section: .text + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .dynamic + - Section: .text diff --git a/llvm/test/tools/llvm-readobj/ELF/note-amd.s b/llvm/test/tools/llvm-readobj/ELF/note-amd.s new file mode 100644 index 00000000000..df82b16b782 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-amd.s @@ -0,0 +1,104 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o + +// RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM +// RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU + +// GNU: Displaying notes found +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata) +// GNU-NEXT: HSA Metadata: +// GNU-NEXT: {{^ +$}} +// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_ISA (ISA Version) +// GNU-NEXT: ISA Version: +// GNU-NEXT: {{^ +$}} +// GNU-NEXT: Displaying notes found +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: AMD 0x0000000a NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata) +// GNU-NEXT: HSA Metadata: +// GNU-NEXT: meta_blah +// GNU-NEXT: AMD 0x00000009 NT_AMD_AMDGPU_ISA (ISA Version) +// GNU-NEXT: ISA Version: +// GNU-NEXT: isa_blah +// GNU-NEXT: Displaying notes found +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_PAL_METADATA (PAL Metadata) + +// LLVM: Notes [ +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: +// LLVM-NEXT: Size: +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: AMD +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata) +// LLVM-NEXT: HSA Metadata: +// LLVM-NEXT: } +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: AMD +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: NT_AMD_AMDGPU_ISA (ISA Version) +// LLVM-NEXT: ISA Version: +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: +// LLVM-NEXT: Size: +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: AMD +// LLVM-NEXT: Data size: 0xA +// LLVM-NEXT: Type: NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata) +// LLVM-NEXT: HSA Metadata: meta_blah +// LLVM-NEXT: } +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: AMD +// LLVM-NEXT: Data size: 0x9 +// LLVM-NEXT: Type: NT_AMD_AMDGPU_ISA (ISA Version) +// LLVM-NEXT: ISA Version: isa_blah +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: +// LLVM-NEXT: Size: +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: AMD +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: NT_AMD_AMDGPU_PAL_METADATA (PAL Metadata) +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: ] + +.section ".note.no.desc", "a" + .align 4 + .long 4 /* namesz */ + .long 0 /* descsz */ + .long 10 /* type = NT_AMD_AMDGPU_HSA_METADATA */ + .asciz "AMD" + .long 4 /* namesz */ + .long 0 /* descsz */ + .long 11 /* type = NT_AMD_AMDGPU_ISA */ + .asciz "AMD" +.section ".note.desc", "a" + .align 4 + .long 4 /* namesz */ + .long end.meta - begin.meta /* descsz */ + .long 10 /* type = NT_AMD_AMDGPU_HSA_METADATA */ + .asciz "AMD" +begin.meta: + .asciz "meta_blah" +end.meta: + .align 4 + .long 4 /* namesz */ + .long end.isa - begin.isa /* descsz */ + .long 11 /* type = NT_AMD_AMDGPU_ISA */ + .asciz "AMD" +begin.isa: + .asciz "isa_blah" +end.isa: + .align 4 +.section ".note.other", "a" + .align 4 + .long 4 /* namesz */ + .long 0 /* descsz */ + .long 12 /* type = NT_AMD_AMDGPU_PAL_METADATA */ + .asciz "AMD" diff --git a/llvm/test/tools/llvm-readobj/ELF/note-amdgpu.test b/llvm/test/tools/llvm-readobj/ELF/note-amdgpu.test new file mode 100644 index 00000000000..51440dd4a5b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-amdgpu.test @@ -0,0 +1,85 @@ +# RUN: yaml2obj %s > %t.o +# RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU + +# GNU: Displaying notes found +# GNU-NEXT: Owner Data size Description +# GNU-NEXT: AMDGPU 0x000000e6 NT_AMDGPU_METADATA (AMDGPU Metadata) +# GNU-NEXT: AMDGPU Metadata: +# GNU-NEXT: --- +# GNU-NEXT: amdhsa.kernels: +# GNU-NEXT: - .group_segment_fixed_size: 2 +# GNU-NEXT: .kernarg_segment_align: 4 +# GNU-NEXT: .kernarg_segment_size: 1 +# GNU-NEXT: .max_flat_workgroup_size: 8 +# GNU-NEXT: .name: foo +# GNU-NEXT: .private_segment_fixed_size: 3 +# GNU-NEXT: .sgpr_count: 6 +# GNU-NEXT: .symbol: foo +# GNU-NEXT: .vgpr_count: 7 +# GNU-NEXT: .wavefront_size: 5 +# GNU-NEXT: amdhsa.version: +# GNU-NEXT: - 1 +# GNU-NEXT: - 0 +# GNU-NEXT: ... + +# LLVM: Notes [ +# LLVM-NEXT: NoteSection { +# LLVM-NEXT: Offset: +# LLVM-NEXT: Size: +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: AMDGPU +# LLVM-NEXT: Data size: 0xE6 +# LLVM-NEXT: Type: NT_AMDGPU_METADATA (AMDGPU Metadata) +# LLVM-NEXT: AMDGPU Metadata: --- +# LLVM-NEXT: amdhsa.kernels: +# LLVM-NEXT: - .group_segment_fixed_size: 2 +# LLVM-NEXT: .kernarg_segment_align: 4 +# LLVM-NEXT: .kernarg_segment_size: 1 +# LLVM-NEXT: .max_flat_workgroup_size: 8 +# LLVM-NEXT: .name: foo +# LLVM-NEXT: .private_segment_fixed_size: 3 +# LLVM-NEXT: .sgpr_count: 6 +# LLVM-NEXT: .symbol: foo +# LLVM-NEXT: .vgpr_count: 7 +# LLVM-NEXT: .wavefront_size: 5 +# LLVM-NEXT: amdhsa.version: +# LLVM-NEXT: - 1 +# LLVM-NEXT: - 0 +# LLVM-NEXT: ... +# LLVM-EMPTY: +# LLVM-NEXT: } +# LLVM-NEXT: } +# LLVM-NEXT: ] + +## Use yaml2obj instead of llvm-mc for more test portability. This was +## generated by grabbing section data from an object built via: +# $ llvm-mc -filetype=obj -triple amdgcn-amd-amdhsa -mattr=+code-object-v3 %s -o %t.o +## On input: +# .amdgpu_metadata +# amdhsa.version: +# - 1 +# - 0 +# amdhsa.kernels: +# - .name: foo +# .symbol: foo +# .kernarg_segment_size: 1 +# .group_segment_fixed_size: 2 +# .private_segment_fixed_size: 3 +# .kernarg_segment_align: 4 +# .wavefront_size: 5 +# .sgpr_count: 6 +# .vgpr_count: 7 +# .max_flat_workgroup_size: 8 +# .end_amdgpu_metadata + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .note.foo + Type: SHT_NOTE + Content: 07000000E600000020000000414D44475055000082AE616D646873612E6B65726E656C73918AB92E67726F75705F7365676D656E745F66697865645F73697A6502B62E6B65726E6172675F7365676D656E745F616C69676E04B52E6B65726E6172675F7365676D656E745F73697A6501B82E6D61785F666C61745F776F726B67726F75705F73697A6508A52E6E616D65A3666F6FBB2E707269766174655F7365676D656E745F66697865645F73697A6503AB2E736770725F636F756E7406A72E73796D626F6CA3666F6FAB2E766770725F636F756E7407AF2E7761766566726F6E745F73697A6505AE616D646873612E76657273696F6E9201000000 diff --git a/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile-bad.test b/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile-bad.test new file mode 100644 index 00000000000..24ee3453786 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile-bad.test @@ -0,0 +1,146 @@ +## Test that malformed NT_FILE sections in core files are gracefully ignored. + +## llvm-mc doesn't support generating ET_CORE files; the 'Content' field in +## each of the following test cases were generated with the following steps: +# $ llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu tmp.s -o tmp.o +# $ bin/llvm-objcopy --dump-section=.note.foo=tmp.txt tmp.o /dev/null +# $ xxd -p tmp.txt | tr -d '\n'; echo +# using the assembly shown with each test case. + +# RUN: yaml2obj --docnum=1 %s -o %t1.o +# RUN: llvm-readelf -n %t1.o 2>&1 | FileCheck -DFILE=%t1.o %s --check-prefix=ERR-HEADER-SHORT +# ERR-HEADER-SHORT: warning: '[[FILE]]': malformed note: header too short + +# .section ".note.foo", "a" +# .align 4 +# .long 5 /* namesz */ +# .long end - begin /* descsz */ +# .long 0x46494c45 /* type = NT_FILE */ +# .asciz "CORE" +# .align 4 +# begin: +# .quad 0 /* no file mappings */ +# end: + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 +Sections: + - Name: .note.foo + Type: SHT_NOTE + Content: 0500000008000000454C4946434F5245000000000000000000000000 +ProgramHeaders: + - Type: PT_NOTE + Sections: + - Section: .note.foo + +# RUN: yaml2obj --docnum=2 %s -o %t2.o +# RUN: llvm-readelf -n %t2.o 2>&1 | FileCheck -DFILE=%t2.o %s --check-prefix=ERR-NULL-TERM +# ERR-NULL-TERM: warning: '[[FILE]]': malformed note: not NUL terminated + +# .section ".note.foo", "a" +# .align 4 +# .long 5 /* namesz */ +# .long end - begin /* descsz */ +# .long 0x46494c45 /* type = NT_FILE */ +# .asciz "CORE" +# .align 4 +# begin: +# .quad 1 /* 1 file mapping */ +# .quad 4096 /* page size */ +# .quad 0x1000 /* start #1 */ +# .quad 0x2000 /* end #1 */ +# .quad 0x3000 /* offset #1 */ +# .ascii "xxxx" +# end: + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 +Sections: + - Name: .note.foo + Type: SHT_NOTE + Content: 050000002C000000454C4946434F5245000000000100000000000000001000000000000000100000000000000020000000000000003000000000000078787878 +ProgramHeaders: + - Type: PT_NOTE + Sections: + - Section: .note.foo + +# RUN: yaml2obj --docnum=3 %s -o %t3.o +# RUN: llvm-readelf -n %t3.o 2>&1 | FileCheck -DFILE=%t3.o %s --check-prefix=ERR-FILE-COUNT +# ERR-FILE-COUNT: warning: '[[FILE]]': malformed note: too short for number of files + +# .section ".note.foo", "a" +# .align 4 +# .long 5 /* namesz */ +# .long end - begin /* descsz */ +# .long 0x46494c45 /* type = NT_FILE */ +# .asciz "CORE" +# .align 4 +# begin: +# .quad 2 /* 2 file mappings */ +# .quad 4096 /* page size */ +# .quad 0x1000 /* start #1 */ +# .quad 0x2000 /* end #1 */ +# .quad 0x3000 /* offset #1 */ +# .asciz "xyz" +# end: + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 +Sections: + - Name: .note.foo + Type: SHT_NOTE + Content: 050000002C000000454C4946434F5245000000000200000000000000001000000000000000100000000000000020000000000000003000000000000078797A00 +ProgramHeaders: + - Type: PT_NOTE + Sections: + - Section: .note.foo + +# RUN: yaml2obj --docnum=4 %s -o %t4.o +# RUN: llvm-readelf -n %t4.o 2>&1 | FileCheck -DFILE=%t4.o %s --check-prefix=ERR-FILE-END-EARLY +# ERR-FILE-END-EARLY: warning: '[[FILE]]': malformed note: too few filenames + +# .section ".note.foo", "a" +# .align 4 +# .long 5 /* namesz */ +# .long end - begin /* descsz */ +# .long 0x46494c45 /* type = NT_FILE */ +# .asciz "CORE" +# .align 4 +# begin: +# .quad 2 /* 2 file mappings */ +# .quad 4096 /* page size */ +# .quad 0x1000 /* start #1 */ +# .quad 0x2000 /* end #1 */ +# .quad 0x3000 /* offset #1 */ +# .quad 0x4000 /* start #2 */ +# .quad 0x5000 /* end #2 */ +# .quad 0x6000 /* offset #2 */ +# .asciz "xyz" +# end: + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 +Sections: + - Name: .note.foo + Type: SHT_NOTE + Content: 0500000044000000454C4946434F5245000000000200000000000000001000000000000000100000000000000020000000000000003000000000000000400000000000000050000000000000006000000000000078797A00 +ProgramHeaders: + - Type: PT_NOTE + Sections: + - Section: .note.foo diff --git a/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile.test b/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile.test new file mode 100644 index 00000000000..b5dc684dc42 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-core-ntfile.test @@ -0,0 +1,95 @@ +## Test that NT_FILE sections in core files are interpreted correctly. + +# RUN: yaml2obj %s > %t.o +# RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU +# RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM + +## llvm-mc doesn't support generating ET_CORE files; the 'Content' field was +## generated with the following steps: +# $ llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu tmp.s -o tmp.o +# $ bin/llvm-objcopy --dump-section=.note.foo=tmp.txt tmp.o /dev/null +# $ xxd -p tmp.txt | tr -d '\n'; echo +## Using the following input: +# .section ".note.foo", "a" +# .align 4 +# .long 5 /* namesz */ +# .long end - begin /* descsz */ +# .long 0x46494c45 /* type = NT_FILE */ +# .asciz "CORE" +# .align 4 +# begin: +# .quad 3 /* 3 file mappings */ +# .quad 4096 /* page size */ +# .quad 0x1000 /* start #1 */ +# .quad 0x2000 /* end #1 */ +# .quad 0x3000 /* offset #1 */ +# .quad 0x4000 /* start #2 */ +# .quad 0x5000 /* end #2 */ +# .quad 0x6000 /* offset #2 */ +# .quad 0x7000 /* start #3 */ +# .quad 0x8000 /* end #3 */ +# .quad 0x9000 /* offset #3 */ +# .asciz "/path/to/a.out" +# .asciz "/path/to/libc.so" +# .asciz "[stack]" +# .align 4 +# end: + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 +Sections: + - Name: .note.foo + Type: SHT_NOTE + Content: 0500000080000000454C4946434F524500000000030000000000000000100000000000000010000000000000002000000000000000300000000000000040000000000000005000000000000000600000000000000070000000000000008000000000000000900000000000002F706174682F746F2F612E6F7574002F706174682F746F2F6C6962632E736F005B737461636B5D00 +ProgramHeaders: + - Type: PT_NOTE + Sections: + - Section: .note.foo + +# GNU: Displaying notes found +# GNU-NEXT: Owner Data size Description +# GNU-NEXT: CORE 0x00000080 NT_FILE (mapped files) +# GNU-NEXT: Page size: 4096 +# GNU-NEXT: Start End Page Offset +# GNU-NEXT: 0x0000000000001000 0x0000000000002000 0x0000000000003000 +# GNU-NEXT: /path/to/a.out +# GNU-NEXT: 0x0000000000004000 0x0000000000005000 0x0000000000006000 +# GNU-NEXT: /path/to/libc.so +# GNU-NEXT: 0x0000000000007000 0x0000000000008000 0x0000000000009000 +# GNU-NEXT: [stack] +# GNU-NOT: {{.}} + +# LLVM: Notes [ +# LLVM-NEXT: NoteSection { +# LLVM-NEXT: Offset: +# LLVM-NEXT: Size: +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: CORE +# LLVM-NEXT: Data size: 0x80 +# LLVM-NEXT: Type: NT_FILE (mapped files) +# LLVM-NEXT: Page Size: 4096 +# LLVM-NEXT: Mapping [ +# LLVM-NEXT: Start: 0x1000 +# LLVM-NEXT: End: 0x2000 +# LLVM-NEXT: Offset: 0x3000 +# LLVM-NEXT: Filename: /path/to/a.out +# LLVM-NEXT: ] +# LLVM-NEXT: Mapping [ +# LLVM-NEXT: Start: 0x4000 +# LLVM-NEXT: End: 0x5000 +# LLVM-NEXT: Offset: 0x6000 +# LLVM-NEXT: Filename: /path/to/libc.so +# LLVM-NEXT: ] +# LLVM-NEXT: Mapping [ +# LLVM-NEXT: Start: 0x7000 +# LLVM-NEXT: End: 0x8000 +# LLVM-NEXT: Offset: 0x9000 +# LLVM-NEXT: Filename: [stack] +# LLVM-NEXT: ] +# LLVM-NEXT: } +# LLVM-NEXT: } +# LLVM-NEXT: ] diff --git a/llvm/test/tools/llvm-readobj/ELF/note-core.test b/llvm/test/tools/llvm-readobj/ELF/note-core.test new file mode 100644 index 00000000000..314be84d7d7 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-core.test @@ -0,0 +1,61 @@ +## Test that note values are interpreted correctly for core files. + +# RUN: yaml2obj %s > %t.o +# RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU +# RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 +Sections: + - Name: .note.foo + Type: SHT_NOTE + # Note: format is 0500000000000000<NT_FOO value>434F524500000000 repeated + Content: 050000000000000001000000434F524500000000050000000000000002000000434F524500000000050000000000000003000000434F524500000000050000000000000004000000434F524500000000050000000000000006000000434F524500000000 +ProgramHeaders: + - Type: PT_NOTE + Sections: + - Section: .note.foo + +# GNU: Displaying notes found +# GNU-NEXT: Owner Data size Description +# GNU-NEXT: CORE 0x00000000 NT_PRSTATUS (prstatus structure) +# GNU-NEXT: CORE 0x00000000 NT_FPREGSET (floating point registers) +# GNU-NEXT: CORE 0x00000000 NT_PRPSINFO (prpsinfo structure) +# GNU-NEXT: CORE 0x00000000 NT_TASKSTRUCT (task structure) +# GNU-NEXT: CORE 0x00000000 NT_AUXV (auxiliary vector) + +# LLVM: Notes [ +# LLVM-NEXT: NoteSection { +# LLVM-NEXT: Offset: +# LLVM-NEXT: Size: +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: CORE +# LLVM-NEXT: Data size: 0x0 +# LLVM-NEXT: Type: NT_PRSTATUS (prstatus structure) +# LLVM-NEXT: } +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: CORE +# LLVM-NEXT: Data size: 0x0 +# LLVM-NEXT: Type: NT_FPREGSET (floating point registers) +# LLVM-NEXT: } +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: CORE +# LLVM-NEXT: Data size: 0x0 +# LLVM-NEXT: Type: NT_PRPSINFO (prpsinfo structure) +# LLVM-NEXT: } +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: CORE +# LLVM-NEXT: Data size: 0x0 +# LLVM-NEXT: Type: NT_TASKSTRUCT (task structure) +# LLVM-NEXT: } +# LLVM-NEXT: Note { +# LLVM-NEXT: Owner: CORE +# LLVM-NEXT: Data size: 0x0 +# LLVM-NEXT: Type: NT_AUXV (auxiliary vector) +# LLVM-NEXT: } +# LLVM-NEXT: } +# LLVM-NEXT: ] diff --git a/llvm/test/tools/llvm-readobj/ELF/note-freebsd.s b/llvm/test/tools/llvm-readobj/ELF/note-freebsd.s new file mode 100644 index 00000000000..fbb7ac147d9 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-freebsd.s @@ -0,0 +1,83 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o + +// RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM +// RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU + +// GNU: Displaying notes found +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: FreeBSD 0x00000000 NT_THRMISC (thrmisc structure) +// GNU-NEXT: FreeBSD 0x00000000 NT_PROCSTAT_PROC (proc data) +// GNU-NEXT: Displaying notes found +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: FreeBSD 0x00000000 NT_PROCSTAT_FILES (files data) +// GNU-NEXT: Displaying notes found +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: FreeBSD 0x0000001c Unknown note type (0x00000003) +// GNU-NEXT: description data: 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 00 00 + +// LLVM: Notes [ +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: +// LLVM-NEXT: Size: +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: FreeBSD +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: NT_THRMISC (thrmisc structure) +// LLVM-NEXT: } +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: FreeBSD +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: NT_PROCSTAT_PROC (proc data) +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x68 +// LLVM-NEXT: Size: 0x14 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: FreeBSD +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: NT_PROCSTAT_FILES (files data) +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x7C +// LLVM-NEXT: Size: 0x30 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: FreeBSD +// LLVM-NEXT: Data size: 0x1C +// LLVM-NEXT: Type: Unknown note type (0x00000003) +// LLVM-NEXT: Description data ( +// LLVM-NEXT: 0000: 4C6F7265 6D206970 73756D20 646F6C6F |Lorem ipsum dolo| +// LLVM-NEXT: 0010: 72207369 7420616D 65740000 |r sit amet..| +// LLVM-NEXT: ) +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: ] + +.section ".note.foo", "a" + .align 4 + .long 8 /* namesz */ + .long 0 /* descsz */ + .long 7 /* type = NT_FREEBSD_THRMISC */ + .asciz "FreeBSD" + .long 8 /* namesz */ + .long 0 /* descsz */ + .long 8 /* type = NT_FREEBSD_PROC */ + .asciz "FreeBSD" +.section ".note.bar", "a" + .align 4 + .long 8 /* namesz */ + .long 0 /* descsz */ + .long 9 /* type = NT_FREEBSD_FILES */ + .asciz "FreeBSD" +.section ".note.baz", "a" + .align 4 + .long 8 /* namesz */ + .long end - begin /* descsz */ + .long 3 /* type */ + .asciz "FreeBSD" +begin: + .asciz "Lorem ipsum dolor sit amet" + .align 4 +end: diff --git a/llvm/test/tools/llvm-readobj/ELF/note-generic.s b/llvm/test/tools/llvm-readobj/ELF/note-generic.s new file mode 100644 index 00000000000..7b3b85fc56b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-generic.s @@ -0,0 +1,85 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o + +// RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM +// RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU + +// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000010: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: XYZ 0x00000000 NT_VERSION (version) + +// GNU: Displaying notes found at file offset 0x00000050 with length 0x00000010: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: XYZ 0x00000000 NT_ARCH (architecture) + +// GNU: Displaying notes found at file offset 0x00000060 with length 0x00000010: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: XYZ 0x00000000 OPEN + +// GNU: Displaying notes found at file offset 0x00000070 with length 0x00000010: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: XYZ 0x00000000 func + +// LLVM: Notes [ +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x40 +// LLVM-NEXT: Size: 0x10 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: XYZ +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: NT_VERSION (version) +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x50 +// LLVM-NEXT: Size: 0x10 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: XYZ +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: NT_ARCH (architecture) +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x60 +// LLVM-NEXT: Size: 0x10 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: XYZ +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: OPEN +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x70 +// LLVM-NEXT: Size: 0x10 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: XYZ +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: func +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: ] + +.section ".note.version", "a" + .align 4 + .long 4 /* namesz */ + .long 0 /* descsz */ + .long 1 /* type = NT_VERSION */ + .asciz "XYZ" +.section ".note.arch", "a" + .align 4 + .long 4 /* namesz */ + .long 0 /* descsz */ + .long 2 /* type = NT_ARCH*/ + .asciz "XYZ" +.section ".note.open", "a" + .align 4 + .long 4 /* namesz */ + .long 0 /* descsz */ + .long 0x100 /* type = NT_GNU_BUILD_ATTRIBUTE_OPEN*/ + .asciz "XYZ" +.section ".note.func", "a" + .align 4 + .long 4 /* namesz */ + .long 0 /* descsz */ + .long 0x101 /* type = NT_GNU_BUILD_ATTRIBUTE_FUNC*/ + .asciz "XYZ" diff --git a/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s new file mode 100644 index 00000000000..931dce6ba8f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s @@ -0,0 +1,157 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t +// RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU +// RUN: llvm-readobj --elf-output-style LLVM --notes %t | FileCheck %s --check-prefix=LLVM + +// GNU: Displaying notes found at file offset 0x00000040 with length 0x000000f8: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: GNU 0x000000e8 NT_GNU_PROPERTY_TYPE_0 (property note) +// GNU-NEXT: Properties: stack size: 0x100 +// GNU-NEXT: stack size: 0x100 +// GNU-NEXT: no copy on protected +// GNU-NEXT: x86 feature: SHSTK +// GNU-NEXT: x86 feature: IBT, SHSTK +// GNU-NEXT: x86 feature: <None> +// GNU-NEXT: x86 ISA needed: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD +// GNU-NEXT: x86 ISA used: AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, AVX512_4FMAPS, AVX512_4VNNIW, AVX512_BITALG, AVX512_IFMA, AVX512_VBMI, AVX512_VBMI2, AVX512_VNNI +// GNU-NEXT: x86 feature needed: x86, x87, MMX, XMM, YMM +// GNU-NEXT: x86 feature used: ZMM, FXSR, XSAVE, XSAVEOPT, XSAVEC +// GNU-NEXT: <application-specific type 0xfefefefe> +// GNU-NEXT: stack size: <corrupt length: 0x0> +// GNU-NEXT: stack size: <corrupt length: 0x4> +// GNU-NEXT: no copy on protected <corrupt length: 0x1> +// GNU-NEXT: x86 feature: <corrupt length: 0x0> +// GNU-NEXT: x86 feature: IBT, <unknown flags: 0xf000f000> +// GNU-NEXT: <corrupt type (0x2) datasz: 0x1> + +// LLVM: Notes [ +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x40 +// LLVM-NEXT: Size: 0xF8 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: GNU +// LLVM-NEXT: Data size: 0xE8 +// LLVM-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note) +// LLVM-NEXT: Property [ +// LLVM-NEXT: stack size: 0x100 +// LLVM-NEXT: stack size: 0x100 +// LLVM-NEXT: no copy on protected +// LLVM-NEXT: x86 feature: SHSTK +// LLVM-NEXT: x86 feature: IBT, SHSTK +// LLVM-NEXT: x86 feature: <None> +// LLVM-NEXT: x86 ISA needed: CMOV, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, AVX, AVX2, FMA, AVX512F, AVX512CD +// LLVM-NEXT: x86 ISA used: AVX512ER, AVX512PF, AVX512VL, AVX512DQ, AVX512BW, AVX512_4FMAPS, AVX512_4VNNIW, AVX512_BITALG, AVX512_IFMA, AVX512_VBMI, AVX512_VBMI2, AVX512_VNNI +// LLVM-NEXT: x86 feature needed: x86, x87, MMX, XMM, YMM +// LLVM-NEXT: x86 feature used: ZMM, FXSR, XSAVE, XSAVEOPT, XSAVEC +// LLVM-NEXT: <application-specific type 0xfefefefe> +// LLVM-NEXT: stack size: <corrupt length: 0x0> +// LLVM-NEXT: stack size: <corrupt length: 0x4> +// LLVM-NEXT: no copy on protected <corrupt length: 0x1> +// LLVM-NEXT: x86 feature: <corrupt length: 0x0> +// LLVM-NEXT: x86 feature: IBT, <unknown flags: 0xf000f000> +// LLVM-NEXT: <corrupt type (0x2) datasz: 0x1> +// LLVM-NEXT: ] +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: ] + +.section ".note.gnu.property", "a" +.align 4 + .long 4 /* Name length is always 4 ("GNU") */ + .long end - begin /* Data length */ + .long 5 /* Type: NT_GNU_PROPERTY_TYPE_0 */ + .asciz "GNU" /* Name */ + .p2align 3 +begin: + .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */ + .long 8 /* Data size */ + .quad 0x100 /* Data (stack size) */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* Test we handle alignment properly */ + .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */ + .long 8 /* Data size */ + .long 0x100 /* Data (stack size) */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + .long 2 /* Type: GNU_PROPERTY_NO_COPY_ON_PROTECTED */ + .long 0 /* Data size */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* CET property note */ + .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */ + .long 4 /* Data size */ + .long 2 /* GNU_PROPERTY_X86_FEATURE_1_SHSTK */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* CET property note with padding */ + .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */ + .long 4 /* Data size */ + .long 3 /* Full CET support */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */ + .long 4 /* Data size */ + .long 0 /* Empty flags, not an error */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + .long 0xc0008000 /* Type: GNU_PROPERTY_X86_ISA_1_NEEDED */ + .long 4 /* Data size */ + .long 0x00000fff /* CMOV, ... */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + .long 0xc0010000 /* Type: GNU_PROPERTY_X86_ISA_1_USED */ + .long 4 /* Data size */ + .long 0x00fff000 /* AVX512_ER, ... */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + .long 0xc0008001 /* Type: GNU_PROPERTY_X86_FEATURE_2_NEEDED */ + .long 4 /* Data size */ + .long 0x0000001f /* X86, ... */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + .long 0xc0010001 /* Type: GNU_PROPERTY_X86_FEATURE_2_USED */ + .long 4 /* Data size */ + .long 0x000003e0 /* ZMM, ... */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* All notes below are broken. Test we are able to report them. */ + + /* Broken note type */ + .long 0xfefefefe /* Invalid type for testing */ + .long 0 /* Data size */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* GNU_PROPERTY_STACK_SIZE with zero stack size */ + .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */ + .long 0 /* Data size */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* GNU_PROPERTY_STACK_SIZE with data size 4 (should be 8) */ + .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */ + .long 4 /* Data size */ + .long 0x100 /* Data (stack size) */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* GNU_PROPERTY_NO_COPY_ON_PROTECTED with pr_datasz and some data */ + .long 2 /* Type: GNU_PROPERTY_NO_COPY_ON_PROTECTED */ + .long 1 /* Data size (corrupted) */ + .byte 1 /* Data */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* CET note with size zero */ + .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */ + .long 0 /* Data size */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* CET note with bad flags */ + .long 0xc0000002 /* Type: GNU_PROPERTY_X86_FEATURE_1_AND */ + .long 4 /* Data size */ + .long 0xf000f001 /* GNU_PROPERTY_X86_FEATURE_1_IBT and bad bits */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + /* GNU_PROPERTY_NO_COPY_ON_PROTECTED with pr_datasz and without data */ + .long 2 /* Type: GNU_PROPERTY_NO_COPY_ON_PROTECTED */ + .long 1 /* Data size (corrupted) */ + .p2align 3 /* Align to 8 byte for 64 bit */ +end: diff --git a/llvm/test/tools/llvm-readobj/ELF/note-gnu-property2.s b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property2.s new file mode 100644 index 00000000000..899f6cdbd75 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property2.s @@ -0,0 +1,37 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t +// RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU +// RUN: llvm-readobj --elf-output-style LLVM --notes %t | FileCheck %s --check-prefix=LLVM + +// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000014: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: GNU 0x00000004 NT_GNU_PROPERTY_TYPE_0 (property note) +// GNU-NEXT: Properties: <corrupted GNU_PROPERTY_TYPE_0> + +// LLVM: Notes [ +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x40 +// LLVM-NEXT: Size: 0x14 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: GNU +// LLVM-NEXT: Data size: 0x4 +// LLVM-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note) +// LLVM-NEXT: Property [ +// LLVM-NEXT: <corrupted GNU_PROPERTY_TYPE_0> +// LLVM-NEXT: ] +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: ] + +// Section below is broken, check we report that. + +.section ".note.gnu.property", "a" +.align 4 + .long 4 /* Name length is always 4 ("GNU") */ + .long end - begin /* Data length */ + .long 5 /* Type: NT_GNU_PROPERTY_TYPE_0 */ + .asciz "GNU" /* Name */ + .p2align 3 +begin: + .long 1 /* Type: GNU_PROPERTY_STACK_SIZE */ +end: diff --git a/llvm/test/tools/llvm-readobj/ELF/note-unknown.s b/llvm/test/tools/llvm-readobj/ELF/note-unknown.s new file mode 100644 index 00000000000..632db2880ea --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/note-unknown.s @@ -0,0 +1,55 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o + +// RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM +// RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU + +// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000010: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: XYZ 0x00000000 Unknown note type: (0x00000003) +// GNU-NEXT: Displaying notes found at file offset 0x00000050 with length 0x0000002c: +// GNU-NEXT: Owner Data size Description +// GNU-NEXT: XYZ 0x0000001c Unknown note type: (0x00000003) +// GNU-NEXT: description data: 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 00 00 + +// LLVM: Notes [ +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x40 +// LLVM-NEXT: Size: 0x10 +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: XYZ +// LLVM-NEXT: Data size: 0x0 +// LLVM-NEXT: Type: Unknown (0x00000003) +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: NoteSection { +// LLVM-NEXT: Offset: 0x50 +// LLVM-NEXT: Size: 0x2C +// LLVM-NEXT: Note { +// LLVM-NEXT: Owner: XYZ +// LLVM-NEXT: Data size: 0x1C +// LLVM-NEXT: Type: Unknown (0x00000003) +// LLVM-NEXT: Description data ( +// LLVM-NEXT: 0000: 4C6F7265 6D206970 73756D20 646F6C6F |Lorem ipsum dolo| +// LLVM-NEXT: 0010: 72207369 7420616D 65740000 |r sit amet..| +// LLVM-NEXT: ) +// LLVM-NEXT: } +// LLVM-NEXT: } +// LLVM-NEXT: ] + +.section ".note.foo", "a" + .align 4 + .long 4 /* namesz */ + .long 0 /* descsz */ + .long 3 /* type */ + .asciz "XYZ" +.section ".note.bar", "a" + .align 4 + .long 4 /* namesz */ + .long end - begin /* descsz */ + .long 3 /* type */ + .asciz "XYZ" +begin: + .asciz "Lorem ipsum dolor sit amet" + .align 4 +end: diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-empty.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-empty.s new file mode 100644 index 00000000000..28b35470de3 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-empty.s @@ -0,0 +1,12 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -r - | FileCheck %s + +// CHECK: Relocations [ +// CHECK-NEXT: Section (3) .rela.dyn { +// CHECK-NEXT: } +// CHECK-NEXT: ] + +.section .rela.dyn, "a", @0x60000001 +.ascii "APS2" +.sleb128 0 +.sleb128 0 diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s new file mode 100644 index 00000000000..cfe2f8cf5bd --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s @@ -0,0 +1,7 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s + +// CHECK: error: '<stdin>': invalid packed relocation header + +.section .rela.dyn, "a", @0x60000001 +.ascii "APS9" diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s new file mode 100644 index 00000000000..6e8e9bf5bd1 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s @@ -0,0 +1,7 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s + +// CHECK: error: '<stdin>': malformed sleb128, extends past end + +.section .rela.dyn, "a", @0x60000001 +.ascii "APS2" diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s new file mode 100644 index 00000000000..8b18ca210aa --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s @@ -0,0 +1,9 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s + +// CHECK: error: '<stdin>': malformed sleb128, extends past end + +.section .rela.dyn, "a", @0x60000001 +.ascii "APS2" +.sleb128 4 // Number of relocations +.sleb128 0 // Initial offset diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s new file mode 100644 index 00000000000..05b95410898 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s @@ -0,0 +1,13 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s + +// CHECK: error: '<stdin>': malformed sleb128, extends past end + +.section .rela.dyn, "a", @0x60000001 +.ascii "APS2" +.sleb128 4 // Number of relocations +.sleb128 0 // Initial offset + +.sleb128 2 // Number of relocations in group +.sleb128 2 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG +.sleb128 8 // offset delta diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s new file mode 100644 index 00000000000..db2b0511478 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s @@ -0,0 +1,13 @@ +// REQUIRES: x86-registered-target +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s + +// CHECK: error: '<stdin>': relocation group unexpectedly large + +.section .rela.dyn, "a", @0x60000001 +.ascii "APS2" +.sleb128 4 // Number of relocations +.sleb128 0 // Initial offset + +.sleb128 5 // Number of relocations in group +.sleb128 2 // RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG +.sleb128 8 // offset delta diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test new file mode 100644 index 00000000000..4c1ddfcb40f --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test @@ -0,0 +1,141 @@ +# The binary blobs in this file were created like this: +# llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu Inputs/elf-packed-relocs1.s -o - | obj2yaml | grep Content: + +# RUN: yaml2obj -docnum 1 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM1 %s +# LLVM1: Section (1) .rela.dyn { +# LLVM1-NEXT: 0x1100 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x1180 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x1188 R_X86_64_64 sym1 0x0 +# LLVM1-NEXT: 0x1190 R_X86_64_64 sym2 0x0 +# LLVM1-NEXT: 0x1191 R_X86_64_64 sym1 0x8 +# LLVM1-NEXT: 0x1193 R_X86_64_64 sym2 0xC +# LLVM1-NEXT: 0x1197 R_X86_64_64 sym1 0xA +# LLVM1-NEXT: 0x119F R_X86_64_64 sym2 0xA +# LLVM1-NEXT: } + +# RUN: yaml2obj -docnum 1 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU1 %s +# GNU1: Relocation section '.rela.dyn' at offset 0x40 contains 8 entries: +# GNU1: 0000000000001100 0000000000000008 R_X86_64_RELATIVE 0 +# GNU1-NEXT: 0000000000001180 0000000000000008 R_X86_64_RELATIVE 0 +# GNU1-NEXT: 0000000000001188 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0 +# GNU1-NEXT: 0000000000001190 0000000200000001 R_X86_64_64 0000000000000000 sym2 + 0 +# GNU1-NEXT: 0000000000001191 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 8 +# GNU1-NEXT: 0000000000001193 0000000200000001 R_X86_64_64 0000000000000000 sym2 + c +# GNU1-NEXT: 0000000000001197 0000000100000001 R_X86_64_64 0000000000000000 sym1 + a +# GNU1-NEXT: 000000000000119f 0000000200000001 R_X86_64_64 0000000000000000 sym2 + a + +# elf-packed-relocs1.s +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + Entry: 0x0000000000001000 +Sections: + - Name: .rela.dyn + Type: SHT_ANDROID_RELA + Flags: [ SHF_ALLOC ] + Address: 0x00000000000001C8 + Link: .symtab + AddressAlign: 0x0000000000000001 + Content: 41505332088020020108800280010202088180808010818080802002080181808080100802818080802004020C7E048180808010088180808020 +Symbols: + - Name: sym1 + Binding: STB_GLOBAL + - Name: sym2 + Binding: STB_GLOBAL +... + +# RUN: yaml2obj -docnum 2 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM2 %s +# LLVM2: Section (1) .rel.dyn { +# LLVM2-NEXT: 0x1008 R_386_32 sym1 0x0 +# LLVM2-NEXT: 0x1010 R_386_GOT32 sym2 0x0 +# LLVM2-NEXT: 0x100C R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x1008 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x1004 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x1000 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0xFFC R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0xFF8 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0xFF4 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0xFF0 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: } + +# RUN: yaml2obj -docnum 2 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU2 %s +# GNU2: Relocation section '.rel.dyn' at offset 0x34 contains 10 entries: +# GNU2: 00001008 00000101 R_386_32 00000000 sym1 +# GNU2-NEXT: 00001010 00000203 R_386_GOT32 00000000 sym2 +# GNU2-NEXT: 0000100c 00000008 R_386_RELATIVE +# GNU2-NEXT: 00001008 00000008 R_386_RELATIVE +# GNU2-NEXT: 00001004 00000008 R_386_RELATIVE +# GNU2-NEXT: 00001000 00000008 R_386_RELATIVE +# GNU2-NEXT: 00000ffc 00000008 R_386_RELATIVE +# GNU2-NEXT: 00000ff8 00000008 R_386_RELATIVE +# GNU2-NEXT: 00000ff4 00000008 R_386_RELATIVE +# GNU2-NEXT: 00000ff0 00000008 R_386_RELATIVE + +# elf-packed-relocs2.s +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 + Entry: 0x0000000000001000 +Sections: + - Name: .rel.dyn + Type: SHT_ANDROID_REL + Flags: [ SHF_ALLOC ] + Address: 0x00000000000001C8 + Link: .symtab + AddressAlign: 0x0000000000000001 + Content: 415053320A80200202088102830408037C08 +Symbols: + - Name: sym1 + Binding: STB_GLOBAL + - Name: sym2 + Binding: STB_GLOBAL +... + +# RUN: yaml2obj -docnum 3 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM3 %s +# +# LLVM3: Section (1) .rela.dyn { +# LLVM3-NEXT: 0x1100 R_X86_64_RELATIVE - 0x0 +# LLVM3-NEXT: 0x1180 R_X86_64_RELATIVE - 0x8 +# LLVM3-NEXT: 0x1200 R_X86_64_64 sym1 0x0 +# LLVM3-NEXT: 0x1208 R_X86_64_64 sym2 0x0 +# LLVM3-NEXT: 0x1210 R_X86_64_64 sym1 0x0 +# LLVM3-NEXT: 0x1218 R_X86_64_64 sym2 0x8 +# LLVM3-NEXT: } + +# RUN: yaml2obj -docnum 3 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU3 %s +# GNU3: Relocation section '.rela.dyn' at offset 0x40 contains 6 entries: +# GNU3: 0000000000001100 0000000000000008 R_X86_64_RELATIVE 0 +# GNU3-NEXT: 0000000000001180 0000000000000008 R_X86_64_RELATIVE 8 +# GNU3-NEXT: 0000000000001200 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0 +# GNU3-NEXT: 0000000000001208 0000000200000001 R_X86_64_64 0000000000000000 sym2 + 0 +# GNU3-NEXT: 0000000000001210 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0 +# GNU3-NEXT: 0000000000001218 0000000200000001 R_X86_64_64 0000000000000000 sym2 + 8 + +# elf-packed-relocs3.s +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + Entry: 0x0000000000001000 +Sections: + - Name: .rela.dyn + Type: SHT_ANDROID_RELA + Flags: [ SHF_ALLOC ] + Address: 0x00000000000001C8 + Link: .symtab + AddressAlign: 0x0000000000000001 + Content: 415053320680200208800208008001080802008001818080801008818080802002080881808080100008818080802008 +Symbols: + - Name: sym1 + Binding: STB_GLOBAL + - Name: sym2 + Binding: STB_GLOBAL +... diff --git a/llvm/test/tools/llvm-readobj/ELF/ppc64-glink.test b/llvm/test/tools/llvm-readobj/ELF/ppc64-glink.test new file mode 100644 index 00000000000..ac361784e06 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/ppc64-glink.test @@ -0,0 +1,11 @@ +# Check DT_PPC64_GLINK dynamic tag. + +RUN: llvm-readobj --dynamic-table %p/Inputs/ppc64.exe | FileCheck %s + +CHECK: Format: ELF64-ppc64 +CHECK: Arch: powerpc64le +CHECK: AddressSize: 64bit + +CHECK: DynamicSection [ (25 entries) +CHECK-NEXT: Tag Type Name/Value +CHECK: 0x0000000070000000 PPC64_GLINK 0x10000830 diff --git a/llvm/test/tools/llvm-readobj/ELF/program-headers.test b/llvm/test/tools/llvm-readobj/ELF/program-headers.test new file mode 100644 index 00000000000..119b3a4d9f0 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/program-headers.test @@ -0,0 +1,170 @@ +# RUN: llvm-readobj --program-headers %p/../../../Object/Inputs/program-headers.elf-i386 \ +# RUN: | FileCheck %s -check-prefix ELF-I386 +# RUN: llvm-readobj -l %p/../../../Object/Inputs/program-headers.elf-i386 \ +# RUN: | FileCheck %s -check-prefix ELF-I386 + +# ELF-I386: ProgramHeaders [ +# ELF-I386-NEXT: ProgramHeader { +# ELF-I386-NEXT: Type: PT_LOAD (0x1) +# ELF-I386-NEXT: Offset: 0x0 +# ELF-I386-NEXT: VirtualAddress: 0x8048000 +# ELF-I386-NEXT: PhysicalAddress: 0x8048000 +# ELF-I386-NEXT: FileSize: 308 +# ELF-I386-NEXT: MemSize: 308 +# ELF-I386-NEXT: Flags [ (0x5) +# ELF-I386-NEXT: PF_R (0x4) +# ELF-I386-NEXT: PF_X (0x1) +# ELF-I386-NEXT: ] +# ELF-I386-NEXT: Alignment: 4096 +# ELF-I386-NEXT: } +# ELF-I386-NEXT: ProgramHeader { +# ELF-I386-NEXT: Type: PT_GNU_STACK (0x6474E551) +# ELF-I386-NEXT: Offset: 0x0 +# ELF-I386-NEXT: VirtualAddress: 0x0 +# ELF-I386-NEXT: PhysicalAddress: 0x0 +# ELF-I386-NEXT: FileSize: 0 +# ELF-I386-NEXT: MemSize: 0 +# ELF-I386-NEXT: Flags [ (0x6) +# ELF-I386-NEXT: PF_R (0x4) +# ELF-I386-NEXT: PF_W (0x2) +# ELF-I386-NEXT: ] +# ELF-I386-NEXT: Alignment: 4 +# ELF-I386-NEXT: } +# ELF-I386-NEXT: ] + +# RUN: llvm-readobj -l %p/../../../Object/Inputs/program-headers.elf-x86-64 \ +# RUN: | FileCheck %s -check-prefix ELF-X86-64 + +# ELF-X86-64: ProgramHeaders [ +# ELF-X86-64-NEXT: ProgramHeader { +# ELF-X86-64-NEXT: Type: PT_LOAD (0x1) +# ELF-X86-64-NEXT: Offset: 0x0 +# ELF-X86-64-NEXT: VirtualAddress: 0x400000 +# ELF-X86-64-NEXT: PhysicalAddress: 0x400000 +# ELF-X86-64-NEXT: FileSize: 312 +# ELF-X86-64-NEXT: MemSize: 312 +# ELF-X86-64-NEXT: Flags [ (0x5) +# ELF-X86-64-NEXT: PF_R (0x4) +# ELF-X86-64-NEXT: PF_X (0x1) +# ELF-X86-64-NEXT: ] +# ELF-X86-64-NEXT: Alignment: 2097152 +# ELF-X86-64-NEXT: } +# ELF-X86-64-NEXT: ProgramHeader { +# ELF-X86-64-NEXT: Type: PT_GNU_EH_FRAME (0x6474E550) +# ELF-X86-64-NEXT: Offset: 0xF4 +# ELF-X86-64-NEXT: VirtualAddress: 0x4000F4 +# ELF-X86-64-NEXT: PhysicalAddress: 0x4000F4 +# ELF-X86-64-NEXT: FileSize: 20 +# ELF-X86-64-NEXT: MemSize: 20 +# ELF-X86-64-NEXT: Flags [ (0x4) +# ELF-X86-64-NEXT: PF_R (0x4) +# ELF-X86-64-NEXT: ] +# ELF-X86-64-NEXT: Alignment: 4 +# ELF-X86-64-NEXT: } +# ELF-X86-64-NEXT: ProgramHeader { +# ELF-X86-64-NEXT: Type: PT_GNU_STACK (0x6474E551) +# ELF-X86-64-NEXT: Offset: 0x0 +# ELF-X86-64-NEXT: VirtualAddress: 0x0 +# ELF-X86-64-NEXT: PhysicalAddress: 0x0 +# ELF-X86-64-NEXT: FileSize: 0 +# ELF-X86-64-NEXT: MemSize: 0 +# ELF-X86-64-NEXT: Flags [ (0x6) +# ELF-X86-64-NEXT: PF_R (0x4) +# ELF-X86-64-NEXT: PF_W (0x2) +# ELF-X86-64-NEXT: ] +# ELF-X86-64-NEXT: Alignment: 8 +# ELF-X86-64-NEXT: } +# ELF-X86-64-NEXT: ] + +# RUN: llvm-readobj -l %p/../../../Object/Inputs/program-headers.mips \ +# RUN: | FileCheck %s -check-prefix ELF-MIPS + +# ELF-MIPS: Format: ELF32-mips +# ELF-MIPS-NEXT: Arch: mips +# ELF-MIPS-NEXT: AddressSize: 32bit +# ELF-MIPS-NEXT: LoadName: +# ELF-MIPS-NEXT: ProgramHeaders [ +# ELF-MIPS-NEXT: ProgramHeader { +# ELF-MIPS-NEXT: Type: PT_MIPS_ABIFLAGS (0x70000003) +# ELF-MIPS-NEXT: Offset: 0x98 +# ELF-MIPS-NEXT: VirtualAddress: 0x400098 +# ELF-MIPS-NEXT: PhysicalAddress: 0x400098 +# ELF-MIPS-NEXT: FileSize: 24 +# ELF-MIPS-NEXT: MemSize: 24 +# ELF-MIPS-NEXT: Flags [ (0x4) +# ELF-MIPS-NEXT: PF_R (0x4) +# ELF-MIPS-NEXT: ] +# ELF-MIPS-NEXT: Alignment: 8 +# ELF-MIPS-NEXT: } +# ELF-MIPS-NEXT: ProgramHeader { +# ELF-MIPS-NEXT: Type: PT_MIPS_REGINFO (0x70000000) +# ELF-MIPS-NEXT: Offset: 0xB0 +# ELF-MIPS-NEXT: VirtualAddress: 0x4000B0 +# ELF-MIPS-NEXT: PhysicalAddress: 0x4000B0 +# ELF-MIPS-NEXT: FileSize: 24 +# ELF-MIPS-NEXT: MemSize: 24 +# ELF-MIPS-NEXT: Flags [ (0x4) +# ELF-MIPS-NEXT: PF_R (0x4) +# ELF-MIPS-NEXT: ] +# ELF-MIPS-NEXT: Alignment: 4 +# ELF-MIPS-NEXT: } +# ELF-MIPS-NEXT: ProgramHeader { +# ELF-MIPS-NEXT: Type: PT_LOAD (0x1) +# ELF-MIPS-NEXT: Offset: 0x0 +# ELF-MIPS-NEXT: VirtualAddress: 0x400000 +# ELF-MIPS-NEXT: PhysicalAddress: 0x400000 +# ELF-MIPS-NEXT: FileSize: 224 +# ELF-MIPS-NEXT: MemSize: 224 +# ELF-MIPS-NEXT: Flags [ (0x5) +# ELF-MIPS-NEXT: PF_R (0x4) +# ELF-MIPS-NEXT: PF_X (0x1) +# ELF-MIPS-NEXT: ] +# ELF-MIPS-NEXT: Alignment: 65536 +# ELF-MIPS-NEXT: } +# ELF-MIPS-NEXT: ] + +# RUN: llvm-readobj -l %p/../../../Object/Inputs/program-headers.mips64 \ +# RUN: | FileCheck %s -check-prefix ELF-MIPS64 + +# ELF-MIPS64: Format: ELF64-mips +# ELF-MIPS64-NEXT: Arch: mips64 +# ELF-MIPS64-NEXT: AddressSize: 64bit +# ELF-MIPS64-NEXT: LoadName: +# ELF-MIPS64-NEXT: ProgramHeaders [ +# ELF-MIPS64-NEXT: ProgramHeader { +# ELF-MIPS64-NEXT: Type: PT_LOAD (0x1) +# ELF-MIPS64-NEXT: Offset: 0x0 +# ELF-MIPS64-NEXT: VirtualAddress: 0x120000000 +# ELF-MIPS64-NEXT: PhysicalAddress: 0x120000000 +# ELF-MIPS64-NEXT: FileSize: 136 +# ELF-MIPS64-NEXT: MemSize: 136 +# ELF-MIPS64-NEXT: Flags [ (0x5) +# ELF-MIPS64-NEXT: PF_R (0x4) +# ELF-MIPS64-NEXT: PF_X (0x1) +# ELF-MIPS64-NEXT: ] +# ELF-MIPS64-NEXT: Alignment: 65536 +# ELF-MIPS64-NEXT: } +# ELF-MIPS64-NEXT: ] + +## Test that llvm-readobj dumps OpenBSD specific program headers. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj -l %t | FileCheck %s --check-prefix=OPENBSD-X86-64 + +# OPENBSD-X86-64: ProgramHeader { +# OPENBSD-X86-64-NEXT: Type: PT_OPENBSD_RANDOMIZE +# OPENBSD-X86-64: ProgramHeader { +# OPENBSD-X86-64-NEXT: Type: PT_OPENBSD_WXNEEDED +# OPENBSD-X86-64: ProgramHeader { +# OPENBSD-X86-64-NEXT: Type: PT_OPENBSD_BOOTDATA + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +ProgramHeaders: + - Type: 0x65a3dbe6 ## PT_OPENBSD_RANDOMIZE + - Type: 0x65a3dbe7 ## PT_OPENBSD_WXNEEDED + - Type: 0x65a41be6 ## PT_OPENBSD_BOOTDATA diff --git a/llvm/test/tools/llvm-readobj/ELF/pt-gnu-property.test b/llvm/test/tools/llvm-readobj/ELF/pt-gnu-property.test new file mode 100644 index 00000000000..f47341115b5 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/pt-gnu-property.test @@ -0,0 +1,17 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readelf --program-headers %t | FileCheck %s --check-prefix=GNU +# RUN: llvm-readobj --program-headers %t | FileCheck %s --check-prefix=LLVM + +# GNU: {{ }}GNU_PROPERTY{{ }} + +# LLVM: ProgramHeader { +# LLVM-NEXT: Type: PT_GNU_PROPERTY (0x6474E553) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_AARCH64 +ProgramHeaders: + - Type: PT_GNU_PROPERTY diff --git a/llvm/test/tools/llvm-readobj/ELF/readelf-s-alias.test b/llvm/test/tools/llvm-readobj/ELF/readelf-s-alias.test new file mode 100644 index 00000000000..b50d0e2442a --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/readelf-s-alias.test @@ -0,0 +1,49 @@ +# In llvm-readobj, -s is an alias for --sections. +RUN: llvm-readobj -S %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix SEC +RUN: llvm-readobj --sections %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix SEC + +# In llvm-readelf, -s is an alias for --symbols. +RUN: llvm-readelf -s %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix SYM +RUN: llvm-readelf --symbols %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix SYM + +SEC: Sections [ +SEC-NEXT: Section { +SEC-NEXT: Index: 0 +SEC-NEXT: Name: (0) +SEC-NEXT: Type: SHT_NULL (0x0) +SEC-NEXT: Flags [ (0x0) +SEC-NEXT: ] +SEC-NEXT: Address: 0x0 +SEC-NEXT: Offset: 0x0 +SEC-NEXT: Size: 0 +SEC-NEXT: Link: 0 +SEC-NEXT: Info: 0 +SEC-NEXT: AddressAlignment: 0 +SEC-NEXT: EntrySize: 0 +SEC-NEXT: } +SEC-NEXT: Section { +SEC-NEXT: Index: 1 +SEC-NEXT: Name: .text (5) +SEC-NEXT: Type: SHT_PROGBITS (0x1) +SEC-NEXT: Flags [ (0x6) +SEC-NEXT: SHF_ALLOC (0x2) +SEC-NEXT: SHF_EXECINSTR (0x4) +SEC-NEXT: ] +SEC-NEXT: Address: 0x0 +SEC-NEXT: Offset: 0x40 +SEC-NEXT: Size: 42 +SEC-NEXT: Link: 0 +SEC-NEXT: Info: 0 +SEC-NEXT: AddressAlignment: 16 +SEC-NEXT: EntrySize: 0 +SEC-NEXT: } + +SYM: Symbol table '.symtab' contains {{.*}} entries: +SYM-NEXT: Num: Value Size Type Bind Vis Ndx Name +SYM-NEXT: 0: {{.*}} NOTYPE {{.*}} UND +SYM-NEXT: 1: {{.*}} FILE {{.*}} trivial.ll +SYM-NEXT: 2: {{.*}} OBJECT {{.*}} .L.str diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-negative-addend-no-sym.test b/llvm/test/tools/llvm-readobj/ELF/reloc-negative-addend-no-sym.test new file mode 100644 index 00000000000..3a318d52175 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-negative-addend-no-sym.test @@ -0,0 +1,73 @@ +# Show that llvm-readelf properly prints the addend for relocations that do not +# have an associated symbol but have a negative addend. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readelf --relocations %t | FileCheck %s --check-prefix=REL +# RUN: llvm-readelf --dyn-relocations %t | FileCheck %s --check-prefix=DYN + +# REL: Relocation section '.rela.text' at offset {{.*}} contains 1 entries: +# REL-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# REL-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE ffffffffffffffff +# REL-EMPTY: +# REL-NEXT: Relocation section '.rela.dyn' at offset {{.*}} contains 1 entries: +# REL-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# REL-NEXT: 0000000000000008 0000000000000000 R_X86_64_NONE ffffffffffffffff + +# DYN: 'RELA' relocation section at offset {{.*}} contains 24 bytes: +# DYN-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# DYN-NEXT: 0000000000000008 0000000000000000 R_X86_64_NONE ffffffffffffffff + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x10 + - Name: .rela.text + Type: SHT_RELA + Info: .text + Relocations: + - Offset: 0 + Type: R_X86_64_NONE + Addend: -1 + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [SHF_ALLOC] + Address: 0x1000 + AddressAlign: 0x1000 + Entries: + - Tag: DT_RELA + Value: 0x1100 + - Tag: DT_RELASZ + Value: 24 + - Tag: DT_RELAENT + Value: 24 + - Tag: DT_NULL + Value: 0 + - Name: .rela.dyn + Type: SHT_RELA + Flags: [SHF_ALLOC] + Info: .text + Address: 0x1100 + AddressAlign: 0x100 + Relocations: + - Offset: 8 + Type: R_X86_64_NONE + Addend: -1 +DynamicSymbols: + - Name: force_dynsym + Binding: STB_GLOBAL +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .rela.dyn + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-no-sym.test b/llvm/test/tools/llvm-readobj/ELF/reloc-no-sym.test new file mode 100644 index 00000000000..7c4aa593f24 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-no-sym.test @@ -0,0 +1,26 @@ +## Check llvm-readobj is able to dump relocations that +## do not use symbols. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj -r %t | FileCheck %s + +# CHECK: Relocations [ +# CHECK-NEXT: Section (1) .rela.plt { +# CHECK-NEXT: 0x12345678 R_X86_64_IRELATIVE - 0x87654321 +# CHECK-NEXT: } +# CHECK-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .rela.plt + Type: SHT_RELA + Flags: [ SHF_ALLOC ] + Relocations: + - Offset: 0x12345678 + Type: R_X86_64_IRELATIVE + Addend: 0x87654321 diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-symbol-with-versioning.test b/llvm/test/tools/llvm-readobj/ELF/reloc-symbol-with-versioning.test new file mode 100644 index 00000000000..8fa191984d5 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-symbol-with-versioning.test @@ -0,0 +1,108 @@ +# RUN: yaml2obj %s > %t.o +# RUN: llvm-readobj --demangle -r %t.o | FileCheck %s --check-prefix LLVM +# RUN: llvm-readelf --demangle -r %t.o | FileCheck %s --check-prefix GNU + +# GNU: Relocation section '.rela.plt' at offset {{.*}} contains 5 entries: +# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# GNU-NEXT: 0000000000013018 0000000100000007 R_X86_64_JUMP_SLOT 0000000000000000 f1@v3 + 0 +# GNU-NEXT: 0000000000013020 0000000200000007 R_X86_64_JUMP_SLOT 0000000000000000 f2@v2 + 0 +# GNU-NEXT: 0000000000013028 0000000300000007 R_X86_64_JUMP_SLOT 0000000000000000 g1@v1 + 0 +# GNU-NEXT: 0000000000013040 0000000400000007 R_X86_64_JUMP_SLOT 0000000000000000 f1()@v3 + 0 +# GNU-NEXT: 0000000000013058 0000000500000007 R_X86_64_JUMP_SLOT 0000000000000000 f3 + 0 + +# LLVM: Relocations [ +# LLVM-NEXT: Section (3) .rela.plt { +# LLVM-NEXT: 0x13018 R_X86_64_JUMP_SLOT f1@v3 0x0 +# LLVM-NEXT: 0x13020 R_X86_64_JUMP_SLOT f2@v2 0x0 +# LLVM-NEXT: 0x13028 R_X86_64_JUMP_SLOT g1@v1 0x0 +# LLVM-NEXT: 0x13040 R_X86_64_JUMP_SLOT f1()@v3 0x0 +# LLVM-NEXT: 0x13058 R_X86_64_JUMP_SLOT f3 0x0 +# LLVM-NEXT: } +# LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x0000000000000000 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + AddressAlign: 0x0000000000000002 + EntSize: 0x0000000000000002 + Entries: [ 0, 2, 3, 4, 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Link: .dynstr + AddressAlign: 0x0000000000000004 + Info: 0x0000000000000002 + Dependencies: + - Version: 1 + File: verneed1.so.0 + Entries: + - Name: v2 + Hash: 1938 + Flags: 0 + Other: 3 + - Name: v3 + Hash: 1939 + Flags: 0 + Other: 2 + - Version: 1 + File: verneed2.so.0 + Entries: + - Name: v1 + Hash: 1937 + Flags: 0 + Other: 4 + - Name: .rela.plt + Type: SHT_RELA + Flags: [ SHF_ALLOC ] + Info: 0 + Link: 7 + AddressAlign: 0x0000000000000008 + EntSize: 0x0000000000000018 + Relocations: + - Offset: 0x0000000000013018 + Symbol: f1 + Type: R_X86_64_JUMP_SLOT + - Offset: 0x0000000000013020 + Symbol: f2 + Type: R_X86_64_JUMP_SLOT + - Offset: 0x0000000000013028 + Symbol: g1 + Type: R_X86_64_JUMP_SLOT + - Offset: 0x0000000000013040 + Symbol: _Z2f1v + Type: R_X86_64_JUMP_SLOT + - Offset: 0x0000000000013058 + Symbol: f3 + Type: R_X86_64_JUMP_SLOT +Symbols: + - Name: f1 + Binding: STB_GLOBAL + - Name: f2 + Binding: STB_GLOBAL + - Name: g1 + Binding: STB_GLOBAL + - Name: _Z2f1v + Binding: STB_GLOBAL + - Name: f3 + Binding: STB_GLOBAL +DynamicSymbols: + - Name: f1 + Binding: STB_GLOBAL + - Name: f2 + Binding: STB_GLOBAL + - Name: g1 + Binding: STB_GLOBAL + - Name: _Z2f1v + Binding: STB_GLOBAL + - Name: f3 + Binding: STB_GLOBAL +... diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-aarch64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-aarch64.test new file mode 100644 index 00000000000..fdd3b97b6b2 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-aarch64.test @@ -0,0 +1,392 @@ +## Test that llvm-readobj/llvm-readelf shows proper relocation type +## names and values for aarch64 target. + +# RUN: yaml2obj %s -o %t-aarch64.o +# RUN: llvm-readobj -r --expand-relocs %t-aarch64.o | FileCheck %s + +# CHECK: Type: R_AARCH64_NONE (0) +# CHECK: Type: R_AARCH64_ABS64 (257) +# CHECK: Type: R_AARCH64_ABS32 (258) +# CHECK: Type: R_AARCH64_ABS16 (259) +# CHECK: Type: R_AARCH64_PREL64 (260) +# CHECK: Type: R_AARCH64_PREL32 (261) +# CHECK: Type: R_AARCH64_PREL16 (262) +# CHECK: Type: R_AARCH64_MOVW_UABS_G0 (263) +# CHECK: Type: R_AARCH64_MOVW_UABS_G0_NC (264) +# CHECK: Type: R_AARCH64_MOVW_UABS_G1 (265) +# CHECK: Type: R_AARCH64_MOVW_UABS_G1_NC (266) +# CHECK: Type: R_AARCH64_MOVW_UABS_G2 (267) +# CHECK: Type: R_AARCH64_MOVW_UABS_G2_NC (268) +# CHECK: Type: R_AARCH64_MOVW_UABS_G3 (269) +# CHECK: Type: R_AARCH64_MOVW_SABS_G0 (270) +# CHECK: Type: R_AARCH64_MOVW_SABS_G1 (271) +# CHECK: Type: R_AARCH64_MOVW_SABS_G2 (272) +# CHECK: Type: R_AARCH64_LD_PREL_LO19 (273) +# CHECK: Type: R_AARCH64_ADR_PREL_LO21 (274) +# CHECK: Type: R_AARCH64_ADR_PREL_PG_HI21 (275) +# CHECK: Type: R_AARCH64_ADR_PREL_PG_HI21_NC (276) +# CHECK: Type: R_AARCH64_ADD_ABS_LO12_NC (277) +# CHECK: Type: R_AARCH64_LDST8_ABS_LO12_NC (278) +# CHECK: Type: R_AARCH64_TSTBR14 (279) +# CHECK: Type: R_AARCH64_CONDBR19 (280) +# CHECK: Type: R_AARCH64_JUMP26 (282) +# CHECK: Type: R_AARCH64_CALL26 (283) +# CHECK: Type: R_AARCH64_LDST16_ABS_LO12_NC (284) +# CHECK: Type: R_AARCH64_LDST32_ABS_LO12_NC (285) +# CHECK: Type: R_AARCH64_LDST64_ABS_LO12_NC (286) +# CHECK: Type: R_AARCH64_MOVW_PREL_G0 (287) +# CHECK: Type: R_AARCH64_MOVW_PREL_G0_NC (288) +# CHECK: Type: R_AARCH64_MOVW_PREL_G1 (289) +# CHECK: Type: R_AARCH64_MOVW_PREL_G1_NC (290) +# CHECK: Type: R_AARCH64_MOVW_PREL_G2 (291) +# CHECK: Type: R_AARCH64_MOVW_PREL_G2_NC (292) +# CHECK: Type: R_AARCH64_MOVW_PREL_G3 (293) +# CHECK: Type: R_AARCH64_LDST128_ABS_LO12_NC (299) +# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G0 (300) +# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G0_NC (301) +# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G1 (302) +# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G1_NC (303) +# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G2 (304) +# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G2_NC (305) +# CHECK: Type: R_AARCH64_MOVW_GOTOFF_G3 (306) +# CHECK: Type: R_AARCH64_GOTREL64 (307) +# CHECK: Type: R_AARCH64_GOTREL32 (308) +# CHECK: Type: R_AARCH64_GOT_LD_PREL19 (309) +# CHECK: Type: R_AARCH64_LD64_GOTOFF_LO15 (310) +# CHECK: Type: R_AARCH64_ADR_GOT_PAGE (311) +# CHECK: Type: R_AARCH64_LD64_GOT_LO12_NC (312) +# CHECK: Type: R_AARCH64_LD64_GOTPAGE_LO15 (313) +# CHECK: Type: R_AARCH64_TLSGD_ADR_PREL21 (512) +# CHECK: Type: R_AARCH64_TLSGD_ADR_PAGE21 (513) +# CHECK: Type: R_AARCH64_TLSGD_ADD_LO12_NC (514) +# CHECK: Type: R_AARCH64_TLSGD_MOVW_G1 (515) +# CHECK: Type: R_AARCH64_TLSGD_MOVW_G0_NC (516) +# CHECK: Type: R_AARCH64_TLSLD_ADR_PREL21 (517) +# CHECK: Type: R_AARCH64_TLSLD_ADR_PAGE21 (518) +# CHECK: Type: R_AARCH64_TLSLD_ADD_LO12_NC (519) +# CHECK: Type: R_AARCH64_TLSLD_MOVW_G1 (520) +# CHECK: Type: R_AARCH64_TLSLD_MOVW_G0_NC (521) +# CHECK: Type: R_AARCH64_TLSLD_LD_PREL19 (522) +# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G2 (523) +# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G1 (524) +# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC (525) +# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G0 (526) +# CHECK: Type: R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC (527) +# CHECK: Type: R_AARCH64_TLSLD_ADD_DTPREL_HI12 (528) +# CHECK: Type: R_AARCH64_TLSLD_ADD_DTPREL_LO12 (529) +# CHECK: Type: R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC (530) +# CHECK: Type: R_AARCH64_TLSLD_LDST8_DTPREL_LO12 (531) +# CHECK: Type: R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC (532) +# CHECK: Type: R_AARCH64_TLSLD_LDST16_DTPREL_LO12 (533) +# CHECK: Type: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC (534) +# CHECK: Type: R_AARCH64_TLSLD_LDST32_DTPREL_LO12 (535) +# CHECK: Type: R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC (536) +# CHECK: Type: R_AARCH64_TLSLD_LDST64_DTPREL_LO12 (537) +# CHECK: Type: R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC (538) +# CHECK: Type: R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 (539) +# CHECK: Type: R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC (540) +# CHECK: Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 (541) +# CHECK: Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC (542) +# CHECK: Type: R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 (543) +# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G2 (544) +# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G1 (545) +# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G1_NC (546) +# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G0 (547) +# CHECK: Type: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC (548) +# CHECK: Type: R_AARCH64_TLSLE_ADD_TPREL_HI12 (549) +# CHECK: Type: R_AARCH64_TLSLE_ADD_TPREL_LO12 (550) +# CHECK: Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC (551) +# CHECK: Type: R_AARCH64_TLSLE_LDST8_TPREL_LO12 (552) +# CHECK: Type: R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC (553) +# CHECK: Type: R_AARCH64_TLSLE_LDST16_TPREL_LO12 (554) +# CHECK: Type: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC (555) +# CHECK: Type: R_AARCH64_TLSLE_LDST32_TPREL_LO12 (556) +# CHECK: Type: R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC (557) +# CHECK: Type: R_AARCH64_TLSLE_LDST64_TPREL_LO12 (558) +# CHECK: Type: R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC (559) +# CHECK: Type: R_AARCH64_TLSDESC_LD_PREL19 (560) +# CHECK: Type: R_AARCH64_TLSDESC_ADR_PREL21 (561) +# CHECK: Type: R_AARCH64_TLSDESC_ADR_PAGE21 (562) +# CHECK: Type: R_AARCH64_TLSDESC_LD64_LO12 (563) +# CHECK: Type: R_AARCH64_TLSDESC_ADD_LO12 (564) +# CHECK: Type: R_AARCH64_TLSDESC_OFF_G1 (565) +# CHECK: Type: R_AARCH64_TLSDESC_OFF_G0_NC (566) +# CHECK: Type: R_AARCH64_TLSDESC_LDR (567) +# CHECK: Type: R_AARCH64_TLSDESC_ADD (568) +# CHECK: Type: R_AARCH64_TLSDESC_CALL (569) +# CHECK: Type: R_AARCH64_TLSLE_LDST128_TPREL_LO12 (570) +# CHECK: Type: R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC (571) +# CHECK: Type: R_AARCH64_TLSLD_LDST128_DTPREL_LO12 (572) +# CHECK: Type: R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC (573) +# CHECK: Type: R_AARCH64_COPY (1024) +# CHECK: Type: R_AARCH64_GLOB_DAT (1025) +# CHECK: Type: R_AARCH64_JUMP_SLOT (1026) +# CHECK: Type: R_AARCH64_RELATIVE (1027) +# CHECK: Type: R_AARCH64_TLS_DTPMOD64 (1028) +# CHECK: Type: R_AARCH64_TLS_DTPREL64 (1029) +# CHECK: Type: R_AARCH64_TLS_TPREL64 (1030) +# CHECK: Type: R_AARCH64_TLSDESC (1031) +# CHECK: Type: R_AARCH64_IRELATIVE (1032) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_AARCH64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Content: 00 + - Name: .rela.text + Type: SHT_RELA + AddressAlign: 0x0000000000000008 + EntSize: 0x0000000000000018 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Type: R_AARCH64_NONE + - Offset: 0x0000000000000004 + Type: R_AARCH64_ABS64 + - Offset: 0x0000000000000008 + Type: R_AARCH64_ABS32 + - Offset: 0x000000000000000C + Type: R_AARCH64_ABS16 + - Offset: 0x0000000000000010 + Type: R_AARCH64_PREL64 + - Offset: 0x0000000000000014 + Type: R_AARCH64_PREL32 + - Offset: 0x0000000000000018 + Type: R_AARCH64_PREL16 + - Offset: 0x000000000000001C + Type: R_AARCH64_MOVW_UABS_G0 + - Offset: 0x0000000000000020 + Type: R_AARCH64_MOVW_UABS_G0_NC + - Offset: 0x0000000000000024 + Type: R_AARCH64_MOVW_UABS_G1 + - Offset: 0x0000000000000028 + Type: R_AARCH64_MOVW_UABS_G1_NC + - Offset: 0x000000000000002C + Type: R_AARCH64_MOVW_UABS_G2 + - Offset: 0x0000000000000030 + Type: R_AARCH64_MOVW_UABS_G2_NC + - Offset: 0x0000000000000034 + Type: R_AARCH64_MOVW_UABS_G3 + - Offset: 0x0000000000000038 + Type: R_AARCH64_MOVW_SABS_G0 + - Offset: 0x000000000000003C + Type: R_AARCH64_MOVW_SABS_G1 + - Offset: 0x0000000000000040 + Type: R_AARCH64_MOVW_SABS_G2 + - Offset: 0x0000000000000044 + Type: R_AARCH64_LD_PREL_LO19 + - Offset: 0x0000000000000048 + Type: R_AARCH64_ADR_PREL_LO21 + - Offset: 0x000000000000004C + Type: R_AARCH64_ADR_PREL_PG_HI21 + - Offset: 0x0000000000000050 + Type: R_AARCH64_ADR_PREL_PG_HI21_NC + - Offset: 0x0000000000000054 + Type: R_AARCH64_ADD_ABS_LO12_NC + - Offset: 0x0000000000000058 + Type: R_AARCH64_LDST8_ABS_LO12_NC + - Offset: 0x000000000000005C + Type: R_AARCH64_TSTBR14 + - Offset: 0x0000000000000060 + Type: R_AARCH64_CONDBR19 + - Offset: 0x0000000000000064 + Type: R_AARCH64_JUMP26 + - Offset: 0x0000000000000068 + Type: R_AARCH64_CALL26 + - Offset: 0x000000000000006C + Type: R_AARCH64_LDST16_ABS_LO12_NC + - Offset: 0x0000000000000070 + Type: R_AARCH64_LDST32_ABS_LO12_NC + - Offset: 0x0000000000000074 + Type: R_AARCH64_LDST64_ABS_LO12_NC + - Offset: 0x0000000000000078 + Type: R_AARCH64_MOVW_PREL_G0 + - Offset: 0x000000000000007C + Type: R_AARCH64_MOVW_PREL_G0_NC + - Offset: 0x0000000000000080 + Type: R_AARCH64_MOVW_PREL_G1 + - Offset: 0x0000000000000084 + Type: R_AARCH64_MOVW_PREL_G1_NC + - Offset: 0x0000000000000088 + Type: R_AARCH64_MOVW_PREL_G2 + - Offset: 0x000000000000008C + Type: R_AARCH64_MOVW_PREL_G2_NC + - Offset: 0x0000000000000090 + Type: R_AARCH64_MOVW_PREL_G3 + - Offset: 0x0000000000000094 + Type: R_AARCH64_LDST128_ABS_LO12_NC + - Offset: 0x0000000000000098 + Type: R_AARCH64_MOVW_GOTOFF_G0 + - Offset: 0x000000000000009C + Type: R_AARCH64_MOVW_GOTOFF_G0_NC + - Offset: 0x00000000000000A0 + Type: R_AARCH64_MOVW_GOTOFF_G1 + - Offset: 0x00000000000000A4 + Type: R_AARCH64_MOVW_GOTOFF_G1_NC + - Offset: 0x00000000000000A8 + Type: R_AARCH64_MOVW_GOTOFF_G2 + - Offset: 0x00000000000000AC + Type: R_AARCH64_MOVW_GOTOFF_G2_NC + - Offset: 0x00000000000000B0 + Type: R_AARCH64_MOVW_GOTOFF_G3 + - Offset: 0x00000000000000B4 + Type: R_AARCH64_GOTREL64 + - Offset: 0x00000000000000B8 + Type: R_AARCH64_GOTREL32 + - Offset: 0x00000000000000BC + Type: R_AARCH64_GOT_LD_PREL19 + - Offset: 0x00000000000000C0 + Type: R_AARCH64_LD64_GOTOFF_LO15 + - Offset: 0x00000000000000C4 + Type: R_AARCH64_ADR_GOT_PAGE + - Offset: 0x00000000000000C8 + Type: R_AARCH64_LD64_GOT_LO12_NC + - Offset: 0x00000000000000CC + Type: R_AARCH64_LD64_GOTPAGE_LO15 + - Offset: 0x00000000000000D0 + Type: R_AARCH64_TLSGD_ADR_PREL21 + - Offset: 0x00000000000000D4 + Type: R_AARCH64_TLSGD_ADR_PAGE21 + - Offset: 0x00000000000000D8 + Type: R_AARCH64_TLSGD_ADD_LO12_NC + - Offset: 0x00000000000000DC + Type: R_AARCH64_TLSGD_MOVW_G1 + - Offset: 0x00000000000000E0 + Type: R_AARCH64_TLSGD_MOVW_G0_NC + - Offset: 0x00000000000000E4 + Type: R_AARCH64_TLSLD_ADR_PREL21 + - Offset: 0x00000000000000E8 + Type: R_AARCH64_TLSLD_ADR_PAGE21 + - Offset: 0x00000000000000EC + Type: R_AARCH64_TLSLD_ADD_LO12_NC + - Offset: 0x00000000000000F0 + Type: R_AARCH64_TLSLD_MOVW_G1 + - Offset: 0x00000000000000F4 + Type: R_AARCH64_TLSLD_MOVW_G0_NC + - Offset: 0x00000000000000F8 + Type: R_AARCH64_TLSLD_LD_PREL19 + - Offset: 0x00000000000000FC + Type: R_AARCH64_TLSLD_MOVW_DTPREL_G2 + - Offset: 0x0000000000000100 + Type: R_AARCH64_TLSLD_MOVW_DTPREL_G1 + - Offset: 0x0000000000000104 + Type: R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC + - Offset: 0x0000000000000108 + Type: R_AARCH64_TLSLD_MOVW_DTPREL_G0 + - Offset: 0x000000000000010C + Type: R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC + - Offset: 0x0000000000000110 + Type: R_AARCH64_TLSLD_ADD_DTPREL_HI12 + - Offset: 0x0000000000000114 + Type: R_AARCH64_TLSLD_ADD_DTPREL_LO12 + - Offset: 0x0000000000000118 + Type: R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC + - Offset: 0x000000000000011C + Type: R_AARCH64_TLSLD_LDST8_DTPREL_LO12 + - Offset: 0x0000000000000120 + Type: R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC + - Offset: 0x0000000000000124 + Type: R_AARCH64_TLSLD_LDST16_DTPREL_LO12 + - Offset: 0x0000000000000128 + Type: R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC + - Offset: 0x000000000000012C + Type: R_AARCH64_TLSLD_LDST32_DTPREL_LO12 + - Offset: 0x0000000000000130 + Type: R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC + - Offset: 0x0000000000000134 + Type: R_AARCH64_TLSLD_LDST64_DTPREL_LO12 + - Offset: 0x0000000000000138 + Type: R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC + - Offset: 0x000000000000013C + Type: R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 + - Offset: 0x0000000000000140 + Type: R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC + - Offset: 0x0000000000000144 + Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 + - Offset: 0x0000000000000148 + Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC + - Offset: 0x000000000000014C + Type: R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 + - Offset: 0x0000000000000150 + Type: R_AARCH64_TLSLE_MOVW_TPREL_G2 + - Offset: 0x0000000000000154 + Type: R_AARCH64_TLSLE_MOVW_TPREL_G1 + - Offset: 0x0000000000000158 + Type: R_AARCH64_TLSLE_MOVW_TPREL_G1_NC + - Offset: 0x000000000000015C + Type: R_AARCH64_TLSLE_MOVW_TPREL_G0 + - Offset: 0x0000000000000160 + Type: R_AARCH64_TLSLE_MOVW_TPREL_G0_NC + - Offset: 0x0000000000000164 + Type: R_AARCH64_TLSLE_ADD_TPREL_HI12 + - Offset: 0x0000000000000168 + Type: R_AARCH64_TLSLE_ADD_TPREL_LO12 + - Offset: 0x000000000000016C + Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC + - Offset: 0x0000000000000170 + Type: R_AARCH64_TLSLE_LDST8_TPREL_LO12 + - Offset: 0x0000000000000174 + Type: R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC + - Offset: 0x0000000000000178 + Type: R_AARCH64_TLSLE_LDST16_TPREL_LO12 + - Offset: 0x000000000000017C + Type: R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC + - Offset: 0x0000000000000180 + Type: R_AARCH64_TLSLE_LDST32_TPREL_LO12 + - Offset: 0x0000000000000184 + Type: R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC + - Offset: 0x0000000000000188 + Type: R_AARCH64_TLSLE_LDST64_TPREL_LO12 + - Offset: 0x000000000000018C + Type: R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC + - Offset: 0x0000000000000190 + Type: R_AARCH64_TLSDESC_LD_PREL19 + - Offset: 0x0000000000000194 + Type: R_AARCH64_TLSDESC_ADR_PREL21 + - Offset: 0x0000000000000198 + Type: R_AARCH64_TLSDESC_ADR_PAGE21 + - Offset: 0x000000000000019C + Type: R_AARCH64_TLSDESC_LD64_LO12 + - Offset: 0x00000000000001A0 + Type: R_AARCH64_TLSDESC_ADD_LO12 + - Offset: 0x00000000000001A4 + Type: R_AARCH64_TLSDESC_OFF_G1 + - Offset: 0x00000000000001A8 + Type: R_AARCH64_TLSDESC_OFF_G0_NC + - Offset: 0x00000000000001AC + Type: R_AARCH64_TLSDESC_LDR + - Offset: 0x00000000000001B0 + Type: R_AARCH64_TLSDESC_ADD + - Offset: 0x00000000000001B4 + Type: R_AARCH64_TLSDESC_CALL + - Offset: 0x00000000000001B8 + Type: R_AARCH64_TLSLE_LDST128_TPREL_LO12 + - Offset: 0x00000000000001BC + Type: R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC + - Offset: 0x00000000000001C0 + Type: R_AARCH64_TLSLD_LDST128_DTPREL_LO12 + - Offset: 0x00000000000001C4 + Type: R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC + - Offset: 0x00000000000001C8 + Type: R_AARCH64_COPY + - Offset: 0x00000000000001CC + Type: R_AARCH64_GLOB_DAT + - Offset: 0x00000000000001D0 + Type: R_AARCH64_JUMP_SLOT + - Offset: 0x00000000000001D4 + Type: R_AARCH64_RELATIVE + - Offset: 0x00000000000001D8 + Type: R_AARCH64_TLS_DTPMOD64 + - Offset: 0x00000000000001DC + Type: R_AARCH64_TLS_DTPREL64 + - Offset: 0x00000000000001E0 + Type: R_AARCH64_TLS_TPREL64 + - Offset: 0x00000000000001E4 + Type: R_AARCH64_TLSDESC + - Offset: 0x00000000000001E8 + Type: R_AARCH64_IRELATIVE diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-arm.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-arm.test new file mode 100644 index 00000000000..ac6bda68587 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-arm.test @@ -0,0 +1,419 @@ +## Test that llvm-readobj/llvm-readelf shows proper relocation type +## names and values for arm target. + +# RUN: yaml2obj %s -o %t-arm.o +# RUN: llvm-readobj -r --expand-relocs %t-arm.o | FileCheck %s + +# CHECK: Type: R_ARM_NONE (0) +# CHECK: Type: R_ARM_PC24 (1) +# CHECK: Type: R_ARM_ABS32 (2) +# CHECK: Type: R_ARM_REL32 (3) +# CHECK: Type: R_ARM_LDR_PC_G0 (4) +# CHECK: Type: R_ARM_ABS16 (5) +# CHECK: Type: R_ARM_ABS12 (6) +# CHECK: Type: R_ARM_THM_ABS5 (7) +# CHECK: Type: R_ARM_ABS8 (8) +# CHECK: Type: R_ARM_SBREL32 (9) +# CHECK: Type: R_ARM_THM_CALL (10) +# CHECK: Type: R_ARM_THM_PC8 (11) +# CHECK: Type: R_ARM_BREL_ADJ (12) +# CHECK: Type: R_ARM_TLS_DESC (13) +# CHECK: Type: R_ARM_THM_SWI8 (14) +# CHECK: Type: R_ARM_XPC25 (15) +# CHECK: Type: R_ARM_THM_XPC22 (16) +# CHECK: Type: R_ARM_TLS_DTPMOD32 (17) +# CHECK: Type: R_ARM_TLS_DTPOFF32 (18) +# CHECK: Type: R_ARM_TLS_TPOFF32 (19) +# CHECK: Type: R_ARM_COPY (20) +# CHECK: Type: R_ARM_GLOB_DAT (21) +# CHECK: Type: R_ARM_JUMP_SLOT (22) +# CHECK: Type: R_ARM_RELATIVE (23) +# CHECK: Type: R_ARM_GOTOFF32 (24) +# CHECK: Type: R_ARM_BASE_PREL (25) +# CHECK: Type: R_ARM_GOT_BREL (26) +# CHECK: Type: R_ARM_CALL (28) +# CHECK: Type: R_ARM_JUMP24 (29) +# CHECK: Type: R_ARM_THM_JUMP24 (30) +# CHECK: Type: R_ARM_BASE_ABS (31) +# CHECK: Type: R_ARM_ALU_PCREL_7_0 (32) +# CHECK: Type: R_ARM_ALU_PCREL_15_8 (33) +# CHECK: Type: R_ARM_ALU_PCREL_23_15 (34) +# CHECK: Type: R_ARM_LDR_SBREL_11_0_NC (35) +# CHECK: Type: R_ARM_ALU_SBREL_19_12_NC (36) +# CHECK: Type: R_ARM_ALU_SBREL_27_20_CK (37) +# CHECK: Type: R_ARM_TARGET1 (38) +# CHECK: Type: R_ARM_SBREL31 (39) +# CHECK: Type: R_ARM_V4BX (40) +# CHECK: Type: R_ARM_TARGET2 (41) +# CHECK: Type: R_ARM_PREL31 (42) +# CHECK: Type: R_ARM_MOVW_ABS_NC (43) +# CHECK: Type: R_ARM_MOVT_ABS (44) +# CHECK: Type: R_ARM_MOVW_PREL_NC (45) +# CHECK: Type: R_ARM_MOVT_PREL (46) +# CHECK: Type: R_ARM_THM_MOVW_ABS_NC (47) +# CHECK: Type: R_ARM_THM_MOVT_ABS (48) +# CHECK: Type: R_ARM_THM_MOVW_PREL_NC (49) +# CHECK: Type: R_ARM_THM_MOVT_PREL (50) +# CHECK: Type: R_ARM_THM_JUMP19 (51) +# CHECK: Type: R_ARM_THM_JUMP6 (52) +# CHECK: Type: R_ARM_THM_ALU_PREL_11_0 (53) +# CHECK: Type: R_ARM_THM_PC12 (54) +# CHECK: Type: R_ARM_ABS32_NOI (55) +# CHECK: Type: R_ARM_REL32_NOI (56) +# CHECK: Type: R_ARM_ALU_PC_G0_NC (57) +# CHECK: Type: R_ARM_ALU_PC_G0 (58) +# CHECK: Type: R_ARM_ALU_PC_G1_NC (59) +# CHECK: Type: R_ARM_ALU_PC_G1 (60) +# CHECK: Type: R_ARM_ALU_PC_G2 (61) +# CHECK: Type: R_ARM_LDR_PC_G1 (62) +# CHECK: Type: R_ARM_LDR_PC_G2 (63) +# CHECK: Type: R_ARM_LDRS_PC_G0 (64) +# CHECK: Type: R_ARM_LDRS_PC_G1 (65) +# CHECK: Type: R_ARM_LDRS_PC_G2 (66) +# CHECK: Type: R_ARM_LDC_PC_G0 (67) +# CHECK: Type: R_ARM_LDC_PC_G1 (68) +# CHECK: Type: R_ARM_LDC_PC_G2 (69) +# CHECK: Type: R_ARM_ALU_SB_G0_NC (70) +# CHECK: Type: R_ARM_ALU_SB_G0 (71) +# CHECK: Type: R_ARM_ALU_SB_G1_NC (72) +# CHECK: Type: R_ARM_ALU_SB_G1 (73) +# CHECK: Type: R_ARM_ALU_SB_G2 (74) +# CHECK: Type: R_ARM_LDR_SB_G0 (75) +# CHECK: Type: R_ARM_LDR_SB_G1 (76) +# CHECK: Type: R_ARM_LDR_SB_G2 (77) +# CHECK: Type: R_ARM_LDRS_SB_G0 (78) +# CHECK: Type: R_ARM_LDRS_SB_G1 (79) +# CHECK: Type: R_ARM_LDRS_SB_G2 (80) +# CHECK: Type: R_ARM_LDC_SB_G0 (81) +# CHECK: Type: R_ARM_LDC_SB_G1 (82) +# CHECK: Type: R_ARM_LDC_SB_G2 (83) +# CHECK: Type: R_ARM_MOVW_BREL_NC (84) +# CHECK: Type: R_ARM_MOVT_BREL (85) +# CHECK: Type: R_ARM_MOVW_BREL (86) +# CHECK: Type: R_ARM_THM_MOVW_BREL_NC (87) +# CHECK: Type: R_ARM_THM_MOVT_BREL (88) +# CHECK: Type: R_ARM_THM_MOVW_BREL (89) +# CHECK: Type: R_ARM_TLS_GOTDESC (90) +# CHECK: Type: R_ARM_TLS_CALL (91) +# CHECK: Type: R_ARM_TLS_DESCSEQ (92) +# CHECK: Type: R_ARM_THM_TLS_CALL (93) +# CHECK: Type: R_ARM_PLT32_ABS (94) +# CHECK: Type: R_ARM_GOT_ABS (95) +# CHECK: Type: R_ARM_GOT_PREL (96) +# CHECK: Type: R_ARM_GOT_BREL12 (97) +# CHECK: Type: R_ARM_GOTOFF12 (98) +# CHECK: Type: R_ARM_GOTRELAX (99) +# CHECK: Type: R_ARM_GNU_VTENTRY (100) +# CHECK: Type: R_ARM_GNU_VTINHERIT (101) +# CHECK: Type: R_ARM_THM_JUMP11 (102) +# CHECK: Type: R_ARM_THM_JUMP8 (103) +# CHECK: Type: R_ARM_TLS_GD32 (104) +# CHECK: Type: R_ARM_TLS_LDM32 (105) +# CHECK: Type: R_ARM_TLS_LDO32 (106) +# CHECK: Type: R_ARM_TLS_IE32 (107) +# CHECK: Type: R_ARM_TLS_LE32 (108) +# CHECK: Type: R_ARM_TLS_LDO12 (109) +# CHECK: Type: R_ARM_TLS_LE12 (110) +# CHECK: Type: R_ARM_TLS_IE12GP (111) +# CHECK: Type: R_ARM_PRIVATE_0 (112) +# CHECK: Type: R_ARM_PRIVATE_1 (113) +# CHECK: Type: R_ARM_PRIVATE_2 (114) +# CHECK: Type: R_ARM_PRIVATE_3 (115) +# CHECK: Type: R_ARM_PRIVATE_4 (116) +# CHECK: Type: R_ARM_PRIVATE_5 (117) +# CHECK: Type: R_ARM_PRIVATE_6 (118) +# CHECK: Type: R_ARM_PRIVATE_7 (119) +# CHECK: Type: R_ARM_PRIVATE_8 (120) +# CHECK: Type: R_ARM_PRIVATE_9 (121) +# CHECK: Type: R_ARM_PRIVATE_10 (122) +# CHECK: Type: R_ARM_PRIVATE_11 (123) +# CHECK: Type: R_ARM_PRIVATE_12 (124) +# CHECK: Type: R_ARM_PRIVATE_13 (125) +# CHECK: Type: R_ARM_PRIVATE_14 (126) +# CHECK: Type: R_ARM_PRIVATE_15 (127) +# CHECK: Type: R_ARM_ME_TOO (128) +# CHECK: Type: R_ARM_THM_TLS_DESCSEQ16 (129) +# CHECK: Type: R_ARM_THM_TLS_DESCSEQ32 (130) +# CHECK: Type: R_ARM_IRELATIVE (160) + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_ARM + Flags: [ EF_ARM_EABI_VER5 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Content: 00 + - Name: .rel.text + Type: SHT_REL + AddressAlign: 0x0000000000000004 + EntSize: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Type: R_ARM_NONE + - Offset: 0x0000000000000004 + Type: R_ARM_PC24 + - Offset: 0x0000000000000008 + Type: R_ARM_ABS32 + - Offset: 0x000000000000000C + Type: R_ARM_REL32 + - Offset: 0x0000000000000010 + Type: R_ARM_LDR_PC_G0 + - Offset: 0x0000000000000014 + Type: R_ARM_ABS16 + - Offset: 0x0000000000000018 + Type: R_ARM_ABS12 + - Offset: 0x000000000000001C + Type: R_ARM_THM_ABS5 + - Offset: 0x0000000000000020 + Type: R_ARM_ABS8 + - Offset: 0x0000000000000024 + Type: R_ARM_SBREL32 + - Offset: 0x0000000000000028 + Type: R_ARM_THM_CALL + - Offset: 0x000000000000002C + Type: R_ARM_THM_PC8 + - Offset: 0x0000000000000030 + Type: R_ARM_BREL_ADJ + - Offset: 0x0000000000000034 + Type: R_ARM_TLS_DESC + - Offset: 0x0000000000000038 + Type: R_ARM_THM_SWI8 + - Offset: 0x000000000000003C + Type: R_ARM_XPC25 + - Offset: 0x0000000000000040 + Type: R_ARM_THM_XPC22 + - Offset: 0x0000000000000044 + Type: R_ARM_TLS_DTPMOD32 + - Offset: 0x0000000000000048 + Type: R_ARM_TLS_DTPOFF32 + - Offset: 0x000000000000004C + Type: R_ARM_TLS_TPOFF32 + - Offset: 0x0000000000000050 + Type: R_ARM_COPY + - Offset: 0x0000000000000054 + Type: R_ARM_GLOB_DAT + - Offset: 0x0000000000000058 + Type: R_ARM_JUMP_SLOT + - Offset: 0x000000000000005C + Type: R_ARM_RELATIVE + - Offset: 0x0000000000000060 + Type: R_ARM_GOTOFF32 + - Offset: 0x0000000000000064 + Type: R_ARM_BASE_PREL + - Offset: 0x0000000000000068 + Type: R_ARM_GOT_BREL + - Offset: 0x000000000000006C + Type: R_ARM_PLT32 + - Offset: 0x0000000000000070 + Type: R_ARM_CALL + - Offset: 0x0000000000000074 + Type: R_ARM_JUMP24 + - Offset: 0x0000000000000078 + Type: R_ARM_THM_JUMP24 + - Offset: 0x000000000000007C + Type: R_ARM_BASE_ABS + - Offset: 0x0000000000000080 + Type: R_ARM_ALU_PCREL_7_0 + - Offset: 0x0000000000000084 + Type: R_ARM_ALU_PCREL_15_8 + - Offset: 0x0000000000000088 + Type: R_ARM_ALU_PCREL_23_15 + - Offset: 0x000000000000008C + Type: R_ARM_LDR_SBREL_11_0_NC + - Offset: 0x0000000000000090 + Type: R_ARM_ALU_SBREL_19_12_NC + - Offset: 0x0000000000000094 + Type: R_ARM_ALU_SBREL_27_20_CK + - Offset: 0x0000000000000098 + Type: R_ARM_TARGET1 + - Offset: 0x000000000000009C + Type: R_ARM_SBREL31 + - Offset: 0x00000000000000A0 + Type: R_ARM_V4BX + - Offset: 0x00000000000000A4 + Type: R_ARM_TARGET2 + - Offset: 0x00000000000000A8 + Type: R_ARM_PREL31 + - Offset: 0x00000000000000AC + Type: R_ARM_MOVW_ABS_NC + - Offset: 0x00000000000000B0 + Type: R_ARM_MOVT_ABS + - Offset: 0x00000000000000B4 + Type: R_ARM_MOVW_PREL_NC + - Offset: 0x00000000000000B8 + Type: R_ARM_MOVT_PREL + - Offset: 0x00000000000000BC + Type: R_ARM_THM_MOVW_ABS_NC + - Offset: 0x00000000000000C0 + Type: R_ARM_THM_MOVT_ABS + - Offset: 0x00000000000000C4 + Type: R_ARM_THM_MOVW_PREL_NC + - Offset: 0x00000000000000C8 + Type: R_ARM_THM_MOVT_PREL + - Offset: 0x00000000000000CC + Type: R_ARM_THM_JUMP19 + - Offset: 0x00000000000000D0 + Type: R_ARM_THM_JUMP6 + - Offset: 0x00000000000000D4 + Type: R_ARM_THM_ALU_PREL_11_0 + - Offset: 0x00000000000000D8 + Type: R_ARM_THM_PC12 + - Offset: 0x00000000000000DC + Type: R_ARM_ABS32_NOI + - Offset: 0x00000000000000E0 + Type: R_ARM_REL32_NOI + - Offset: 0x00000000000000E4 + Type: R_ARM_ALU_PC_G0_NC + - Offset: 0x00000000000000E8 + Type: R_ARM_ALU_PC_G0 + - Offset: 0x00000000000000EC + Type: R_ARM_ALU_PC_G1_NC + - Offset: 0x00000000000000F0 + Type: R_ARM_ALU_PC_G1 + - Offset: 0x00000000000000F4 + Type: R_ARM_ALU_PC_G2 + - Offset: 0x00000000000000F8 + Type: R_ARM_LDR_PC_G1 + - Offset: 0x00000000000000FC + Type: R_ARM_LDR_PC_G2 + - Offset: 0x0000000000000100 + Type: R_ARM_LDRS_PC_G0 + - Offset: 0x0000000000000104 + Type: R_ARM_LDRS_PC_G1 + - Offset: 0x0000000000000108 + Type: R_ARM_LDRS_PC_G2 + - Offset: 0x000000000000010C + Type: R_ARM_LDC_PC_G0 + - Offset: 0x0000000000000110 + Type: R_ARM_LDC_PC_G1 + - Offset: 0x0000000000000114 + Type: R_ARM_LDC_PC_G2 + - Offset: 0x0000000000000118 + Type: R_ARM_ALU_SB_G0_NC + - Offset: 0x000000000000011C + Type: R_ARM_ALU_SB_G0 + - Offset: 0x0000000000000120 + Type: R_ARM_ALU_SB_G1_NC + - Offset: 0x0000000000000124 + Type: R_ARM_ALU_SB_G1 + - Offset: 0x0000000000000128 + Type: R_ARM_ALU_SB_G2 + - Offset: 0x000000000000012C + Type: R_ARM_LDR_SB_G0 + - Offset: 0x0000000000000130 + Type: R_ARM_LDR_SB_G1 + - Offset: 0x0000000000000134 + Type: R_ARM_LDR_SB_G2 + - Offset: 0x0000000000000138 + Type: R_ARM_LDRS_SB_G0 + - Offset: 0x000000000000013C + Type: R_ARM_LDRS_SB_G1 + - Offset: 0x0000000000000140 + Type: R_ARM_LDRS_SB_G2 + - Offset: 0x0000000000000144 + Type: R_ARM_LDC_SB_G0 + - Offset: 0x0000000000000148 + Type: R_ARM_LDC_SB_G1 + - Offset: 0x000000000000014C + Type: R_ARM_LDC_SB_G2 + - Offset: 0x0000000000000150 + Type: R_ARM_MOVW_BREL_NC + - Offset: 0x0000000000000154 + Type: R_ARM_MOVT_BREL + - Offset: 0x0000000000000158 + Type: R_ARM_MOVW_BREL + - Offset: 0x000000000000015C + Type: R_ARM_THM_MOVW_BREL_NC + - Offset: 0x0000000000000160 + Type: R_ARM_THM_MOVT_BREL + - Offset: 0x0000000000000164 + Type: R_ARM_THM_MOVW_BREL + - Offset: 0x0000000000000168 + Type: R_ARM_TLS_GOTDESC + - Offset: 0x000000000000016C + Type: R_ARM_TLS_CALL + - Offset: 0x0000000000000170 + Type: R_ARM_TLS_DESCSEQ + - Offset: 0x0000000000000174 + Type: R_ARM_THM_TLS_CALL + - Offset: 0x0000000000000178 + Type: R_ARM_PLT32_ABS + - Offset: 0x000000000000017C + Type: R_ARM_GOT_ABS + - Offset: 0x0000000000000180 + Type: R_ARM_GOT_PREL + - Offset: 0x0000000000000184 + Type: R_ARM_GOT_BREL12 + - Offset: 0x0000000000000188 + Type: R_ARM_GOTOFF12 + - Offset: 0x000000000000018C + Type: R_ARM_GOTRELAX + - Offset: 0x0000000000000190 + Type: R_ARM_GNU_VTENTRY + - Offset: 0x0000000000000194 + Type: R_ARM_GNU_VTINHERIT + - Offset: 0x0000000000000198 + Type: R_ARM_THM_JUMP11 + - Offset: 0x000000000000019C + Type: R_ARM_THM_JUMP8 + - Offset: 0x00000000000001A0 + Type: R_ARM_TLS_GD32 + - Offset: 0x00000000000001A4 + Type: R_ARM_TLS_LDM32 + - Offset: 0x00000000000001A8 + Type: R_ARM_TLS_LDO32 + - Offset: 0x00000000000001AC + Type: R_ARM_TLS_IE32 + - Offset: 0x00000000000001B0 + Type: R_ARM_TLS_LE32 + - Offset: 0x00000000000001B4 + Type: R_ARM_TLS_LDO12 + - Offset: 0x00000000000001B8 + Type: R_ARM_TLS_LE12 + - Offset: 0x00000000000001BC + Type: R_ARM_TLS_IE12GP + - Offset: 0x00000000000001C0 + Type: R_ARM_PRIVATE_0 + - Offset: 0x00000000000001C4 + Type: R_ARM_PRIVATE_1 + - Offset: 0x00000000000001C8 + Type: R_ARM_PRIVATE_2 + - Offset: 0x00000000000001CC + Type: R_ARM_PRIVATE_3 + - Offset: 0x00000000000001D0 + Type: R_ARM_PRIVATE_4 + - Offset: 0x00000000000001D4 + Type: R_ARM_PRIVATE_5 + - Offset: 0x00000000000001D8 + Type: R_ARM_PRIVATE_6 + - Offset: 0x00000000000001DC + Type: R_ARM_PRIVATE_7 + - Offset: 0x00000000000001E0 + Type: R_ARM_PRIVATE_8 + - Offset: 0x00000000000001E4 + Type: R_ARM_PRIVATE_9 + - Offset: 0x00000000000001E8 + Type: R_ARM_PRIVATE_10 + - Offset: 0x00000000000001EC + Type: R_ARM_PRIVATE_11 + - Offset: 0x00000000000001F0 + Type: R_ARM_PRIVATE_12 + - Offset: 0x00000000000001F4 + Type: R_ARM_PRIVATE_13 + - Offset: 0x00000000000001F8 + Type: R_ARM_PRIVATE_14 + - Offset: 0x00000000000001FC + Type: R_ARM_PRIVATE_15 + - Offset: 0x0000000000000200 + Type: R_ARM_ME_TOO + - Offset: 0x0000000000000204 + Type: R_ARM_THM_TLS_DESCSEQ16 + - Offset: 0x0000000000000208 + Type: R_ARM_THM_TLS_DESCSEQ32 + - Offset: 0x000000000000020C + Type: R_ARM_IRELATIVE diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-i386.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-i386.test new file mode 100644 index 00000000000..8606f3fa8cb --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-i386.test @@ -0,0 +1,237 @@ +## Test that llvm-readobj/llvm-readelf shows proper relocation type +## names and values for i386 target. + +# RUN: yaml2obj %s -o %t-i386.o +# RUN: llvm-readobj -r --expand-relocs %t-i386.o | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf -r --expand-relocs %t-i386.o | FileCheck %s --check-prefix=GNU + +# LLVM: Type: R_386_NONE (0) +# LLVM: Type: R_386_32 (1) +# LLVM: Type: R_386_PC32 (2) +# LLVM: Type: R_386_GOT32 (3) +# LLVM: Type: R_386_PLT32 (4) +# LLVM: Type: R_386_COPY (5) +# LLVM: Type: R_386_GLOB_DAT (6) +# LLVM: Type: R_386_JUMP_SLOT (7) +# LLVM: Type: R_386_RELATIVE (8) +# LLVM: Type: R_386_GOTOFF (9) +# LLVM: Type: R_386_GOTPC (10) +# LLVM: Type: R_386_32PLT (11) +# LLVM: Type: R_386_TLS_TPOFF (14) +# LLVM: Type: R_386_TLS_IE (15) +# LLVM: Type: R_386_TLS_GOTIE (16) +# LLVM: Type: R_386_TLS_LE (17) +# LLVM: Type: R_386_TLS_GD (18) +# LLVM: Type: R_386_TLS_LDM (19) +# LLVM: Type: R_386_16 (20) +# LLVM: Type: R_386_PC16 (21) +# LLVM: Type: R_386_8 (22) +# LLVM: Type: R_386_PC8 (23) +# LLVM: Type: R_386_TLS_GD_32 (24) +# LLVM: Type: R_386_TLS_GD_PUSH (25) +# LLVM: Type: R_386_TLS_GD_CALL (26) +# LLVM: Type: R_386_TLS_GD_POP (27) +# LLVM: Type: R_386_TLS_LDM_32 (28) +# LLVM: Type: R_386_TLS_LDM_PUSH (29) +# LLVM: Type: R_386_TLS_LDM_CALL (30) +# LLVM: Type: R_386_TLS_LDM_POP (31) +# LLVM: Type: R_386_TLS_LDO_32 (32) +# LLVM: Type: R_386_TLS_IE_32 (33) +# LLVM: Type: R_386_TLS_LE_32 (34) +# LLVM: Type: R_386_TLS_DTPMOD32 (35) +# LLVM: Type: R_386_TLS_DTPOFF32 (36) +# LLVM: Type: R_386_TLS_TPOFF32 (37) +# LLVM: Type: R_386_TLS_GOTDESC (39) +# LLVM: Type: R_386_TLS_DESC_CALL (40) +# LLVM: Type: R_386_TLS_DESC (41) +# LLVM: Type: R_386_IRELATIVE (42) +# LLVM: Type: R_386_GOT32X (43) + +# GNU: Relocation section '.rel.text' at offset 0x38 contains 41 entries: +# GNU-NEXT: Offset Info Type Sym. Value Symbol's Name +# GNU-NEXT: 00000002 00000100 R_386_NONE 00000000 foo +# GNU-NEXT: 00000008 00000101 R_386_32 00000000 foo +# GNU-NEXT: 0000000e 00000102 R_386_PC32 00000000 foo +# GNU-NEXT: 00000014 00000103 R_386_GOT32 00000000 foo +# GNU-NEXT: 0000001a 00000104 R_386_PLT32 00000000 foo +# GNU-NEXT: 00000020 00000105 R_386_COPY 00000000 foo +# GNU-NEXT: 00000026 00000106 R_386_GLOB_DAT 00000000 foo +# GNU-NEXT: 0000002c 00000107 R_386_JUMP_SLOT 00000000 foo +# GNU-NEXT: 00000032 00000108 R_386_RELATIVE 00000000 foo +# GNU-NEXT: 00000038 00000109 R_386_GOTOFF 00000000 foo +# GNU-NEXT: 0000003e 0000010a R_386_GOTPC 00000000 foo +# GNU-NEXT: 00000044 0000010b R_386_32PLT 00000000 foo +# GNU-NEXT: 0000004a 0000010e R_386_TLS_TPOFF 00000000 foo +# GNU-NEXT: 00000050 0000010f R_386_TLS_IE 00000000 foo +# GNU-NEXT: 00000056 00000110 R_386_TLS_GOTIE 00000000 foo +# GNU-NEXT: 0000005c 00000111 R_386_TLS_LE 00000000 foo +# GNU-NEXT: 00000062 00000112 R_386_TLS_GD 00000000 foo +# GNU-NEXT: 00000068 00000113 R_386_TLS_LDM 00000000 foo +# GNU-NEXT: 0000006e 00000114 R_386_16 00000000 foo +# GNU-NEXT: 00000074 00000115 R_386_PC16 00000000 foo +# GNU-NEXT: 0000007a 00000116 R_386_8 00000000 foo +# GNU-NEXT: 00000080 00000117 R_386_PC8 00000000 foo +# GNU-NEXT: 00000086 00000118 R_386_TLS_GD_32 00000000 foo +# GNU-NEXT: 0000008c 00000119 R_386_TLS_GD_PUSH 00000000 foo +# GNU-NEXT: 00000092 0000011a R_386_TLS_GD_CALL 00000000 foo +# GNU-NEXT: 00000098 0000011b R_386_TLS_GD_POP 00000000 foo +# GNU-NEXT: 0000009e 0000011c R_386_TLS_LDM_32 00000000 foo +# GNU-NEXT: 000000a4 0000011d R_386_TLS_LDM_PUSH 00000000 foo +# GNU-NEXT: 000000aa 0000011e R_386_TLS_LDM_CALL 00000000 foo +# GNU-NEXT: 000000b0 0000011f R_386_TLS_LDM_POP 00000000 foo +# GNU-NEXT: 000000b6 00000120 R_386_TLS_LDO_32 00000000 foo +# GNU-NEXT: 000000bc 00000121 R_386_TLS_IE_32 00000000 foo +# GNU-NEXT: 000000c2 00000122 R_386_TLS_LE_32 00000000 foo +# GNU-NEXT: 000000c8 00000123 R_386_TLS_DTPMOD32 00000000 foo +# GNU-NEXT: 000000ce 00000124 R_386_TLS_DTPOFF32 00000000 foo +# GNU-NEXT: 000000d4 00000125 R_386_TLS_TPOFF32 00000000 foo +# GNU-NEXT: 000000da 00000127 R_386_TLS_GOTDESC 00000000 foo +# GNU-NEXT: 000000e0 00000128 R_386_TLS_DESC_CALL 00000000 foo +# GNU-NEXT: 000000e6 00000129 R_386_TLS_DESC 00000000 foo +# GNU-NEXT: 000000ec 0000012a R_386_IRELATIVE 00000000 foo +# GNU-NEXT: 000000f2 0000012b R_386_GOT32X 00000000 foo + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .text + Type: SHT_PROGBITS + Content: 00 + - Name: .rel.text + Type: SHT_REL + Link: .symtab + AddressAlign: 0x0000000000000004 + EntSize: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000002 + Type: R_386_NONE + Symbol: foo + - Offset: 0x0000000000000008 + Type: R_386_32 + Symbol: foo + - Offset: 0x000000000000000E + Type: R_386_PC32 + Symbol: foo + - Offset: 0x0000000000000014 + Type: R_386_GOT32 + Symbol: foo + - Offset: 0x000000000000001A + Type: R_386_PLT32 + Symbol: foo + - Offset: 0x0000000000000020 + Type: R_386_COPY + Symbol: foo + - Offset: 0x0000000000000026 + Type: R_386_GLOB_DAT + Symbol: foo + - Offset: 0x000000000000002C + Type: R_386_JUMP_SLOT + Symbol: foo + - Offset: 0x0000000000000032 + Type: R_386_RELATIVE + Symbol: foo + - Offset: 0x0000000000000038 + Type: R_386_GOTOFF + Symbol: foo + - Offset: 0x000000000000003E + Type: R_386_GOTPC + Symbol: foo + - Offset: 0x0000000000000044 + Type: R_386_32PLT + Symbol: foo + - Offset: 0x000000000000004A + Type: R_386_TLS_TPOFF + Symbol: foo + - Offset: 0x0000000000000050 + Type: R_386_TLS_IE + Symbol: foo + - Offset: 0x0000000000000056 + Type: R_386_TLS_GOTIE + Symbol: foo + - Offset: 0x000000000000005C + Type: R_386_TLS_LE + Symbol: foo + - Offset: 0x0000000000000062 + Type: R_386_TLS_GD + Symbol: foo + - Offset: 0x0000000000000068 + Type: R_386_TLS_LDM + Symbol: foo + - Offset: 0x000000000000006E + Type: R_386_16 + Symbol: foo + - Offset: 0x0000000000000074 + Type: R_386_PC16 + Symbol: foo + - Offset: 0x000000000000007A + Type: R_386_8 + Symbol: foo + - Offset: 0x0000000000000080 + Type: R_386_PC8 + Symbol: foo + - Offset: 0x0000000000000086 + Type: R_386_TLS_GD_32 + Symbol: foo + - Offset: 0x000000000000008C + Type: R_386_TLS_GD_PUSH + Symbol: foo + - Offset: 0x0000000000000092 + Type: R_386_TLS_GD_CALL + Symbol: foo + - Offset: 0x0000000000000098 + Type: R_386_TLS_GD_POP + Symbol: foo + - Offset: 0x000000000000009E + Type: R_386_TLS_LDM_32 + Symbol: foo + - Offset: 0x00000000000000A4 + Type: R_386_TLS_LDM_PUSH + Symbol: foo + - Offset: 0x00000000000000AA + Type: R_386_TLS_LDM_CALL + Symbol: foo + - Offset: 0x00000000000000B0 + Type: R_386_TLS_LDM_POP + Symbol: foo + - Offset: 0x00000000000000B6 + Type: R_386_TLS_LDO_32 + Symbol: foo + - Offset: 0x00000000000000BC + Type: R_386_TLS_IE_32 + Symbol: foo + - Offset: 0x00000000000000C2 + Type: R_386_TLS_LE_32 + Symbol: foo + - Offset: 0x00000000000000C8 + Type: R_386_TLS_DTPMOD32 + Symbol: foo + - Offset: 0x00000000000000CE + Type: R_386_TLS_DTPOFF32 + Symbol: foo + - Offset: 0x00000000000000D4 + Type: R_386_TLS_TPOFF32 + Symbol: foo + - Offset: 0x00000000000000DA + Type: R_386_TLS_GOTDESC + Symbol: foo + - Offset: 0x00000000000000E0 + Type: R_386_TLS_DESC_CALL + Symbol: foo + - Offset: 0x00000000000000E6 + Type: R_386_TLS_DESC + Symbol: foo + - Offset: 0x00000000000000EC + Type: R_386_IRELATIVE + Symbol: foo + - Offset: 0x00000000000000F2 + Type: R_386_GOT32X + Symbol: foo +Symbols: + - Name: foo + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-lanai.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-lanai.test new file mode 100644 index 00000000000..b5804c9aa57 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-lanai.test @@ -0,0 +1,46 @@ +## Test that llvm-readobj/llvm-readelf shows proper relocation type +## names and values for lanai target. + +# RUN: yaml2obj %s -o %t-lanai.o +# RUN: llvm-readobj -r --expand-relocs %t-lanai.o | FileCheck %s + +# CHECK: Type: R_LANAI_NONE (0) +# CHECK: Type: R_LANAI_21 (1) +# CHECK: Type: R_LANAI_21_F (2) +# CHECK: Type: R_LANAI_25 (3) +# CHECK: Type: R_LANAI_32 (4) +# CHECK: Type: R_LANAI_HI16 (5) +# CHECK: Type: R_LANAI_LO16 (6) + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_LANAI +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000004 + Content: 00 + - Name: .rela.text + Type: SHT_RELA + AddressAlign: 0x0000000000000004 + EntSize: 0x000000000000000C + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Type: R_LANAI_NONE + - Offset: 0x0000000000000004 + Type: R_LANAI_21 + - Offset: 0x0000000000000008 + Type: R_LANAI_21_F + - Offset: 0x000000000000000C + Type: R_LANAI_25 + - Offset: 0x0000000000000010 + Type: R_LANAI_32 + - Offset: 0x0000000000000014 + Type: R_LANAI_HI16 + - Offset: 0x0000000000000018 + Type: R_LANAI_LO16 diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips.test new file mode 100644 index 00000000000..16dfd2f77dd --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips.test @@ -0,0 +1,180 @@ +## Test that llvm-readobj/llvm-readelf shows proper relocation type +## names and values for mips target. + +# RUN: yaml2obj %s -o %t-mips.o +# RUN: llvm-readobj -r --expand-relocs %t-mips.o | FileCheck %s + +# CHECK: Type: R_MIPS_NONE (0) +# CHECK: Type: R_MIPS_16 (1) +# CHECK: Type: R_MIPS_32 (2) +# CHECK: Type: R_MIPS_REL32 (3) +# CHECK: Type: R_MIPS_26 (4) +# CHECK: Type: R_MIPS_HI16 (5) +# CHECK: Type: R_MIPS_LO16 (6) +# CHECK: Type: R_MIPS_GPREL16 (7) +# CHECK: Type: R_MIPS_LITERAL (8) +# CHECK: Type: R_MIPS_GOT16 (9) +# CHECK: Type: R_MIPS_PC16 (10) +# CHECK: Type: R_MIPS_CALL16 (11) +# CHECK: Type: R_MIPS_GPREL32 (12) +# CHECK: Type: R_MIPS_SHIFT5 (16) +# CHECK: Type: R_MIPS_SHIFT6 (17) +# CHECK: Type: R_MIPS_64 (18) +# CHECK: Type: R_MIPS_GOT_DISP (19) +# CHECK: Type: R_MIPS_GOT_PAGE (20) +# CHECK: Type: R_MIPS_GOT_OFST (21) +# CHECK: Type: R_MIPS_GOT_HI16 (22) +# CHECK: Type: R_MIPS_GOT_LO16 (23) +# CHECK: Type: R_MIPS_SUB (24) +# CHECK: Type: R_MIPS_INSERT_A (25) +# CHECK: Type: R_MIPS_INSERT_B (26) +# CHECK: Type: R_MIPS_DELETE (27) +# CHECK: Type: R_MIPS_HIGHER (28) +# CHECK: Type: R_MIPS_HIGHEST (29) +# CHECK: Type: R_MIPS_CALL_HI16 (30) +# CHECK: Type: R_MIPS_CALL_LO16 (31) +# CHECK: Type: R_MIPS_SCN_DISP (32) +# CHECK: Type: R_MIPS_REL16 (33) +# CHECK: Type: R_MIPS_ADD_IMMEDIATE (34) +# CHECK: Type: R_MIPS_PJUMP (35) +# CHECK: Type: R_MIPS_RELGOT (36) +# CHECK: Type: R_MIPS_JALR (37) +# CHECK: Type: R_MIPS_TLS_DTPMOD32 (38) +# CHECK: Type: R_MIPS_TLS_DTPREL32 (39) +# CHECK: Type: R_MIPS_TLS_DTPMOD64 (40) +# CHECK: Type: R_MIPS_TLS_DTPREL64 (41) +# CHECK: Type: R_MIPS_TLS_GD (42) +# CHECK: Type: R_MIPS_TLS_LDM (43) +# CHECK: Type: R_MIPS_TLS_DTPREL_HI16 (44) +# CHECK: Type: R_MIPS_TLS_DTPREL_LO16 (45) +# CHECK: Type: R_MIPS_TLS_GOTTPREL (46) +# CHECK: Type: R_MIPS_TLS_TPREL32 (47) +# CHECK: Type: R_MIPS_TLS_TPREL64 (48) +# CHECK: Type: R_MIPS_TLS_TPREL_HI16 (49) +# CHECK: Type: R_MIPS_TLS_TPREL_LO16 (50) +# CHECK: Type: R_MIPS_GLOB_DAT (51) +# CHECK: Type: R_MIPS_COPY (126) +# CHECK: Type: R_MIPS_JUMP_SLOT (127) +# CHECK: Type: R_MIPS_NUM (218) + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS +Sections: + - Name: .text + Type: SHT_PROGBITS + Content: 00 + - Name: .rel.text + Type: SHT_REL + AddressAlign: 0x0000000000000004 + EntSize: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Type: R_MIPS_NONE + - Offset: 0x0000000000000004 + Type: R_MIPS_16 + - Offset: 0x0000000000000008 + Type: R_MIPS_32 + - Offset: 0x000000000000000C + Type: R_MIPS_REL32 + - Offset: 0x0000000000000010 + Type: R_MIPS_26 + - Offset: 0x0000000000000014 + Type: R_MIPS_HI16 + - Offset: 0x0000000000000018 + Type: R_MIPS_LO16 + - Offset: 0x000000000000001C + Type: R_MIPS_GPREL16 + - Offset: 0x0000000000000020 + Type: R_MIPS_LITERAL + - Offset: 0x0000000000000024 + Type: R_MIPS_GOT16 + - Offset: 0x0000000000000028 + Type: R_MIPS_PC16 + - Offset: 0x000000000000002C + Type: R_MIPS_CALL16 + - Offset: 0x0000000000000030 + Type: R_MIPS_GPREL32 + - Offset: 0x0000000000000034 + Type: R_MIPS_SHIFT5 + - Offset: 0x0000000000000038 + Type: R_MIPS_SHIFT6 + - Offset: 0x000000000000003C + Type: R_MIPS_64 + - Offset: 0x0000000000000040 + Type: R_MIPS_GOT_DISP + - Offset: 0x0000000000000044 + Type: R_MIPS_GOT_PAGE + - Offset: 0x0000000000000048 + Type: R_MIPS_GOT_OFST + - Offset: 0x000000000000004C + Type: R_MIPS_GOT_HI16 + - Offset: 0x0000000000000050 + Type: R_MIPS_GOT_LO16 + - Offset: 0x0000000000000054 + Type: R_MIPS_SUB + - Offset: 0x0000000000000058 + Type: R_MIPS_INSERT_A + - Offset: 0x000000000000005C + Type: R_MIPS_INSERT_B + - Offset: 0x0000000000000060 + Type: R_MIPS_DELETE + - Offset: 0x0000000000000064 + Type: R_MIPS_HIGHER + - Offset: 0x0000000000000068 + Type: R_MIPS_HIGHEST + - Offset: 0x000000000000006C + Type: R_MIPS_CALL_HI16 + - Offset: 0x0000000000000070 + Type: R_MIPS_CALL_LO16 + - Offset: 0x0000000000000074 + Type: R_MIPS_SCN_DISP + - Offset: 0x0000000000000078 + Type: R_MIPS_REL16 + - Offset: 0x000000000000007C + Type: R_MIPS_ADD_IMMEDIATE + - Offset: 0x0000000000000080 + Type: R_MIPS_PJUMP + - Offset: 0x0000000000000084 + Type: R_MIPS_RELGOT + - Offset: 0x0000000000000088 + Type: R_MIPS_JALR + - Offset: 0x000000000000008C + Type: R_MIPS_TLS_DTPMOD32 + - Offset: 0x0000000000000090 + Type: R_MIPS_TLS_DTPREL32 + - Offset: 0x0000000000000094 + Type: R_MIPS_TLS_DTPMOD64 + - Offset: 0x0000000000000098 + Type: R_MIPS_TLS_DTPREL64 + - Offset: 0x000000000000009C + Type: R_MIPS_TLS_GD + - Offset: 0x00000000000000A0 + Type: R_MIPS_TLS_LDM + - Offset: 0x00000000000000A4 + Type: R_MIPS_TLS_DTPREL_HI16 + - Offset: 0x00000000000000A8 + Type: R_MIPS_TLS_DTPREL_LO16 + - Offset: 0x00000000000000AC + Type: R_MIPS_TLS_GOTTPREL + - Offset: 0x00000000000000B0 + Type: R_MIPS_TLS_TPREL32 + - Offset: 0x00000000000000B4 + Type: R_MIPS_TLS_TPREL64 + - Offset: 0x00000000000000B8 + Type: R_MIPS_TLS_TPREL_HI16 + - Offset: 0x00000000000000BC + Type: R_MIPS_TLS_TPREL_LO16 + - Offset: 0x00000000000000C0 + Type: R_MIPS_GLOB_DAT + - Offset: 0x00000000000000C4 + Type: R_MIPS_COPY + - Offset: 0x00000000000000C8 + Type: R_MIPS_JUMP_SLOT + - Offset: 0x00000000000000CC + Type: R_MIPS_NUM diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips64.test new file mode 100644 index 00000000000..f1fefb26974 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-mips64.test @@ -0,0 +1,282 @@ +## Test that llvm-readobj/llvm-readelf shows proper relocation type +## names and values for mips64 target. + +# RUN: yaml2obj %s -o %t-mips64.o +# RUN: llvm-readobj -r --expand-relocs %t-mips64.o | FileCheck %s + +# CHECK: Type: R_MIPS_NONE/R_MIPS_NONE/R_MIPS_NONE (0) +# CHECK: Type: R_MIPS_16/R_MIPS_16/R_MIPS_16 (65793) +# CHECK: Type: R_MIPS_32/R_MIPS_32/R_MIPS_32 (131586) +# CHECK: Type: R_MIPS_REL32/R_MIPS_REL32/R_MIPS_REL32 (197379) +# CHECK: Type: R_MIPS_26/R_MIPS_26/R_MIPS_26 (263172) +# CHECK: Type: R_MIPS_HI16/R_MIPS_HI16/R_MIPS_HI16 (328965) +# CHECK: Type: R_MIPS_LO16/R_MIPS_LO16/R_MIPS_LO16 (394758) +# CHECK: Type: R_MIPS_GPREL16/R_MIPS_GPREL16/R_MIPS_GPREL16 (460551) +# CHECK: Type: R_MIPS_LITERAL/R_MIPS_LITERAL/R_MIPS_LITERAL (526344) +# CHECK: Type: R_MIPS_GOT16/R_MIPS_GOT16/R_MIPS_GOT16 (592137) +# CHECK: Type: R_MIPS_PC16/R_MIPS_PC16/R_MIPS_PC16 (657930) +# CHECK: Type: R_MIPS_CALL16/R_MIPS_CALL16/R_MIPS_CALL16 (723723) +# CHECK: Type: R_MIPS_GPREL32/R_MIPS_GPREL32/R_MIPS_GPREL32 (789516) +# CHECK: Type: R_MIPS_SHIFT5/R_MIPS_SHIFT5/R_MIPS_SHIFT5 (1052688) +# CHECK: Type: R_MIPS_SHIFT6/R_MIPS_SHIFT6/R_MIPS_SHIFT6 (1118481) +# CHECK: Type: R_MIPS_64/R_MIPS_64/R_MIPS_64 (1184274) +# CHECK: Type: R_MIPS_GOT_DISP/R_MIPS_GOT_DISP/R_MIPS_GOT_DISP (1250067) +# CHECK: Type: R_MIPS_GOT_PAGE/R_MIPS_GOT_PAGE/R_MIPS_GOT_PAGE (1315860) +# CHECK: Type: R_MIPS_GOT_OFST/R_MIPS_GOT_OFST/R_MIPS_GOT_OFST (1381653) +# CHECK: Type: R_MIPS_GOT_HI16/R_MIPS_GOT_HI16/R_MIPS_GOT_HI16 (1447446) +# CHECK: Type: R_MIPS_GOT_LO16/R_MIPS_GOT_LO16/R_MIPS_GOT_LO16 (1513239) +# CHECK: Type: R_MIPS_SUB/R_MIPS_SUB/R_MIPS_SUB (1579032) +# CHECK: Type: R_MIPS_INSERT_A/R_MIPS_INSERT_A/R_MIPS_INSERT_A (1644825) +# CHECK: Type: R_MIPS_INSERT_B/R_MIPS_INSERT_B/R_MIPS_INSERT_B (1710618) +# CHECK: Type: R_MIPS_DELETE/R_MIPS_DELETE/R_MIPS_DELETE (1776411) +# CHECK: Type: R_MIPS_HIGHER/R_MIPS_HIGHER/R_MIPS_HIGHER (1842204) +# CHECK: Type: R_MIPS_HIGHEST/R_MIPS_HIGHEST/R_MIPS_HIGHEST (1907997) +# CHECK: Type: R_MIPS_CALL_HI16/R_MIPS_CALL_HI16/R_MIPS_CALL_HI16 (1973790) +# CHECK: Type: R_MIPS_CALL_LO16/R_MIPS_CALL_LO16/R_MIPS_CALL_LO16 (2039583) +# CHECK: Type: R_MIPS_SCN_DISP/R_MIPS_SCN_DISP/R_MIPS_SCN_DISP (2105376) +# CHECK: Type: R_MIPS_REL16/R_MIPS_REL16/R_MIPS_REL16 (2171169) +# CHECK: Type: R_MIPS_ADD_IMMEDIATE/R_MIPS_ADD_IMMEDIATE/R_MIPS_ADD_IMMEDIATE (2236962) +# CHECK: Type: R_MIPS_PJUMP/R_MIPS_PJUMP/R_MIPS_PJUMP (2302755) +# CHECK: Type: R_MIPS_RELGOT/R_MIPS_RELGOT/R_MIPS_RELGOT (2368548) +# CHECK: Type: R_MIPS_JALR/R_MIPS_JALR/R_MIPS_JALR (2434341) +# CHECK: Type: R_MIPS_TLS_DTPMOD32/R_MIPS_TLS_DTPMOD32/R_MIPS_TLS_DTPMOD32 (2500134) +# CHECK: Type: R_MIPS_TLS_DTPREL32/R_MIPS_TLS_DTPREL32/R_MIPS_TLS_DTPREL32 (2565927) +# CHECK: Type: R_MIPS_TLS_DTPMOD64/R_MIPS_TLS_DTPMOD64/R_MIPS_TLS_DTPMOD64 (2631720) +# CHECK: Type: R_MIPS_TLS_DTPREL64/R_MIPS_TLS_DTPREL64/R_MIPS_TLS_DTPREL64 (2697513) +# CHECK: Type: R_MIPS_TLS_GD/R_MIPS_TLS_GD/R_MIPS_TLS_GD (2763306) +# CHECK: Type: R_MIPS_TLS_LDM/R_MIPS_TLS_LDM/R_MIPS_TLS_LDM (2829099) +# CHECK: Type: R_MIPS_TLS_DTPREL_HI16/R_MIPS_TLS_DTPREL_HI16/R_MIPS_TLS_DTPREL_HI16 (2894892) +# CHECK: Type: R_MIPS_TLS_DTPREL_LO16/R_MIPS_TLS_DTPREL_LO16/R_MIPS_TLS_DTPREL_LO16 (2960685) +# CHECK: Type: R_MIPS_TLS_GOTTPREL/R_MIPS_TLS_GOTTPREL/R_MIPS_TLS_GOTTPREL (3026478) +# CHECK: Type: R_MIPS_TLS_TPREL32/R_MIPS_TLS_TPREL32/R_MIPS_TLS_TPREL32 (3092271) +# CHECK: Type: R_MIPS_TLS_TPREL64/R_MIPS_TLS_TPREL64/R_MIPS_TLS_TPREL64 (3158064) +# CHECK: Type: R_MIPS_TLS_TPREL_HI16/R_MIPS_TLS_TPREL_HI16/R_MIPS_TLS_TPREL_HI16 (3223857) +# CHECK: Type: R_MIPS_TLS_TPREL_LO16/R_MIPS_TLS_TPREL_LO16/R_MIPS_TLS_TPREL_LO16 (3289650) +# CHECK: Type: R_MIPS_GLOB_DAT/R_MIPS_GLOB_DAT/R_MIPS_GLOB_DAT (3355443) +# CHECK: Type: R_MIPS_COPY/R_MIPS_COPY/R_MIPS_COPY (8289918) +# CHECK: Type: R_MIPS_JUMP_SLOT/R_MIPS_JUMP_SLOT/R_MIPS_JUMP_SLOT (8355711) +# CHECK: Type: R_MIPS_NUM/R_MIPS_NUM/R_MIPS_NUM (14342874) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_MIPS +Sections: + - Name: .text + Type: SHT_PROGBITS + Content: 00 + - Name: .rela.text + Type: SHT_RELA + AddressAlign: 0x0000000000000008 + EntSize: 0x0000000000000018 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Type: R_MIPS_NONE + - Offset: 0x0000000000000004 + Type: R_MIPS_16 + Type2: R_MIPS_16 + Type3: R_MIPS_16 + - Offset: 0x0000000000000008 + Type: R_MIPS_32 + Type2: R_MIPS_32 + Type3: R_MIPS_32 + - Offset: 0x000000000000000C + Type: R_MIPS_REL32 + Type2: R_MIPS_REL32 + Type3: R_MIPS_REL32 + - Offset: 0x0000000000000010 + Type: R_MIPS_26 + Type2: R_MIPS_26 + Type3: R_MIPS_26 + - Offset: 0x0000000000000014 + Type: R_MIPS_HI16 + Type2: R_MIPS_HI16 + Type3: R_MIPS_HI16 + - Offset: 0x0000000000000018 + Type: R_MIPS_LO16 + Type2: R_MIPS_LO16 + Type3: R_MIPS_LO16 + - Offset: 0x000000000000001C + Type: R_MIPS_GPREL16 + Type2: R_MIPS_GPREL16 + Type3: R_MIPS_GPREL16 + - Offset: 0x0000000000000020 + Type: R_MIPS_LITERAL + Type2: R_MIPS_LITERAL + Type3: R_MIPS_LITERAL + - Offset: 0x0000000000000024 + Type: R_MIPS_GOT16 + Type2: R_MIPS_GOT16 + Type3: R_MIPS_GOT16 + - Offset: 0x0000000000000028 + Type: R_MIPS_PC16 + Type2: R_MIPS_PC16 + Type3: R_MIPS_PC16 + - Offset: 0x000000000000002C + Type: R_MIPS_CALL16 + Type2: R_MIPS_CALL16 + Type3: R_MIPS_CALL16 + - Offset: 0x0000000000000030 + Type: R_MIPS_GPREL32 + Type2: R_MIPS_GPREL32 + Type3: R_MIPS_GPREL32 + - Offset: 0x0000000000000034 + Type: R_MIPS_SHIFT5 + Type2: R_MIPS_SHIFT5 + Type3: R_MIPS_SHIFT5 + - Offset: 0x0000000000000038 + Type: R_MIPS_SHIFT6 + Type2: R_MIPS_SHIFT6 + Type3: R_MIPS_SHIFT6 + - Offset: 0x000000000000003C + Type: R_MIPS_64 + Type2: R_MIPS_64 + Type3: R_MIPS_64 + - Offset: 0x0000000000000040 + Type: R_MIPS_GOT_DISP + Type2: R_MIPS_GOT_DISP + Type3: R_MIPS_GOT_DISP + - Offset: 0x0000000000000044 + Type: R_MIPS_GOT_PAGE + Type2: R_MIPS_GOT_PAGE + Type3: R_MIPS_GOT_PAGE + - Offset: 0x0000000000000048 + Type: R_MIPS_GOT_OFST + Type2: R_MIPS_GOT_OFST + Type3: R_MIPS_GOT_OFST + - Offset: 0x000000000000004C + Type: R_MIPS_GOT_HI16 + Type2: R_MIPS_GOT_HI16 + Type3: R_MIPS_GOT_HI16 + - Offset: 0x0000000000000050 + Type: R_MIPS_GOT_LO16 + Type2: R_MIPS_GOT_LO16 + Type3: R_MIPS_GOT_LO16 + - Offset: 0x0000000000000054 + Type: R_MIPS_SUB + Type2: R_MIPS_SUB + Type3: R_MIPS_SUB + - Offset: 0x0000000000000058 + Type: R_MIPS_INSERT_A + Type2: R_MIPS_INSERT_A + Type3: R_MIPS_INSERT_A + - Offset: 0x000000000000005C + Type: R_MIPS_INSERT_B + Type2: R_MIPS_INSERT_B + Type3: R_MIPS_INSERT_B + - Offset: 0x0000000000000060 + Type: R_MIPS_DELETE + Type2: R_MIPS_DELETE + Type3: R_MIPS_DELETE + - Offset: 0x0000000000000064 + Type: R_MIPS_HIGHER + Type2: R_MIPS_HIGHER + Type3: R_MIPS_HIGHER + - Offset: 0x0000000000000068 + Type: R_MIPS_HIGHEST + Type2: R_MIPS_HIGHEST + Type3: R_MIPS_HIGHEST + - Offset: 0x000000000000006C + Type: R_MIPS_CALL_HI16 + Type2: R_MIPS_CALL_HI16 + Type3: R_MIPS_CALL_HI16 + - Offset: 0x0000000000000070 + Type: R_MIPS_CALL_LO16 + Type2: R_MIPS_CALL_LO16 + Type3: R_MIPS_CALL_LO16 + - Offset: 0x0000000000000074 + Type: R_MIPS_SCN_DISP + Type2: R_MIPS_SCN_DISP + Type3: R_MIPS_SCN_DISP + - Offset: 0x0000000000000078 + Type: R_MIPS_REL16 + Type2: R_MIPS_REL16 + Type3: R_MIPS_REL16 + - Offset: 0x000000000000007C + Type: R_MIPS_ADD_IMMEDIATE + Type2: R_MIPS_ADD_IMMEDIATE + Type3: R_MIPS_ADD_IMMEDIATE + - Offset: 0x0000000000000080 + Type: R_MIPS_PJUMP + Type2: R_MIPS_PJUMP + Type3: R_MIPS_PJUMP + - Offset: 0x0000000000000084 + Type: R_MIPS_RELGOT + Type2: R_MIPS_RELGOT + Type3: R_MIPS_RELGOT + - Offset: 0x0000000000000088 + Type: R_MIPS_JALR + Type2: R_MIPS_JALR + Type3: R_MIPS_JALR + - Offset: 0x000000000000008C + Type: R_MIPS_TLS_DTPMOD32 + Type2: R_MIPS_TLS_DTPMOD32 + Type3: R_MIPS_TLS_DTPMOD32 + - Offset: 0x0000000000000090 + Type: R_MIPS_TLS_DTPREL32 + Type2: R_MIPS_TLS_DTPREL32 + Type3: R_MIPS_TLS_DTPREL32 + - Offset: 0x0000000000000094 + Type: R_MIPS_TLS_DTPMOD64 + Type2: R_MIPS_TLS_DTPMOD64 + Type3: R_MIPS_TLS_DTPMOD64 + - Offset: 0x0000000000000098 + Type: R_MIPS_TLS_DTPREL64 + Type2: R_MIPS_TLS_DTPREL64 + Type3: R_MIPS_TLS_DTPREL64 + - Offset: 0x000000000000009C + Type: R_MIPS_TLS_GD + Type2: R_MIPS_TLS_GD + Type3: R_MIPS_TLS_GD + - Offset: 0x00000000000000A0 + Type: R_MIPS_TLS_LDM + Type2: R_MIPS_TLS_LDM + Type3: R_MIPS_TLS_LDM + - Offset: 0x00000000000000A4 + Type: R_MIPS_TLS_DTPREL_HI16 + Type2: R_MIPS_TLS_DTPREL_HI16 + Type3: R_MIPS_TLS_DTPREL_HI16 + - Offset: 0x00000000000000A8 + Type: R_MIPS_TLS_DTPREL_LO16 + Type2: R_MIPS_TLS_DTPREL_LO16 + Type3: R_MIPS_TLS_DTPREL_LO16 + - Offset: 0x00000000000000AC + Type: R_MIPS_TLS_GOTTPREL + Type2: R_MIPS_TLS_GOTTPREL + Type3: R_MIPS_TLS_GOTTPREL + - Offset: 0x00000000000000B0 + Type: R_MIPS_TLS_TPREL32 + Type2: R_MIPS_TLS_TPREL32 + Type3: R_MIPS_TLS_TPREL32 + - Offset: 0x00000000000000B4 + Type: R_MIPS_TLS_TPREL64 + Type2: R_MIPS_TLS_TPREL64 + Type3: R_MIPS_TLS_TPREL64 + - Offset: 0x00000000000000B8 + Type: R_MIPS_TLS_TPREL_HI16 + Type2: R_MIPS_TLS_TPREL_HI16 + Type3: R_MIPS_TLS_TPREL_HI16 + - Offset: 0x00000000000000BC + Type: R_MIPS_TLS_TPREL_LO16 + Type2: R_MIPS_TLS_TPREL_LO16 + Type3: R_MIPS_TLS_TPREL_LO16 + - Offset: 0x00000000000000C0 + Type: R_MIPS_GLOB_DAT + Type2: R_MIPS_GLOB_DAT + Type3: R_MIPS_GLOB_DAT + - Offset: 0x00000000000000C4 + Type: R_MIPS_COPY + Type2: R_MIPS_COPY + Type3: R_MIPS_COPY + - Offset: 0x00000000000000C8 + Type: R_MIPS_JUMP_SLOT + Type2: R_MIPS_JUMP_SLOT + Type3: R_MIPS_JUMP_SLOT + - Offset: 0x00000000000000CC + Type: R_MIPS_NUM + Type2: R_MIPS_NUM + Type3: R_MIPS_NUM diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test new file mode 100644 index 00000000000..7e081b7e4e2 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-ppc64.test @@ -0,0 +1,293 @@ +## Test that llvm-readobj shows proper relocation type +## names and values for ppc64 target. + +# RUN: yaml2obj %s -o %t-ppc64.o +# RUN: llvm-readobj -r --expand-relocs %t-ppc64.o | FileCheck %s + +# CHECK: Type: R_PPC64_NONE (0) +# CHECK: Type: R_PPC64_ADDR32 (1) +# CHECK: Type: R_PPC64_ADDR24 (2) +# CHECK: Type: R_PPC64_ADDR16 (3) +# CHECK: Type: R_PPC64_ADDR16_LO (4) +# CHECK: Type: R_PPC64_ADDR16_HI (5) +# CHECK: Type: R_PPC64_ADDR16_HA (6) +# CHECK: Type: R_PPC64_ADDR14 (7) +# CHECK: Type: R_PPC64_ADDR14_BRTAKEN (8) +# CHECK: Type: R_PPC64_ADDR14_BRNTAKEN (9) +# CHECK: Type: R_PPC64_REL24 (10) +# CHECK: Type: R_PPC64_REL14 (11) +# CHECK: Type: R_PPC64_REL14_BRTAKEN (12) +# CHECK: Type: R_PPC64_REL14_BRNTAKEN (13) +# CHECK: Type: R_PPC64_GOT16 (14) +# CHECK: Type: R_PPC64_GOT16_LO (15) +# CHECK: Type: R_PPC64_GOT16_HI (16) +# CHECK: Type: R_PPC64_GOT16_HA (17) +# CHECK: Type: R_PPC64_GLOB_DAT (20) +# CHECK: Type: R_PPC64_JMP_SLOT (21) +# CHECK: Type: R_PPC64_RELATIVE (22) +# CHECK: Type: R_PPC64_REL32 (26) +# CHECK: Type: R_PPC64_ADDR64 (38) +# CHECK: Type: R_PPC64_ADDR16_HIGHER (39) +# CHECK: Type: R_PPC64_ADDR16_HIGHERA (40) +# CHECK: Type: R_PPC64_ADDR16_HIGHEST (41) +# CHECK: Type: R_PPC64_ADDR16_HIGHESTA (42) +# CHECK: Type: R_PPC64_REL64 (44) +# CHECK: Type: R_PPC64_TOC16 (47) +# CHECK: Type: R_PPC64_TOC16_LO (48) +# CHECK: Type: R_PPC64_TOC16_HI (49) +# CHECK: Type: R_PPC64_TOC16_HA (50) +# CHECK: Type: R_PPC64_TOC (51) +# CHECK: Type: R_PPC64_ADDR16_DS (56) +# CHECK: Type: R_PPC64_ADDR16_LO_DS (57) +# CHECK: Type: R_PPC64_GOT16_DS (58) +# CHECK: Type: R_PPC64_GOT16_LO_DS (59) +# CHECK: Type: R_PPC64_TOC16_DS (63) +# CHECK: Type: R_PPC64_TOC16_LO_DS (64) +# CHECK: Type: R_PPC64_TLS (67) +# CHECK: Type: R_PPC64_DTPMOD64 (68) +# CHECK: Type: R_PPC64_TPREL16 (69) +# CHECK: Type: R_PPC64_TPREL16_LO (70) +# CHECK: Type: R_PPC64_TPREL16_HI (71) +# CHECK: Type: R_PPC64_TPREL16_HA (72) +# CHECK: Type: R_PPC64_TPREL64 (73) +# CHECK: Type: R_PPC64_DTPREL16 (74) +# CHECK: Type: R_PPC64_DTPREL16_LO (75) +# CHECK: Type: R_PPC64_DTPREL16_HI (76) +# CHECK: Type: R_PPC64_DTPREL16_HA (77) +# CHECK: Type: R_PPC64_DTPREL64 (78) +# CHECK: Type: R_PPC64_GOT_TLSGD16 (79) +# CHECK: Type: R_PPC64_GOT_TLSGD16_LO (80) +# CHECK: Type: R_PPC64_GOT_TLSGD16_HI (81) +# CHECK: Type: R_PPC64_GOT_TLSGD16_HA (82) +# CHECK: Type: R_PPC64_GOT_TLSLD16 (83) +# CHECK: Type: R_PPC64_GOT_TLSLD16_LO (84) +# CHECK: Type: R_PPC64_GOT_TLSLD16_HI (85) +# CHECK: Type: R_PPC64_GOT_TLSLD16_HA (86) +# CHECK: Type: R_PPC64_GOT_TPREL16_DS (87) +# CHECK: Type: R_PPC64_GOT_TPREL16_LO_DS (88) +# CHECK: Type: R_PPC64_GOT_TPREL16_HI (89) +# CHECK: Type: R_PPC64_GOT_TPREL16_HA (90) +# CHECK: Type: R_PPC64_GOT_DTPREL16_DS (91) +# CHECK: Type: R_PPC64_GOT_DTPREL16_LO_DS (92) +# CHECK: Type: R_PPC64_GOT_DTPREL16_HI (93) +# CHECK: Type: R_PPC64_GOT_DTPREL16_HA (94) +# CHECK: Type: R_PPC64_TPREL16_DS (95) +# CHECK: Type: R_PPC64_TPREL16_LO_DS (96) +# CHECK: Type: R_PPC64_TPREL16_HIGHER (97) +# CHECK: Type: R_PPC64_TPREL16_HIGHERA (98) +# CHECK: Type: R_PPC64_TPREL16_HIGHEST (99) +# CHECK: Type: R_PPC64_TPREL16_HIGHESTA (100) +# CHECK: Type: R_PPC64_DTPREL16_DS (101) +# CHECK: Type: R_PPC64_DTPREL16_LO_DS (102) +# CHECK: Type: R_PPC64_DTPREL16_HIGHER (103) +# CHECK: Type: R_PPC64_DTPREL16_HIGHERA (104) +# CHECK: Type: R_PPC64_DTPREL16_HIGHEST (105) +# CHECK: Type: R_PPC64_DTPREL16_HIGHESTA (106) +# CHECK: Type: R_PPC64_TLSGD (107) +# CHECK: Type: R_PPC64_TLSLD (108) +# CHECK: Type: R_PPC64_ADDR16_HIGH (110) +# CHECK: Type: R_PPC64_ADDR16_HIGHA (111) +# CHECK: Type: R_PPC64_TPREL16_HIGH (112) +# CHECK: Type: R_PPC64_TPREL16_HIGHA (113) +# CHECK: Type: R_PPC64_DTPREL16_HIGH (114) +# CHECK: Type: R_PPC64_DTPREL16_HIGHA (115) +# CHECK: Type: R_PPC64_IRELATIVE (248) +# CHECK: Type: R_PPC64_REL16 (249) +# CHECK: Type: R_PPC64_REL16_LO (250) +# CHECK: Type: R_PPC64_REL16_HI (251) +# CHECK: Type: R_PPC64_REL16_HA (252) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_PPC64 +Sections: + - Name: .rela.text + Type: SHT_RELA + Relocations: + - Offset: 0x0000000000000000 + Type: R_PPC64_NONE + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR32 + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR24 + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16 + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_LO + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR14 + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR14_BRTAKEN + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR14_BRNTAKEN + - Offset: 0x0000000000000000 + Type: R_PPC64_REL24 + - Offset: 0x0000000000000000 + Type: R_PPC64_REL14 + - Offset: 0x0000000000000000 + Type: R_PPC64_REL14_BRTAKEN + - Offset: 0x0000000000000000 + Type: R_PPC64_REL14_BRNTAKEN + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT16 + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT16_LO + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_GLOB_DAT + - Offset: 0x0000000000000000 + Type: R_PPC64_JMP_SLOT + - Offset: 0x0000000000000000 + Type: R_PPC64_RELATIVE + - Offset: 0x0000000000000000 + Type: R_PPC64_REL32 + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR64 + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_HIGHER + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_HIGHERA + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_HIGHEST + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_HIGHESTA + - Offset: 0x0000000000000000 + Type: R_PPC64_REL64 + - Offset: 0x0000000000000000 + Type: R_PPC64_TOC16 + - Offset: 0x0000000000000000 + Type: R_PPC64_TOC16_LO + - Offset: 0x0000000000000000 + Type: R_PPC64_TOC16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_TOC16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_TOC + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_LO_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT16_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT16_LO_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_TOC16_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_TOC16_LO_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_TLS + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPMOD64 + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16 + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_LO + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL64 + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16 + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_LO + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL64 + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TLSGD16 + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TLSGD16_LO + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TLSGD16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TLSGD16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TLSLD16 + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TLSLD16_LO + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TLSLD16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TLSLD16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TPREL16_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TPREL16_LO_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TPREL16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_TPREL16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_DTPREL16_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_DTPREL16_LO_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_DTPREL16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_GOT_DTPREL16_HA + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_LO_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_HIGHER + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_HIGHERA + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_HIGHEST + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_HIGHESTA + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_LO_DS + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_HIGHER + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_HIGHERA + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_HIGHEST + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_HIGHESTA + - Offset: 0x0000000000000000 + Type: R_PPC64_TLSGD + - Offset: 0x0000000000000000 + Type: R_PPC64_TLSLD + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_HIGH + - Offset: 0x0000000000000000 + Type: R_PPC64_ADDR16_HIGHA + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_HIGH + - Offset: 0x0000000000000000 + Type: R_PPC64_TPREL16_HIGHA + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_HIGH + - Offset: 0x0000000000000000 + Type: R_PPC64_DTPREL16_HIGHA + - Offset: 0x0000000000000000 + Type: R_PPC64_IRELATIVE + - Offset: 0x0000000000000000 + Type: R_PPC64_REL16 + - Offset: 0x0000000000000000 + Type: R_PPC64_REL16_LO + - Offset: 0x0000000000000000 + Type: R_PPC64_REL16_HI + - Offset: 0x0000000000000000 + Type: R_PPC64_REL16_HA diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-x64.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-x64.test new file mode 100644 index 00000000000..ad4e06fc955 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-elf-x64.test @@ -0,0 +1,232 @@ +## Test that llvm-readobj/llvm-readelf shows proper relocation type +## names and values for x86_64 target. + +# RUN: yaml2obj %s -o %t-x86_64.o +# RUN: llvm-readobj -r --expand-relocs %t-x86_64.o | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf -r --expand-relocs %t-x86_64.o | FileCheck %s --check-prefix=GNU + +# LLVM: Type: R_X86_64_NONE (0) +# LLVM: Type: R_X86_64_64 (1) +# LLVM: Type: R_X86_64_PC32 (2) +# LLVM: Type: R_X86_64_GOT32 (3) +# LLVM: Type: R_X86_64_PLT32 (4) +# LLVM: Type: R_X86_64_COPY (5) +# LLVM: Type: R_X86_64_GLOB_DAT (6) +# LLVM: Type: R_X86_64_JUMP_SLOT (7) +# LLVM: Type: R_X86_64_RELATIVE (8) +# LLVM: Type: R_X86_64_GOTPCREL (9) +# LLVM: Type: R_X86_64_32 (10) +# LLVM: Type: R_X86_64_32S (11) +# LLVM: Type: R_X86_64_16 (12) +# LLVM: Type: R_X86_64_PC16 (13) +# LLVM: Type: R_X86_64_8 (14) +# LLVM: Type: R_X86_64_PC8 (15) +# LLVM: Type: R_X86_64_DTPMOD64 (16) +# LLVM: Type: R_X86_64_DTPOFF64 (17) +# LLVM: Type: R_X86_64_TPOFF64 (18) +# LLVM: Type: R_X86_64_TLSGD (19) +# LLVM: Type: R_X86_64_TLSLD (20) +# LLVM: Type: R_X86_64_DTPOFF32 (21) +# LLVM: Type: R_X86_64_GOTTPOFF (22) +# LLVM: Type: R_X86_64_TPOFF32 (23) +# LLVM: Type: R_X86_64_PC64 (24) +# LLVM: Type: R_X86_64_GOTOFF64 (25) +# LLVM: Type: R_X86_64_GOTPC32 (26) +# LLVM: Type: R_X86_64_GOT64 (27) +# LLVM: Type: R_X86_64_GOTPCREL64 (28) +# LLVM: Type: R_X86_64_GOTPC64 (29) +# LLVM: Type: R_X86_64_GOTPLT64 (30) +# LLVM: Type: R_X86_64_PLTOFF64 (31) +# LLVM: Type: R_X86_64_SIZE32 (32) +# LLVM: Type: R_X86_64_SIZE64 (33) +# LLVM: Type: R_X86_64_GOTPC32_TLSDESC (34) +# LLVM: Type: R_X86_64_TLSDESC_CALL (35) +# LLVM: Type: R_X86_64_TLSDESC (36) +# LLVM: Type: R_X86_64_IRELATIVE (37) +# LLVM: Type: R_X86_64_GOTPCRELX (41) +# LLVM: Type: R_X86_64_REX_GOTPCRELX (42) + +# GNU: Relocation section '.rela.text' at offset 0x48 contains 40 entries: +# GNU-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# GNU-NEXT: 0000000000000003 0000000100000000 R_X86_64_NONE 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000000a 0000000100000001 R_X86_64_64 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000011 0000000100000002 R_X86_64_PC32 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000018 0000000100000003 R_X86_64_GOT32 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000001f 0000000100000004 R_X86_64_PLT32 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000026 0000000100000005 R_X86_64_COPY 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000002d 0000000100000006 R_X86_64_GLOB_DAT 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000034 0000000100000007 R_X86_64_JUMP_SLOT 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000003b 0000000100000008 R_X86_64_RELATIVE 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000042 0000000100000009 R_X86_64_GOTPCREL 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000049 000000010000000a R_X86_64_32 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000050 000000010000000b R_X86_64_32S 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000057 000000010000000c R_X86_64_16 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000005e 000000010000000d R_X86_64_PC16 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000065 000000010000000e R_X86_64_8 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000006c 000000010000000f R_X86_64_PC8 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000073 0000000100000010 R_X86_64_DTPMOD64 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000007a 0000000100000011 R_X86_64_DTPOFF64 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000081 0000000100000012 R_X86_64_TPOFF64 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000088 0000000100000013 R_X86_64_TLSGD 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000008f 0000000100000014 R_X86_64_TLSLD 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000096 0000000100000015 R_X86_64_DTPOFF32 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000009d 0000000100000016 R_X86_64_GOTTPOFF 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000a4 0000000100000017 R_X86_64_TPOFF32 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000ab 0000000100000018 R_X86_64_PC64 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000b2 0000000100000019 R_X86_64_GOTOFF64 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000b9 000000010000001a R_X86_64_GOTPC32 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000c0 000000010000001b R_X86_64_GOT64 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000c7 000000010000001c R_X86_64_GOTPCREL64 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000ce 000000010000001d R_X86_64_GOTPC64 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000d5 000000010000001e R_X86_64_GOTPLT64 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000dc 000000010000001f R_X86_64_PLTOFF64 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000e3 0000000100000020 R_X86_64_SIZE32 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000ea 0000000100000021 R_X86_64_SIZE64 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000f1 0000000100000022 R_X86_64_GOTPC32_TLSDESC 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000f8 0000000100000023 R_X86_64_TLSDESC_CALL 0000000000000000 foo + 0 +# GNU-NEXT: 00000000000000ff 0000000100000024 R_X86_64_TLSDESC 0000000000000000 foo + 0 +# GNU-NEXT: 0000000000000106 0000000100000025 R_X86_64_IRELATIVE 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000010a 0000000100000029 R_X86_64_GOTPCRELX 0000000000000000 foo + 0 +# GNU-NEXT: 000000000000010e 000000010000002a R_X86_64_REX_GOTPCRELX 0000000000000000 foo + 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_GNU + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Content: 00 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + EntSize: 0x0000000000000018 + Info: .text + Relocations: + - Offset: 0x0000000000000003 + Type: R_X86_64_NONE + Symbol: foo + - Offset: 0x000000000000000A + Type: R_X86_64_64 + Symbol: foo + - Offset: 0x0000000000000011 + Type: R_X86_64_PC32 + Symbol: foo + - Offset: 0x0000000000000018 + Type: R_X86_64_GOT32 + Symbol: foo + - Offset: 0x000000000000001F + Type: R_X86_64_PLT32 + Symbol: foo + - Offset: 0x0000000000000026 + Type: R_X86_64_COPY + Symbol: foo + - Offset: 0x000000000000002D + Type: R_X86_64_GLOB_DAT + Symbol: foo + - Offset: 0x0000000000000034 + Type: R_X86_64_JUMP_SLOT + Symbol: foo + - Offset: 0x000000000000003B + Type: R_X86_64_RELATIVE + Symbol: foo + - Offset: 0x0000000000000042 + Type: R_X86_64_GOTPCREL + Symbol: foo + - Offset: 0x0000000000000049 + Type: R_X86_64_32 + Symbol: foo + - Offset: 0x0000000000000050 + Type: R_X86_64_32S + Symbol: foo + - Offset: 0x0000000000000057 + Type: R_X86_64_16 + Symbol: foo + - Offset: 0x000000000000005E + Type: R_X86_64_PC16 + Symbol: foo + - Offset: 0x0000000000000065 + Type: R_X86_64_8 + Symbol: foo + - Offset: 0x000000000000006C + Type: R_X86_64_PC8 + Symbol: foo + - Offset: 0x0000000000000073 + Type: R_X86_64_DTPMOD64 + Symbol: foo + - Offset: 0x000000000000007A + Type: R_X86_64_DTPOFF64 + Symbol: foo + - Offset: 0x0000000000000081 + Type: R_X86_64_TPOFF64 + Symbol: foo + - Offset: 0x0000000000000088 + Type: R_X86_64_TLSGD + Symbol: foo + - Offset: 0x000000000000008F + Type: R_X86_64_TLSLD + Symbol: foo + - Offset: 0x0000000000000096 + Type: R_X86_64_DTPOFF32 + Symbol: foo + - Offset: 0x000000000000009D + Type: R_X86_64_GOTTPOFF + Symbol: foo + - Offset: 0x00000000000000A4 + Type: R_X86_64_TPOFF32 + Symbol: foo + - Offset: 0x00000000000000AB + Type: R_X86_64_PC64 + Symbol: foo + - Offset: 0x00000000000000B2 + Type: R_X86_64_GOTOFF64 + Symbol: foo + - Offset: 0x00000000000000B9 + Type: R_X86_64_GOTPC32 + Symbol: foo + - Offset: 0x00000000000000C0 + Type: R_X86_64_GOT64 + Symbol: foo + - Offset: 0x00000000000000C7 + Type: R_X86_64_GOTPCREL64 + Symbol: foo + - Offset: 0x00000000000000CE + Type: R_X86_64_GOTPC64 + Symbol: foo + - Offset: 0x00000000000000D5 + Type: R_X86_64_GOTPLT64 + Symbol: foo + - Offset: 0x00000000000000DC + Type: R_X86_64_PLTOFF64 + Symbol: foo + - Offset: 0x00000000000000E3 + Type: R_X86_64_SIZE32 + Symbol: foo + - Offset: 0x00000000000000EA + Type: R_X86_64_SIZE64 + Symbol: foo + - Offset: 0x00000000000000F1 + Type: R_X86_64_GOTPC32_TLSDESC + Symbol: foo + - Offset: 0x00000000000000F8 + Type: R_X86_64_TLSDESC_CALL + Symbol: foo + - Offset: 0x00000000000000FF + Type: R_X86_64_TLSDESC + Symbol: foo + - Offset: 0x0000000000000106 + Type: R_X86_64_IRELATIVE + Symbol: foo + - Offset: 0x000000000000010A + Type: R_X86_64_GOTPCRELX + Symbol: foo + - Offset: 0x000000000000010E + Type: R_X86_64_REX_GOTPCRELX + Symbol: foo +Symbols: + - Name: foo + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test b/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test new file mode 100644 index 00000000000..c6481badc14 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/reloc-zero-name-or-value.test @@ -0,0 +1,109 @@ +# Show that the value field is omitted if a symbol has no name or value, but is +# printed if one is present. Test for both static and dynamic relocation +# printing. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readelf --relocations --dyn-relocations %t | FileCheck %s + +# CHECK: Relocation section '.rela.text' at offset {{.*}} contains 3 entries: +# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# CHECK-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE 1 +# CHECK-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 sym + 1 +# CHECK-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE 0000000000000123 456 + +# CHECK: Relocation section '.rela.dyn' at offset {{.*}} contains 3 entries: +# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# CHECK-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE 1 +# CHECK-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 sym + 1 +# CHECK-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE 0000000000000123 456 + +# CHECK: 'RELA' relocation section at offset {{.*}} contains 72 bytes: +# CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend +# CHECK-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE 1 +# CHECK-NEXT: 0000000000000000 0000000100000000 R_X86_64_NONE 0000000000000000 sym + 1 +# CHECK-NEXT: 0000000000000000 0000000200000000 R_X86_64_NONE 0000000000000123 456 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x10 + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + Info: .text + Relocations: + - Offset: 0 + Type: R_X86_64_NONE + Addend: 1 + - Offset: 0 + Type: R_X86_64_NONE + Addend: 1 + Symbol: sym + - Offset: 0 + Type: R_X86_64_NONE + Addend: 0x456 + Symbol: 2 + - Name: .dynamic + Type: SHT_DYNAMIC + Flags: [SHF_ALLOC] + Address: 0x1000 + AddressAlign: 0x1000 + Entries: + - Tag: DT_RELA + Value: 0x1100 + - Tag: DT_RELASZ + Value: 72 + - Tag: DT_RELAENT + Value: 24 + - Tag: DT_NULL + Value: 0 + - Name: .rela.dyn + Type: SHT_RELA + Flags: [SHF_ALLOC] + Info: .text + Address: 0x1100 + AddressAlign: 0x100 + Relocations: + - Offset: 0 + Type: R_X86_64_NONE + Addend: 1 + - Offset: 0 + Type: R_X86_64_NONE + Addend: 1 + Symbol: sym + - Offset: 0 + Type: R_X86_64_NONE + Addend: 0x456 + Symbol: 2 +Symbols: + - Name: sym + Value: 0 + Section: .text + Binding: STB_GLOBAL + - Value: 0x123 + Section: .text + Binding: STB_GLOBAL +DynamicSymbols: + - Name: sym + Value: 0 + Section: .text + Binding: STB_GLOBAL + - Value: 0x123 + Section: .text + Binding: STB_GLOBAL +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x1000 + Sections: + - Section: .rela.dyn + - Section: .dynamic + - Type: PT_DYNAMIC + VAddr: 0x1000 + Sections: + - Section: .dynamic diff --git a/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test new file mode 100644 index 00000000000..9d3b5de9928 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test @@ -0,0 +1,174 @@ +# The binary blobs in this file were created like this: +# llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu Inputs/elf-relr-relocs1.s -o - | obj2yaml | grep Content: + +# RUN: yaml2obj -docnum 1 %s \ +# RUN: | llvm-readobj --relocations --raw-relr - \ +# RUN: | FileCheck --check-prefix=RAW-LLVM1 %s +# RAW-LLVM1: Section (1) .relr.dyn { +# RAW-LLVM1-NEXT: 0x10D60 +# RAW-LLVM1-NEXT: 0x103 +# RAW-LLVM1-NEXT: 0x20000 +# RAW-LLVM1-NEXT: 0xF0501 +# RAW-LLVM1-NEXT: 0xA700550400009 +# RAW-LLVM1-NEXT: } + +# RUN: yaml2obj -docnum 1 %s \ +# RUN: | llvm-readobj --relocations - \ +# RUN: | FileCheck --check-prefix=LLVM1 %s +# LLVM1: Section (1) .relr.dyn { +# LLVM1-NEXT: 0x10D60 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x10D68 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x10DA0 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20000 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20040 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20050 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20080 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20088 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20090 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20098 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20210 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x202A8 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x202D8 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x202E8 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x202F8 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20308 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20358 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20360 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20368 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20380 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: 0x20390 R_X86_64_RELATIVE - 0x0 +# LLVM1-NEXT: } + +# RUN: yaml2obj -docnum 1 %s \ +# RUN: | llvm-readelf -relocations -raw-relr - \ +# RUN: | FileCheck --check-prefix=RAW-GNU1 %s +# RAW-GNU1: Relocation section '.relr.dyn' at offset 0x40 contains 5 entries: +# RAW-GNU1: 0000000000010d60 +# RAW-GNU1-NEXT: 0000000000000103 +# RAW-GNU1-NEXT: 0000000000020000 +# RAW-GNU1-NEXT: 00000000000f0501 +# RAW-GNU1-NEXT: 000a700550400009 + +# RUN: yaml2obj -docnum 1 %s \ +# RUN: | llvm-readelf -relocations - \ +# RUN: | FileCheck --check-prefix=GNU1 %s +# GNU1: Relocation section '.relr.dyn' at offset 0x40 contains 21 entries: +# GNU1: 0000000000010d60 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000010d68 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000010da0 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020000 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020040 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020050 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020080 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020088 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020090 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020098 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020210 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 00000000000202a8 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 00000000000202d8 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 00000000000202e8 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 00000000000202f8 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020308 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020358 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020360 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020368 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020380 0000000000000008 R_X86_64_RELATIVE +# GNU1-NEXT: 0000000000020390 0000000000000008 R_X86_64_RELATIVE + +# elf-relr-relocs1.s +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + Entry: 0x0000000000001000 +Sections: + - Name: .relr.dyn + Type: SHT_RELR + Flags: [ SHF_ALLOC ] + Address: 0x00000000000001C8 + Link: .symtab + AddressAlign: 0x0000000000000001 + Content: 600D0100000000000301000000000000000002000000000001050F00000000000900405005700A00 +Symbols: [] +... + +# RUN: yaml2obj -docnum 2 %s \ +# RUN: | llvm-readobj --relocations --raw-relr - \ +# RUN: | FileCheck --check-prefix=RAW-LLVM2 %s +# RAW-LLVM2: Section (1) .relr.dyn { +# RAW-LLVM2-NEXT: 0x10D60 +# RAW-LLVM2-NEXT: 0x103 +# RAW-LLVM2-NEXT: 0x20000 +# RAW-LLVM2-NEXT: 0xF0501 +# RAW-LLVM2-NEXT: 0x50400009 +# RAW-LLVM2-NEXT: } + +# RUN: yaml2obj -docnum 2 %s \ +# RUN: | llvm-readobj --relocations - \ +# RUN: | FileCheck --check-prefix=LLVM2 %s +# LLVM2: Section (1) .relr.dyn { +# LLVM2-NEXT: 0x10D60 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x10D64 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x10D80 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x20000 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x20020 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x20028 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x20040 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x20044 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x20048 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x2004C R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x20088 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x200D4 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x200EC R_386_RELATIVE - 0x0 +# LLVM2-NEXT: 0x200F4 R_386_RELATIVE - 0x0 +# LLVM2-NEXT: } + +# RUN: yaml2obj -docnum 2 %s \ +# RUN: | llvm-readelf -relocations -raw-relr - \ +# RUN: | FileCheck --check-prefix=RAW-GNU2 %s +# RAW-GNU2: Relocation section '.relr.dyn' at offset 0x34 contains 5 entries: +# RAW-GNU2: 00010d60 +# RAW-GNU2-NEXT: 00000103 +# RAW-GNU2-NEXT: 00020000 +# RAW-GNU2-NEXT: 000f0501 +# RAW-GNU2-NEXT: 50400009 + +# RUN: yaml2obj -docnum 2 %s \ +# RUN: | llvm-readelf -relocations - \ +# RUN: | FileCheck --check-prefix=GNU2 %s +# GNU2: Relocation section '.relr.dyn' at offset 0x34 contains 14 entries: +# GNU2: 00010d60 00000008 R_386_RELATIVE +# GNU2-NEXT: 00010d64 00000008 R_386_RELATIVE +# GNU2-NEXT: 00010d80 00000008 R_386_RELATIVE +# GNU2-NEXT: 00020000 00000008 R_386_RELATIVE +# GNU2-NEXT: 00020020 00000008 R_386_RELATIVE +# GNU2-NEXT: 00020028 00000008 R_386_RELATIVE +# GNU2-NEXT: 00020040 00000008 R_386_RELATIVE +# GNU2-NEXT: 00020044 00000008 R_386_RELATIVE +# GNU2-NEXT: 00020048 00000008 R_386_RELATIVE +# GNU2-NEXT: 0002004c 00000008 R_386_RELATIVE +# GNU2-NEXT: 00020088 00000008 R_386_RELATIVE +# GNU2-NEXT: 000200d4 00000008 R_386_RELATIVE +# GNU2-NEXT: 000200ec 00000008 R_386_RELATIVE +# GNU2-NEXT: 000200f4 00000008 R_386_RELATIVE + +# elf-relr-relocs2.s +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_386 + Entry: 0x00001000 +Sections: + - Name: .relr.dyn + Type: SHT_RELR + Flags: [ SHF_ALLOC ] + Address: 0x000001C8 + Link: .symtab + AddressAlign: 0x00000001 + Content: 600D0100030100000000020001050F0009004050 +Symbols: [] +... diff --git a/llvm/test/tools/llvm-readobj/ELF/rpath.test b/llvm/test/tools/llvm-readobj/ELF/rpath.test new file mode 100644 index 00000000000..75be5e2c668 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/rpath.test @@ -0,0 +1,4 @@ +RUN: llvm-readobj --dynamic-table %p/Inputs/rpath.exe.elf-x86_64 \ +RUN: | FileCheck %s + +CHECK: 0x000000000000000F RPATH Library rpath: [/usr/local/lib] diff --git a/llvm/test/tools/llvm-readobj/ELF/sec-compressed.test b/llvm/test/tools/llvm-readobj/ELF/sec-compressed.test new file mode 100644 index 00000000000..5045c539289 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/sec-compressed.test @@ -0,0 +1,9 @@ +RUN: llvm-readobj --sections \ +RUN: %p/Inputs/compression.zlib.style.elf-x86-64 | FileCheck %s + +CHECK: Section { +CHECK: Name: .debug_info +CHECK-NEXT: Type: SHT_PROGBITS +CHECK-NEXT: Flags [ +CHECK-NEXT: SHF_COMPRESSED (0x800) +CHECK-NEXT: ] diff --git a/llvm/test/tools/llvm-readobj/ELF/sec-flags.test b/llvm/test/tools/llvm-readobj/ELF/sec-flags.test new file mode 100644 index 00000000000..8507975918d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/sec-flags.test @@ -0,0 +1,67 @@ +# Check that llvm-readobj shows arch specific ELF section flags. + +# RUN: yaml2obj -docnum 1 %s > %t-hex.o +# RUN: llvm-readobj -S %t-hex.o | FileCheck -check-prefix=HEX %s + +# HEX: Flags [ (0x10000000) +# HEX-NEXT: SHF_HEX_GPREL (0x10000000) +# HEX-NEXT: ] + +# hex.o +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_HEXAGON + Flags: [] +Sections: + - Name: .hex + Type: SHT_PROGBITS + Flags: [SHF_HEX_GPREL] + Size: 4 + +# RUN: yaml2obj -docnum 2 %s > %t-mips.o +# RUN: llvm-readobj -S %t-mips.o | FileCheck -check-prefix=MIPS %s + +# MIPS: Flags [ (0x38000000) +# MIPS-NEXT: SHF_MIPS_GPREL (0x10000000) +# MIPS-NEXT: SHF_MIPS_MERGE (0x20000000) +# MIPS-NEXT: SHF_MIPS_NOSTRIP (0x8000000) +# MIPS-NEXT: ] + +# mips.o +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_MIPS + Flags: [] +Sections: + - Name: .mips + Type: SHT_PROGBITS + Flags: [SHF_MIPS_GPREL, SHF_MIPS_MERGE, SHF_MIPS_NOSTRIP] + Size: 4 + +# RUN: yaml2obj -docnum 3 %s > %t-x86_64.o +# RUN: llvm-readobj -S %t-x86_64.o | FileCheck -check-prefix=X86_64 %s + +# X86_64: Flags [ (0x10000000) +# X86_64-NEXT: SHF_X86_64_LARGE (0x10000000) +# X86_64-NEXT: ] + +# x86_64.o +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + Flags: [] +Sections: + - Name: .x86_64 + Type: SHT_PROGBITS + Flags: [SHF_X86_64_LARGE] + Size: 4 +... diff --git a/llvm/test/tools/llvm-readobj/ELF/section-symbols.test b/llvm/test/tools/llvm-readobj/ELF/section-symbols.test new file mode 100644 index 00000000000..b6357766fc2 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/section-symbols.test @@ -0,0 +1,85 @@ +## ELF section symbols use the section names when printing. This test verifies +## this and also that appropriate things are printed if the section is somehow +## invalid. + +# RUN: yaml2obj %s -o %t1 +# RUN: llvm-readobj %t1 --symbols 2> %t.llvm.err1 | FileCheck %s --check-prefix=LLVM1 +# RUN: FileCheck %s --input-file %t.llvm.err1 --check-prefix=WARN1 --implicit-check-not=warning +# RUN: llvm-readelf %t1 --symbols 2> %t.gnu.err1 | FileCheck %s --check-prefix=GNU1 +# RUN: FileCheck %s --input-file %t.gnu.err1 --check-prefix=WARN1 --implicit-check-not=warning + +# LLVM1: Name: (0) +# LLVM1: Name: .foo (0) +# LLVM1: Name: <section 67> (0) +# LLVM1: Name: .bar (0) +# LLVM1: Name: <section 66> (0) + +# GNU1: Symbol table '.symtab' contains 5 entries: +# GNU1-NEXT: Num: {{.*}} Type {{.*}} Ndx Name +# GNU1-NEXT: 0: {{.*}} NOTYPE {{.*}} UND {{$}} +# GNU1-NEXT: 1: {{.*}} SECTION {{.*}} 1 .foo +# GNU1-NEXT: 2: {{.*}} SECTION {{.*}} 67 <section 67> +# GNU1-NEXT: 3: {{.*}} SECTION {{.*}} 2 .bar +# GNU1-NEXT: 4: {{.*}} SECTION {{.*}} 66 <section 66> + +# WARN1: warning: '{{.*}}.tmp1': invalid section index: 67 +# WARN1: warning: '{{.*}}.tmp1': invalid section index: 66 + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .foo + Type: SHT_PROGBITS + - Name: .bar + Type: SHT_PROGBITS + - Name: .symtab_shndx + Type: SHT_SYMTAB_SHNDX + Link: .symtab + Entries: [ 0, 0, 0, 2, 0x42 ] +Symbols: + - Name: "" + Section: .foo + Type: STT_SECTION + - Name: "" + Index: 0x43 + Type: STT_SECTION + # Section symbol via SHT_SYMTAB_SHNDX. + - Name: "" + Index: SHN_XINDEX + Type: STT_SECTION + # Section symbol via SHT_SYMTAB_SHNDX with invalid index. + - Name: "" + Index: SHN_XINDEX + Type: STT_SECTION + +# RUN: yaml2obj %s --docnum=2 -o %t2 +# RUN: llvm-readobj %t2 --symbols 2> %t.llvm.err2 | FileCheck %s --check-prefix=LLVM2 +# RUN: FileCheck %s --input-file %t.llvm.err2 --check-prefix=WARN2 --implicit-check-not=warning +# RUN: llvm-readelf %t2 --symbols 2> %t.gnu.err2 | FileCheck %s --check-prefix=GNU2 +# RUN: FileCheck %s --input-file %t.gnu.err2 --check-prefix=WARN2 --implicit-check-not=warning + +# LLVM2: Name: (0) +# LLVM2: Name: <?> (0) + +# GNU2: Symbol table '.symtab' contains 2 entries: +# GNU2-NEXT: Num: {{.*}} Type {{.*}} Ndx Name +# GNU2-NEXT: 0: {{.*}} NOTYPE {{.*}} UND {{$}} +# GNU2-NEXT: 1: {{.*}} SECTION {{.*}} RSV[0xffff] <?> + +# WARN2: warning: '{{.*}}.tmp2': extended symbol index (1) is past the end of the SHT_SYMTAB_SHNDX section of size 0 + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Symbols: + # Section symbol via SHT_SYMTAB_SHNDX when SHT_SYMTAB_SHNDX is missing. + - Name: "" + Index: SHN_XINDEX + Type: STT_SECTION diff --git a/llvm/test/tools/llvm-readobj/ELF/section-types.test b/llvm/test/tools/llvm-readobj/ELF/section-types.test new file mode 100644 index 00000000000..8718f5894c6 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/section-types.test @@ -0,0 +1,245 @@ +# Show that all regular section types are properly printed for both LLVM and +# GNU styles. + +# RUN: yaml2obj %s -o %t-basic.o +# RUN: llvm-readobj --section-headers %t-basic.o | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --section-headers %t-basic.o | FileCheck %s --check-prefix=GNU + +# LLVM: Name: (0) +# LLVM: Type: SHT_NULL +# LLVM: Name: progbits +# LLVM: Type: SHT_PROGBITS +# LLVM: Name: rela +# LLVM: Type: SHT_RELA +# LLVM: Name: hash +# LLVM: Type: SHT_HASH +# LLVM: Name: dynamic +# LLVM: Type: SHT_DYNAMIC +# LLVM: Name: note +# LLVM: Type: SHT_NOTE +# LLVM: Name: nobits +# LLVM: Type: SHT_NOBITS +# LLVM: Name: rel +# LLVM: Type: SHT_REL +# LLVM: Name: shlib +# LLVM: Type: SHT_SHLIB +# LLVM: Name: dynsym +# LLVM: Type: SHT_DYNSYM +# LLVM: Name: init_array +# LLVM: Type: SHT_INIT_ARRAY +# LLVM: Name: fini_array +# LLVM: Type: SHT_FINI_ARRAY +# LLVM: Name: preinit_array +# LLVM: Type: SHT_PREINIT_ARRAY +# LLVM: Name: group +# LLVM: Type: SHT_GROUP +# LLVM: Name: symtab_shndx +# LLVM: Type: SHT_SYMTAB_SHNDX +# LLVM: Name: relr +# LLVM: Type: SHT_RELR +# LLVM: Name: android_rel +# LLVM: Type: SHT_ANDROID_REL +# LLVM: Name: android_rela +# LLVM: Type: SHT_ANDROID_RELA +# LLVM: Name: android_relr +# LLVM: Type: SHT_ANDROID_RELR +# LLVM: Name: llvm_odrtab +# LLVM: Type: SHT_LLVM_ODRTAB +# LLVM: Name: linker_options +# LLVM: Type: SHT_LLVM_LINKER_OPTIONS +# LLVM: Name: llvm_call_graph_profile +# LLVM: Type: SHT_LLVM_CALL_GRAPH_PROFILE +# LLVM: Name: llvm_addrsig +# LLVM: Type: SHT_LLVM_ADDRSIG +# LLVM: Name: .deplibs +# LLVM: Type: SHT_LLVM_DEPENDENT_LIBRARIES +# LLVM: Name: .llvm_sympart.f +# LLVM: Type: SHT_LLVM_SYMPART +# LLVM: Name: part1 +# LLVM: Type: SHT_LLVM_PART_EHDR +# LLVM: Name: .phdrs +# LLVM: Type: SHT_LLVM_PART_PHDR +# LLVM: Name: gnu_attributes +# LLVM: Type: SHT_GNU_ATTRIBUTES +# LLVM: Name: gnu_hash +# LLVM: Type: SHT_GNU_HASH +# LLVM: Name: gnu_verdef +# LLVM: Type: SHT_GNU_verdef +# LLVM: Name: gnu_verneed +# LLVM: Type: SHT_GNU_verneed +# LLVM: Name: unknown +# LLVM: Type: Unknown (0x1000) +# LLVM: Name: loos +# LLVM: Type: Unknown (0x60000000) +# LLVM: Name: fooos +# LLVM: Type: Unknown (0x60000F00) +# LLVM: Name: hios +# LLVM: Type: SHT_GNU_versym +# LLVM: Name: loproc +# LLVM: Type: Unknown (0x70000000) +# LLVM: Name: fooproc +# LLVM: Type: Unknown (0x70000F00) +# LLVM: Name: hiproc +# LLVM: Type: Unknown (0x7FFFFFFF) +# LLVM: Name: louser +# LLVM: Type: Unknown (0x80000000) +# LLVM: Name: foouser +# LLVM: Type: Unknown (0x80000F00) +# LLVM: Name: hiuser +# LLVM: Type: Unknown (0xFFFFFFFF) +# LLVM: Name: .symtab +# LLVM: Type: SHT_SYMTAB +# LLVM: Name: .strtab +# LLVM: Type: SHT_STRTAB + +# GNU: [ 0] NULL +# GNU-NEXT: progbits PROGBITS +# GNU-NEXT: rela RELA +# GNU-NEXT: hash HASH +# GNU-NEXT: dynamic DYNAMIC +# GNU-NEXT: note NOTE +# GNU-NEXT: nobits NOBITS +# GNU-NEXT: rel REL +# GNU-NEXT: shlib SHLIB +# GNU-NEXT: dynsym DYNSYM +# GNU-NEXT: init_array INIT_ARRAY +# GNU-NEXT: fini_array FINI_ARRAY +# GNU-NEXT: preinit_array PREINIT_ARRAY +# GNU-NEXT: group GROUP +# GNU-NEXT: symtab_shndx SYMTAB SECTION INDICES +# GNU-NEXT: relr RELR +# GNU-NEXT: android_rel ANDROID_REL +# GNU-NEXT: android_rela ANDROID_RELA +# GNU-NEXT: android_relr RELR +# GNU-NEXT: llvm_odrtab LLVM_ODRTAB +# GNU-NEXT: linker_options LLVM_LINKER_OPTIONS +# GNU-NEXT: llvm_call_graph_profile LLVM_CALL_GRAPH_PROFILE +# GNU-NEXT: llvm_addrsig LLVM_ADDRSIG +# GNU-NEXT: .deplibs LLVM_DEPENDENT_LIBRARIES +# GNU-NEXT: .llvm_sympart.f LLVM_SYMPART +# GNU-NEXT: part1 LLVM_PART_EHDR +# GNU-NEXT: .phdrs LLVM_PART_PHDR +# GNU-NEXT: gnu_attributes ATTRIBUTES +# GNU-NEXT: gnu_hash GNU_HASH +# GNU-NEXT: gnu_verdef VERDEF +# GNU-NEXT: gnu_verneed VERNEED +# GNU-NEXT: unknown 0x1000: <unknown> +# GNU-NEXT: loos LOOS+0x0 +# GNU-NEXT: fooos LOOS+0xF00 +# GNU-NEXT: hios VERSYM +# GNU-NEXT: loproc LOPROC+0x0 +# GNU-NEXT: fooproc LOPROC+0xF00 +# GNU-NEXT: hiproc LOPROC+0xFFFFFFF +# GNU-NEXT: louser LOUSER+0x0 +# GNU-NEXT: foouser LOUSER+0xF00 +# GNU-NEXT: hiuser LOUSER+0x7FFFFFFF +# GNU-NEXT: .symtab SYMTAB +# GNU-NEXT: .strtab STRTAB + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: progbits + Type: SHT_PROGBITS + - Name: rela + Type: SHT_RELA + Info: progbits + - Name: hash + Type: SHT_HASH + Content: '' + - Name: dynamic + Type: SHT_DYNAMIC + - Name: note + Type: SHT_NOTE + Notes: [] + - Name: nobits + Type: SHT_NOBITS + - Name: rel + Type: SHT_REL + Info: progbits + - Name: shlib + Type: SHT_SHLIB + - Name: dynsym + Type: SHT_DYNSYM + Link: .strtab + - Name: init_array + Type: SHT_INIT_ARRAY + - Name: fini_array + Type: SHT_FINI_ARRAY + - Name: preinit_array + Type: SHT_PREINIT_ARRAY + - Name: group + Type: SHT_GROUP + Info: foo + Members: + - SectionOrType: 0 + - Name: symtab_shndx + Type: SHT_SYMTAB_SHNDX + Link: .symtab + Entries: [ 0, 1 ] + - Name: relr + Type: SHT_RELR + - Name: android_rel + Type: SHT_ANDROID_REL + - Name: android_rela + Type: SHT_ANDROID_RELA + - Name: android_relr + Type: SHT_ANDROID_RELR + - Name: llvm_odrtab + Type: SHT_LLVM_ODRTAB + - Name: linker_options + Type: SHT_LLVM_LINKER_OPTIONS + - Name: llvm_call_graph_profile + Type: SHT_LLVM_CALL_GRAPH_PROFILE + - Name: llvm_addrsig + Type: SHT_LLVM_ADDRSIG + Symbols: + - Name: .deplibs + Type: SHT_LLVM_DEPENDENT_LIBRARIES + - Name: .llvm_sympart.f + Type: SHT_LLVM_SYMPART + - Name: part1 + Type: SHT_LLVM_PART_EHDR + - Name: .phdrs + Type: SHT_LLVM_PART_PHDR + - Name: gnu_attributes + Type: SHT_GNU_ATTRIBUTES + - Name: gnu_hash + Type: SHT_GNU_HASH + Content: "" + - Name: gnu_verdef + Type: SHT_GNU_verdef + Info: 0 + Entries: + - Name: gnu_verneed + Type: SHT_GNU_verneed + Info: 0 + Dependencies: + - Name: unknown + Type: 0x1000 + - Name: loos + Type: 0x60000000 + - Name: fooos + Type: 0x60000F00 + - Name: hios + Type: 0x6fffffff + Entries: [] + - Name: loproc + Type: 0x70000000 + - Name: fooproc + Type: 0x70000F00 + - Name: hiproc + Type: 0x7fffffff + - Name: louser + Type: 0x80000000 + - Name: foouser + Type: 0x80000F00 + - Name: hiuser + Type: 0xffffffff +Symbols: + - Name: foo + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-readobj/ELF/stack-sizes.test b/llvm/test/tools/llvm-readobj/ELF/stack-sizes.test new file mode 100644 index 00000000000..3d001b10495 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/stack-sizes.test @@ -0,0 +1,666 @@ +## Check that we correctly display the contents of the .stack_sizes section +## in a relocatable object file. + +# RUN: yaml2obj --docnum=1 %s > %t01 +# RUN: llvm-readelf --stack-sizes %t01 \ +# RUN: | FileCheck %s --check-prefix=RELOC-GNU --strict-whitespace --match-full-lines +# RUN: llvm-readobj --stack-sizes %t01 | FileCheck %s --check-prefix=RELOC-LLVM + +# RELOC-GNU: Size Function +# RELOC-GNU-NEXT: 16 referenced_by_symbol_foo +# RELOC-GNU-NEXT: 32 referenced_via_section_bar +# RELOC-GNU-NEXT: 8 separate_text_section_baz +# RELOC-GNU-NOT:{{.}} + +# RELOC-LLVM: StackSizes [ +# RELOC-LLVM-NEXT: Entry { +# RELOC-LLVM-NEXT: Function: referenced_by_symbol_foo +# RELOC-LLVM-NEXT: Size: 0x10 +# RELOC-LLVM-NEXT: } +# RELOC-LLVM-NEXT: Entry { +# RELOC-LLVM-NEXT: Function: referenced_via_section_bar +# RELOC-LLVM-NEXT: Size: 0x20 +# RELOC-LLVM-NEXT: } +# RELOC-LLVM-NEXT: Entry { +# RELOC-LLVM-NEXT: Function: separate_text_section_baz +# RELOC-LLVM-NEXT: Size: 0x8 +# RELOC-LLVM-NEXT: } +# RELOC-LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Size: 16 + - Name: .text.baz + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Size: 16 + - Name: .stack_sizes + Type: SHT_PROGBITS + Entries: + - Size: 0x10 + - Size: 0x20 + Link: .text + - Name: '.stack_sizes [1]' + Type: SHT_PROGBITS + Entries: + - Address: 0x20 + Size: 0x8 + Link: .text.baz + - Name: .rela.stack_sizes + Type: SHT_RELA + Info: .stack_sizes + Relocations: +## A symbol relative reference. + - Offset: 0 + Symbol: referenced_by_symbol_foo + Type: R_X86_64_64 +## A section relative reference. + - Offset: 9 + Addend: 16 + Symbol: .text + Type: R_X86_64_64 + - Name: '.rela.stack_sizes [1]' + Type: SHT_RELA + Info: '.stack_sizes [1]' + Relocations: + - Offset: 0 + Symbol: separate_text_section_baz + Type: R_X86_64_64 +Symbols: + - Name: separate_text_section_baz + Section: .text.baz + Type: STT_FUNC + - Name: .text + Section: .text + Type: STT_SECTION + - Name: referenced_by_symbol_foo + Section: .text + Type: STT_FUNC + Binding: STB_GLOBAL + - Name: referenced_via_section_bar + Section: .text + Value: 0x10 + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that we correctly report the stack sizes in an executable (non-relocatable) +## object file. + +# RUN: yaml2obj --docnum=2 %s > %t02 +# RUN: llvm-readelf --stack-sizes %t02 \ +# RUN: | FileCheck %s --check-prefix=EXEC-GNU --strict-whitespace --match-full-lines +# RUN: llvm-readobj --stack-sizes %t02 | FileCheck %s --check-prefix=EXEC-LLVM + +# EXEC-GNU: Size Function +# EXEC-GNU-NEXT: 16 foo +# EXEC-GNU-NEXT: 32 bar +# EXEC-GNU-NOT:{{.}} + +# EXEC-LLVM: StackSizes [ +# EXEC-LLVM-NEXT: Entry { +# EXEC-LLVM-NEXT: Function: foo +# EXEC-LLVM-NEXT: Size: 0x10 +# EXEC-LLVM-NEXT: } +# EXEC-LLVM-NEXT: Entry { +# EXEC-LLVM-NEXT: Function: bar +# EXEC-LLVM-NEXT: Size: 0x20 +# EXEC-LLVM-NEXT: } +# EXEC-LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Size: 16 + - Name: .stack_sizes + Type: SHT_PROGBITS + Entries: + - Address: 0x10 + Size: 0x10 + - Address: 0x20 + Size: 0x20 + Link: .text +Symbols: + - Name: foo + Section: .text + Value: 0x10 + Type: STT_FUNC + Binding: STB_GLOBAL + - Name: bar + Section: .text + Value: 0x20 + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that we report an error when we find relocations whose offsets point outside +## of the .stack_sizes section. + +# RUN: yaml2obj --docnum=3 %s > %t03 +# RUN: not llvm-readelf --stack-sizes %t03 2>&1 | FileCheck %s --check-prefix=SHORT -DFILE=%t03 +# RUN: not llvm-readobj --stack-sizes %t03 2>&1 | FileCheck %s --check-prefix=SHORT -DFILE=%t03 + +# SHORT: error: '[[FILE]]': found invalid relocation offset into section .stack_sizes while trying to extract a stack size entry + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Size: 16 + - Name: .stack_sizes + Type: SHT_PROGBITS + Content: "00" + Link: .text + - Name: .rela.stack_sizes + Type: SHT_RELA + Info: .stack_sizes + Relocations: + - Offset: 1 + Symbol: foo + Type: R_X86_64_64 +Symbols: + - Name: foo + Section: .text + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that we warn about a function symbol that is not in the section +## that is referenced by the stack sizes section's sh_link. + +# RUN: yaml2obj --docnum=4 %s > %t04 +# RUN: llvm-readelf --stack-sizes %t04 2> %t04-gnu.err | FileCheck %s --check-prefix=WRONGSECTION-GNU +# RUN: FileCheck %s < %t04-gnu.err --check-prefix=WRONGSECTION-ERR -DFILE=%t04 +# RUN: llvm-readobj --stack-sizes %t04 2> %t04-llvm.err | FileCheck %s --check-prefix=WRONGSECTION-LLVM +# RUN: FileCheck %s < %t04-llvm.err --check-prefix=WRONGSECTION-ERR -DFILE=%t04 + +# RUN: llvm-readelf --stack-sizes --demangle %t04 2>&1 | FileCheck %s --check-prefix=WRONGSECTION-DEMANGLE-ERR -DFILE=%t04 +# RUN: llvm-readobj --stack-sizes --demangle %t04 2>&1 | FileCheck %s --check-prefix=WRONGSECTION-DEMANGLE-ERR -DFILE=%t04 + +# WRONGSECTION-GNU: Size Function +# WRONGSECTION-GNU-NEXT: 8 _Z3foof + +# WRONGSECTION-LLVM: StackSizes [ +# WRONGSECTION-LLVM-NEXT: Entry { +# WRONGSECTION-LLVM-NEXT: Function: _Z3foof +# WRONGSECTION-LLVM-NEXT: Size: 0x8 +# WRONGSECTION-LLVM-NEXT: } +# WRONGSECTION-LLVM-NEXT: ] + +# WRONGSECTION-ERR: warning: '[[FILE]]': relocation symbol '_Z3foof' is not in the expected section +# WRONGSECTION-DEMANGLE-ERR: warning: '[[FILE]]': relocation symbol 'foo(float)' is not in the expected section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 8 + - Name: .text2 + Type: SHT_PROGBITS + Size: 8 + Flags: [SHF_ALLOC] + - Name: .stack_sizes + Type: SHT_PROGBITS + Entries: + - Size: 0x8 + Link: .text2 + - Name: .rela.stack_sizes + Type: SHT_RELA + Info: .stack_sizes + Relocations: + - Offset: 0 + Symbol: _Z3foof + Type: R_X86_64_64 +Symbols: + - Name: _Z3foof + Section: .text + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that we report an error when a stack sizes section ends with an incomplete stack size entry. + +# RUN: yaml2obj --docnum=5 %s > %t05 +# RUN: not llvm-readelf --stack-sizes %t05 2>&1 | \ +# RUN: FileCheck %s --check-prefix=SUDDENEND -DFILE=%t05 +# RUN: not llvm-readobj --stack-sizes %t05 2>&1 | \ +# RUN: FileCheck %s --check-prefix=SUDDENEND -DFILE=%t05 + +# SUDDENEND: error: '[[FILE]]': section .stack_sizes ended while trying to extract a stack size entry + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Size: 16 + - Name: .stack_sizes + Type: SHT_PROGBITS + Content: "10000000" + Link: .text +Symbols: + - Name: foo + Section: .text + Value: 0x10 + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that we report an invalid stack size, which is represented by a ULEB that +## ends in a byte with the high bit set. + +# RUN: yaml2obj --docnum=6 %s > %t06 +# RUN: not llvm-readelf --stack-sizes %t06 2>&1 | FileCheck %s --check-prefix=BADSIZE -DFILE=%t06 +# RUN: not llvm-readobj --stack-sizes %t06 2>&1 | FileCheck %s --check-prefix=BADSIZE -DFILE=%t06 + +# BADSIZE: error: '[[FILE]]': could not extract a valid stack size in section .stack_sizes + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Size: 16 + - Name: .stack_sizes + Type: SHT_PROGBITS + Content: "100000000000000080" + Link: .text +Symbols: + - Name: foo + Section: .text + Value: 0x10 + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that we report a warning when a relocation symbol does not belong to a +## valid section. We expect a stack size entry with an unknown symbol in the +## output. + +# RUN: yaml2obj --docnum=7 %s > %t07 +# RUN: llvm-readelf --stack-sizes %t07 2> %t07-gnu.err | FileCheck %s --check-prefix=BADSECTION-OUT-GNU +# RUN: FileCheck %s < %t07-gnu.err --check-prefix=BADSECTION-ERR -DFILE=%t07 +# RUN: llvm-readobj --stack-sizes %t07 2> %t07-llvm.err | FileCheck %s --check-prefix=BADSECTION-OUT-LLVM +# RUN: FileCheck %s < %t07-llvm.err --check-prefix=BADSECTION-ERR -DFILE=%t07 + +# RUN: llvm-readelf --stack-sizes --demangle %t07 2>&1 | FileCheck %s --check-prefix=BADSECTION-DEMANGLE-ERR -DFILE=%t07 +# RUN: llvm-readobj --stack-sizes --demangle %t07 2>&1 | FileCheck %s --check-prefix=BADSECTION-DEMANGLE-ERR -DFILE=%t07 + +# BADSECTION-OUT-GNU: Size Function +# BADSECTION-OUT-GNU: 8 ? + +# BADSECTION-OUT-LLVM: StackSizes [ +# BADSECTION-OUT-LLVM-NEXT: Entry { +# BADSECTION-OUT-LLVM-NEXT: Function: ? +# BADSECTION-OUT-LLVM-NEXT: Size: 0x8 +# BADSECTION-OUT-LLVM-NEXT: } +# BADSECTION-OUT-LLVM-NEXT: ] + +# BADSECTION-ERR: warning: '[[FILE]]': cannot identify the section for relocation symbol '_Z3foof' +# BADSECTION-DEMANGLE-ERR: warning: '[[FILE]]': cannot identify the section for relocation symbol 'foo(float)' + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 8 + - Name: .stack_sizes + Type: SHT_PROGBITS + Link: .text + Entries: + - Size: 0x8 + - Name: .rela.stack_sizes + Type: SHT_RELA + Info: .stack_sizes + Relocations: + - Offset: 0 + Symbol: _Z3foof + Type: R_X86_64_64 +Symbols: + - Name: _Z3foof +## An invalid section index. + Index: 10 + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that we report a warning when a stack sizes section does not come with +## a corresponding relocation section. + +# RUN: yaml2obj --docnum=8 %s > %t08 +# RUN: llvm-readelf --stack-sizes %t08 2> %t08-gnu.err | FileCheck %s --check-prefix=NORELOCSECTION-OUT-GNU +# RUN: FileCheck %s < %t08-gnu.err --check-prefix=NORELOCSECTION-ERR -DFILE=%t08 +# RUN: llvm-readobj --stack-sizes %t08 2> %t08-llvm.err | FileCheck %s --check-prefix=NORELOCSECTION-OUT-LLVM +# RUN: FileCheck %s < %t08-llvm.err --check-prefix=NORELOCSECTION-ERR -DFILE=%t08 + +# NORELOCSECTION-OUT-GNU: Size Function +# NORELOCSECTION-OUT-GNU-NOT: {{.}} + +# NORELOCSECTION-OUT-LLVM: StackSizes [ +# NORELOCSECTION-OUT-LLVM-NEXT: ] + +# NORELOCSECTION-ERR: warning: '[[FILE]]': section .stack_sizes does not have a corresponding relocation section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 8 + - Name: .stack_sizes + Type: SHT_PROGBITS + Link: .text + Entries: + - Size: 0x1 + +## Check that we handle multiple object files, separately and when they +## are in an archive. This also checks whether we have blank lines between the +## tables. + +# RUN: llvm-ar rc %t1.a %t01 %t02 +# RUN: llvm-readelf --stack-sizes %t01 %t02 \ +# RUN: | FileCheck %s --check-prefixes=MULTIPLE-GNU,OBJECT -DFILE1=%t01 -DFILE2=%t02 +# RUN: llvm-readelf --stack-sizes %t1.a \ +# RUN: | FileCheck %s --check-prefixes=MULTIPLE-GNU,ARCHIVE --strict-whitespace\ +# RUN: --match-full-lines -DFILE=%t1.a +# RUN: llvm-readobj --stack-sizes %t01 %t02 \ +# RUN: | FileCheck %s --check-prefixes=MULTIPLE-LLVM,OBJECT -DFILE1=%t01 -DFILE2=%t02 +# RUN: llvm-readobj --stack-sizes %t1.a \ +# RUN: | FileCheck %s --check-prefixes=MULTIPLE-LLVM,ARCHIVE -DFILE=%t1.a + +# OBJECT:File: [[FILE1]] +# ARCHIVE:File: [[FILE]]({{.*01}}) + +# MULTIPLE-GNU:Stack Sizes: +# MULTIPLE-GNU-NEXT: Size Function +# MULTIPLE-GNU-NEXT: 16 referenced_by_symbol_foo +# MULTIPLE-GNU-NEXT: 32 referenced_via_section_bar +# MULTIPLE-GNU-NEXT: 8 separate_text_section_baz +# MULTIPLE-GNU-EMPTY: + +# MULTIPLE-LLVM: StackSizes [ +# MULTIPLE-LLVM-NEXT: Entry { +# MULTIPLE-LLVM-NEXT: Function: referenced_by_symbol_foo +# MULTIPLE-LLVM-NEXT: Size: 0x10 +# MULTIPLE-LLVM-NEXT: } +# MULTIPLE-LLVM-NEXT: Entry { +# MULTIPLE-LLVM-NEXT: Function: referenced_via_section_bar +# MULTIPLE-LLVM-NEXT: Size: 0x20 +# MULTIPLE-LLVM-NEXT: } +# MULTIPLE-LLVM-NEXT: Entry { +# MULTIPLE-LLVM-NEXT: Function: separate_text_section_baz +# MULTIPLE-LLVM-NEXT: Size: 0x8 +# MULTIPLE-LLVM-NEXT: } +# MULTIPLE-LLVM-NEXT: ] + +# OBJECT:File: [[FILE2]] +# ARCHIVE:File: [[FILE]]({{.*02}}) + +# MULTIPLE-GNU-EMPTY: +# MULTIPLE-GNU-NEXT:Stack Sizes: +# MULTIPLE-GNU-NEXT: Size Function +# MULTIPLE-GNU-NEXT: 16 foo +# MULTIPLE-GNU-NEXT: 32 bar + +# MULTIPLE-LLVM: StackSizes [ +# MULTIPLE-LLVM-NEXT: Entry { +# MULTIPLE-LLVM-NEXT: Function: foo +# MULTIPLE-LLVM-NEXT: Size: 0x10 +# MULTIPLE-LLVM-NEXT: } +# MULTIPLE-LLVM-NEXT: Entry { +# MULTIPLE-LLVM-NEXT: Function: bar +# MULTIPLE-LLVM-NEXT: Size: 0x20 +# MULTIPLE-LLVM-NEXT: } +# MULTIPLE-LLVM-NEXT: ] + +## Check that we do not consider symbols that are not function symbols, even though +## a relocation references them. + +# RUN: yaml2obj --docnum=9 %s > %t14 +# RUN: llvm-readelf --stack-sizes %t14 2> %t14-gnu.err | FileCheck %s --check-prefix=NONFUNCTIONSYM-GNU +# RUN: FileCheck %s < %t14-gnu.err --check-prefix=NONFUNCTIONSYM-ERR -DFILE=%t14 +# RUN: llvm-readobj --stack-sizes %t14 2> %t14-llvm.err | FileCheck %s --check-prefix=NONFUNCTIONSYM-LLVM +# RUN: FileCheck %s < %t14-llvm.err --check-prefix=NONFUNCTIONSYM-ERR -DFILE=%t14 + +# NONFUNCTIONSYM-GNU: Stack Sizes: +# NONFUNCTIONSYM-GNU: 0 ? + +# NONFUNCTIONSYM-LLVM: StackSizes [ +# NONFUNCTIONSYM-LLVM-NEXT: Entry { +# NONFUNCTIONSYM-LLVM-NEXT: Function: ? +# NONFUNCTIONSYM-LLVM-NEXT: Size: 0x0 +# NONFUNCTIONSYM-LLVM-NEXT: } +# NONFUNCTIONSYM-LLVM-NEXT: ] + +# NONFUNCTIONSYM-ERR: warning: '[[FILE]]': could not identify function symbol for stack size entry + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 16 + - Name: .stack_sizes + Type: SHT_PROGBITS + Entries: + - Size: 0 + Link: .text + - Name: .rela.stack_sizes + Type: SHT_RELA + Info: .stack_sizes + Relocations: + - Offset: 0 + Symbol: foo + Type: R_X86_64_64 +Symbols: + - Name: foo + Section: .text + Type: STT_OBJECT + Binding: STB_GLOBAL + +## Check that we report an error when we find an unsupported relocation +## in the section that contains the stack size entries' relocations. + +# RUN: yaml2obj --docnum=10 %s > %t15 +# RUN: not llvm-readelf --stack-sizes %t15 2>&1 | FileCheck %s --check-prefix=UNSUPPRELOC -DFILE=%t15 +# RUN: not llvm-readobj --stack-sizes %t15 2>&1 | FileCheck %s --check-prefix=UNSUPPRELOC -DFILE=%t15 + +# UNSUPPRELOC: error: '[[FILE]]': unsupported relocation type in section .rela.stack_sizes: R_X86_64_RELATIVE + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 8 + - Name: .stack_sizes + Type: SHT_PROGBITS + Link: .text + Entries: [] + - Name: .rela.stack_sizes + Type: SHT_RELA + Info: .stack_sizes + Relocations: + - Offset: 0 + Symbol: foo + Type: R_X86_64_RELATIVE +Symbols: + - Name: foo + Section: .text + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that warning messages in archives do not impact other members. In the following +## test, the first archive member generates a warning and we make sure all the information +## is still dumped. + +# RUN: llvm-ar rc %t2.a %t04 %t01 +# RUN: llvm-readelf --stack-sizes %t2.a 2>&1 | FileCheck %s --check-prefix=ARCHIVEWARN-GNU \ +# RUN: -DFILE=%t2.a --strict-whitespace --match-full-lines +# RUN: llvm-readobj --stack-sizes %t2.a 2>&1 | FileCheck %s --check-prefix=ARCHIVEWARN-LLVM -DFILE=%t2.a + +# ARCHIVEWARN-GNU:File: [[FILE]]({{.*04}}) +# ARCHIVEWARN-GNU:Stack Sizes: +# ARCHIVEWARN-GNU-NEXT: Size Function +# ARCHIVEWARN-GNU:{{.*}}: warning: '{{.*04}}': relocation symbol '_Z3foof' is not in the expected section +# ARCHIVEWARN-GNU: 8 _Z3foof +# ARCHIVEWARN-GNU:File: [[FILE]]({{.*01}}) +# ARCHIVEWARN-GNU:Stack Sizes: +# ARCHIVEWARN-GNU-NEXT: Size Function +# ARCHIVEWARN-GNU-NEXT: 16 referenced_by_symbol_foo +# ARCHIVEWARN-GNU-NEXT: 32 referenced_via_section_bar +# ARCHIVEWARN-GNU-NEXT: 8 separate_text_section_baz +# ARCHIVEWARN-GNU-NOT:{{.}} + + +# ARCHIVEWARN-LLVM: File: [[FILE]]({{.*04}}) +# ARCHIVEWARN-LLVM: StackSizes [ +# ARCHIVEWARN-LLVM: warning: '{{.*04}}': relocation symbol '_Z3foof' is not in the expected section +# ARCHIVEWARN-LLVM-NEXT: Entry { +# ARCHIVEWARN-LLVM-NEXT: Function: _Z3foof +# ARCHIVEWARN-LLVM-NEXT: Size: 0x8 +# ARCHIVEWARN-LLVM-NEXT: } +# ARCHIVEWARN-LLVM-NEXT: ] +# ARCHIVEWARN-LLVM: File: [[FILE]]({{.*01}}) +# ARCHIVEWARN-LLVM: StackSizes [ +# ARCHIVEWARN-LLVM-NEXT: Entry { +# ARCHIVEWARN-LLVM-NEXT: Function: referenced_by_symbol_foo +# ARCHIVEWARN-LLVM-NEXT: Size: 0x10 +# ARCHIVEWARN-LLVM-NEXT: } +# ARCHIVEWARN-LLVM-NEXT: Entry { +# ARCHIVEWARN-LLVM-NEXT: Function: referenced_via_section_bar +# ARCHIVEWARN-LLVM-NEXT: Size: 0x20 +# ARCHIVEWARN-LLVM-NEXT: } +# ARCHIVEWARN-LLVM-NEXT: Entry { +# ARCHIVEWARN-LLVM-NEXT: Function: separate_text_section_baz +# ARCHIVEWARN-LLVM-NEXT: Size: 0x8 +# ARCHIVEWARN-LLVM-NEXT: } +# ARCHIVEWARN-LLVM-NEXT: ] + +## Check that we demangle function names when requested. + +# RUN: yaml2obj --docnum=11 %s > %t16 +# RUN: llvm-readelf --stack-sizes --demangle %t16 | FileCheck %s --check-prefix=DEMANGLE-GNU +# RUN: llvm-readobj --stack-sizes --demangle %t16 | FileCheck %s --check-prefix=DEMANGLE-LLVM + +# DEMANGLE-GNU: 16 foo(float) +# DEMANGLE-LLVM: Function: foo(float) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [SHF_ALLOC] + Size: 16 + - Name: .stack_sizes + Type: SHT_PROGBITS + Entries: + - Address: 0x10 + Size: 0x10 + Link: .text +Symbols: + - Name: _Z3foof + Section: .text + Value: 0x10 + Type: STT_FUNC + Binding: STB_GLOBAL + +## Check that we report an error when we are unable to resolve a relocation for a given ELF architecture. +## Here we have a 64-bit relocation used in a 32-bit object. + +# RUN: yaml2obj --docnum=12 %s > %t17 +# RUN: not llvm-readelf --stack-sizes %t17 2>&1 | FileCheck %s -DFILE=%t17 --check-prefix=UNSUPPRELOC2 +# RUN: not llvm-readobj --stack-sizes %t17 2>&1 | FileCheck %s -DFILE=%t17 --check-prefix=UNSUPPRELOC2 + +# UNSUPPRELOC2: error: '[[FILE]]': unsupported relocation type in section .rela.stack_sizes: R_X86_64_64 + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .stack_sizes + Type: SHT_PROGBITS + Content: "00" + - Name: .rela.stack_sizes + Type: SHT_RELA + Info: .stack_sizes + Relocations: + - Offset: 0 + Type: R_X86_64_64 + +## Check we report an error when dumping stack sizes if the relocated section +## identified by the sh_info field is invalid. Here the sh_info value is larger than +## the number of sections. + +# RUN: yaml2obj --docnum=13 %s > %t18 +# RUN: not llvm-readelf --stack-sizes %t18 2>&1 | FileCheck %s -DFILE=%t18 --check-prefix=INVALID-TARGET +# RUN: not llvm-readobj --stack-sizes %t18 2>&1 | FileCheck %s -DFILE=%t18 --check-prefix=INVALID-TARGET + +# INVALID-TARGET: error: '[[FILE]]': .rela.stack_sizes: failed to get a relocated section: invalid section index: 255 + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .rela.stack_sizes + Type: SHT_RELA + Link: 0 + Info: 0xFF + Relocations: [] diff --git a/llvm/test/tools/llvm-readobj/ELF/string-dump-multi.s b/llvm/test/tools/llvm-readobj/ELF/string-dump-multi.s new file mode 100644 index 00000000000..29d7ef01100 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/string-dump-multi.s @@ -0,0 +1,21 @@ +# REQUIRES: x86-registered-target + +# RUN: llvm-mc -filetype=obj -triple x86_64 %s -o %t.o +# RUN: llvm-readobj -p .a -p .b %t.o | FileCheck %s +# RUN: llvm-readelf -p .a -p .b %t.o | FileCheck %s + +# CHECK: String dump of section '.a': +# CHECK-NEXT: [ 0] 0 +# CHECK-EMPTY: +# CHECK-NEXT: String dump of section '.b': +# CHECK-NEXT: [ 0] 1 +# CHECK-EMPTY: +# CHECK-NEXT: String dump of section '.a': +# CHECK-NEXT: [ 0] 2 + +.section .a,"a",@progbits,unique,0 +.asciz "0" +.section .b,"a",@progbits +.asciz "1" +.section .a,"a",@progbits,unique,1 +.asciz "2" diff --git a/llvm/test/tools/llvm-readobj/ELF/string-dump.test b/llvm/test/tools/llvm-readobj/ELF/string-dump.test new file mode 100644 index 00000000000..cfd9a03ed6c --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/string-dump.test @@ -0,0 +1,75 @@ +# Check the dumping of a section as strings. +# RUN: yaml2obj %s > %t + +# RUN: llvm-readobj --string-dump=.strings \ +# RUN: --string-dump=.not_null_terminated %t > %t.readobj.out +# RUN: FileCheck %s --input-file=%t.readobj.out + +# Also test the different ways --string-dump can be specified, i.e. as a short +# flag (-p), with different prefix modes (-p .foo, -p=.foo, -p.foo), and with +# the value being a index section number instead of a section name. +# RUN: llvm-readobj -p=.strings -p=.not_null_terminated %t > %t.readobj.1 +# RUN: llvm-readobj -p.strings -p.strings -p.not_null_terminated %t > %t.readobj.2 +# RUN: llvm-readobj --string-dump=1 --string-dump=2 %t > %t.readobj.3 +# RUN: llvm-readobj -p1 -p1 -p2 %t > %t.readobj.4 +# RUN: llvm-readobj -p=1 -p=2 %t > %t.readobj.5 + +# RUN: cmp %t.readobj.out %t.readobj.1 +# RUN: cmp %t.readobj.out %t.readobj.2 +# RUN: cmp %t.readobj.out %t.readobj.3 +# RUN: cmp %t.readobj.out %t.readobj.4 +# RUN: cmp %t.readobj.out %t.readobj.5 + +# Run readelf flag tests with an additional flag, --file-header, so we can test +# -p grouped with something. +# RUN: llvm-readelf --file-header --string-dump=.strings \ +# RUN: --string-dump=.not_null_terminated %t > %t.readelf.out +# RUN: FileCheck %s --input-file=%t.readelf.out + +# RUN: llvm-readelf -h -p=.strings -p=.not_null_terminated %t > %t.readelf.1 +# RUN: llvm-readelf -p.strings -hp.not_null_terminated %t > %t.readelf.2 +# RUN: llvm-readelf -h --string-dump=1 --string-dump=2 %t > %t.readelf.3 +# RUN: llvm-readelf -hp1 -p2 %t > %t.readelf.4 +# RUN: llvm-readelf -hp 1 -p.not_null_terminated %t > %t.readelf.5 +# RUN: llvm-readelf -p=1 -hp=2 %t > %t.readelf.6 + +# RUN: cmp %t.readelf.out %t.readelf.1 +# RUN: cmp %t.readelf.out %t.readelf.2 +# RUN: cmp %t.readelf.out %t.readelf.3 +# RUN: cmp %t.readelf.out %t.readelf.4 +# RUN: cmp %t.readelf.out %t.readelf.5 +# RUN: cmp %t.readelf.out %t.readelf.6 + +# CHECK: String dump of section '.strings': +# CHECK-NEXT: [ 0] here +# CHECK-NEXT: [ 5] are +# CHECK-NEXT: [ 9] some +# CHECK-NEXT: [ e] strings +# CHECK-EMPTY: +# CHECK-NEXT: String dump of section '.not_null_terminated': +# CHECK-NEXT: [ 0] no +# CHECK-NEXT: [ 3] null{{$}} +# CHECK-NOT: {{.}} + +# RUN: llvm-readobj --string-dump=does_not_exist %t 2>&1 | FileCheck -DFILE=%t %s --check-prefix=WARN1 +# RUN: llvm-readobj --string-dump=42 %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=WARN2 + +# RUN: llvm-readelf --string-dump=does_not_exist %t 2>&1 | FileCheck -DFILE=%t %s --check-prefix=WARN1 +# RUN: llvm-readelf --string-dump=42 %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=WARN2 + +# WARN1: warning: '[[FILE]]': could not find section 'does_not_exist' +# WARN2: warning: '[[FILE]]': could not find section 42 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .strings + Type: SHT_PROGBITS + Content: 686572650061726500736f6d6500737472696e677300 + - Name: .not_null_terminated + Type: SHT_PROGBITS + Content: 6e6f006e756c6c diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-64bit.test b/llvm/test/tools/llvm-readobj/ELF/symbol-64bit.test new file mode 100644 index 00000000000..dbd8f0e54b6 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/symbol-64bit.test @@ -0,0 +1,23 @@ +# Show that both GNU and LLVM styles can properly print symbol values and sizes +# that do not fit in 32-bit integers. + +# RUN: yaml2obj %s > %t +# RUN: llvm-readobj --symbols %t | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --symbols %t | FileCheck %s --check-prefix=GNU + +# LLVM: Name: a_sym +# LLVM-NEXT: Value: 0xFEDCBA9876543210 +# LLVM-NEXT: Size: 81985529216486895 + +# GNU: 1: fedcba9876543210 81985529216486895 {{.*}} a_sym + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Symbols: + - Name: a_sym + Value: 0xfedcba9876543210 + Size: 0x0123456789abcdef diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-binding.test b/llvm/test/tools/llvm-readobj/ELF/symbol-binding.test new file mode 100644 index 00000000000..9ca5142abae --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/symbol-binding.test @@ -0,0 +1,59 @@ +# Show that llvm-readobj can print symbol bindings correctly for both LLVM and +# GNU styles, including for symbol bindings that are not recognised. + +# RUN: yaml2obj %s > %t +# RUN: llvm-readobj --symbols --dyn-symbols %t | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --symbols --dyn-symbols %t | FileCheck %s --check-prefix=GNU + +# LLVM: Name: local +# LLVM: Binding: Local +# LLVM: Name: global +# LLVM: Binding: Global +# LLVM: Name: weak +# LLVM: Binding: Weak +# LLVM: Name: unknown +# LLVM: Binding: 0x3 +# LLVM: Name: unique +# LLVM: Binding: Unique (0xA) +# LLVM: Name: os +# LLVM: Binding: 0xB +# LLVM: Name: proc +# LLVM: Binding: 0xF + +# GNU: 3 {{.*}} unknown +# GNU-NEXT: UNIQUE {{.*}} unique +# GNU-NEXT: b {{.*}} os +# GNU-NEXT: f {{.*}} proc +# GNU: LOCAL {{.*}} local +# GNU-NEXT: GLOBAL {{.*}} global +# GNU-NEXT: WEAK {{.*}} weak + +# yaml2obj doesn't have a way of specifying static symbols with custom bindings, +# so use a custom dynamic symbol table section instead. +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + #\0unknown\0unique\0os\0proc\0 + Content: "00756e6b6e6f776e00756e69717565006f730070726f6300" + - Name: .dynsym + Type: SHT_DYNSYM + Link: .dynstr + EntSize: 16 + # Null symbol + # Symbol with st_name = 1, binding = 0x3 + # Symbol with st_name = 9, binding = 0xa + # Symbol with st_name = 16, binding = 0xb + # Symbol with st_name = 19, binding = 0xf + Content: "0000000000000000000000000000000001000000000000000000000030000000090000000000000000000000a0000000100000000000000000000000b0000000130000000000000000000000f0000000" +Symbols: + - Name: local + - Name: global + Binding: STB_GLOBAL + - Name: weak + Binding: STB_WEAK diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test b/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test new file mode 100644 index 00000000000..ab01da9c842 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test @@ -0,0 +1,187 @@ +## Show that llvm-readobj prints symbol shndxes correctly, for valid indexes, +## invalid indexes (i.e. section indexes that don't correspond to a real +## section), reserved values and processor/os-specific index values, for both GNU +## and LLVM styles. + +# RUN: yaml2obj --docnum=1 %s > %t1 +# RUN: llvm-readobj --symbols %t1 | FileCheck %s --check-prefix=LLVM1 +# RUN: llvm-readelf --symbols %t1 | FileCheck %s --check-prefix=GNU1 + +# LLVM1: Name: undef +# LLVM1: Section: +# LLVM1-SAME: Undefined (0x0) +# LLVM1: Name: normal +# LLVM1: Section: +# LLVM1-SAME: .text (0x1) +# LLVM1: Name: common +# LLVM1: Section: +# LLVM1-SAME: Common (0xFFF2) +# LLVM1: Name: absolute +# LLVM1: Section: +# LLVM1-SAME: Absolute (0xFFF1) +# LLVM1: Name: proc +# LLVM1: Section: +# LLVM1-SAME: Processor Specific (0xFF01) +# LLVM1: Name: os +# LLVM1: Section: +# LLVM1-SAME: Operating System Specific (0xFF21) +# LLVM1: Name: reserved +# LLVM1: Section: +# LLVM1-SAME: Reserved (0xFFFE) +# LLVM1: Name: xindex +# LLVM1: Section: +# LLVM1: .text (0x1) + +# GNU1: Symbol table '.symtab' contains 9 entries: +# GNU1-NEXT: Num: {{.*}} Ndx Name +# GNU1-NEXT: 0: {{.*}} UND +# GNU1-NEXT: 1: {{.*}} UND undef +# GNU1-NEXT: 2: {{.*}} 1 normal +# GNU1-NEXT: 3: {{.*}} COM common +# GNU1-NEXT: 4: {{.*}} ABS absolute +# GNU1-NEXT: 5: {{.*}} PRC[0xff01] proc +# GNU1-NEXT: 6: {{.*}} OS[0xff21] os +# GNU1-NEXT: 7: {{.*}} RSV[0xfffe] reserved +# GNU1-NEXT: 8: {{.*}} 1 xindex + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .text + Type: SHT_PROGBITS + - Name: .symtab_shndx + Type: SHT_SYMTAB_SHNDX + Link: .symtab + Entries: [ 0, 0, 0, 0, 0, 0, 0, 0, 1 ] +Symbols: + - Name: undef + Binding: STB_GLOBAL + - Name: normal + Section: .text + Binding: STB_GLOBAL + - Name: common + Index: SHN_COMMON + Binding: STB_GLOBAL + - Name: absolute + Index: SHN_ABS + Binding: STB_GLOBAL + - Name: proc + Index: 0xff01 + Binding: STB_GLOBAL + - Name: os + Index: 0xff21 + Binding: STB_GLOBAL + - Name: reserved + Index: 0xfffe + Binding: STB_GLOBAL + - Name: xindex + Index: SHN_XINDEX + Binding: STB_GLOBAL + +## In this case, the index does not correspond to a real section. Check that GNU +## style just prints the section index as normal and LLVM style prints a warning +## (but only once for each warning). +# RUN: yaml2obj --docnum=2 %s > %t2 +# RUN: llvm-readobj --symbols %t2 2> %t2.llvm.err | FileCheck %s --check-prefix=LLVM2 +# RUN: FileCheck %s --input-file=%t2.llvm.err --check-prefix=BAD-SHNDX --implicit-check-not=warning +# RUN: llvm-readelf --symbols %t2 2> %t2.gnu.err | FileCheck %s --check-prefix=GNU2 +# RUN: FileCheck %s --input-file=%t2.gnu.err --allow-empty --implicit-check-not={{.}} + +# LLVM2: Name: bad +# LLVM2: Section: +# LLVM2-SAME: <?> (0x42) +# LLVM2: Name: bad2 +# LLVM2: Section: +# LLVM2-SAME: <?> (0x42) +# LLVM2: Name: bad3 +# LLVM2: Section: +# LLVM2-SAME: <?> (0x43) +# LLVM2: Name: invalid_shndx +# LLVM2: Section: +# LLVM2-SAME: <?> (0x9) +# LLVM2: Name: invalid_shndx2 +# LLVM2: Section: +# LLVM2-SAME: <?> (0x9) +# LLVM2: Name: invalid_shndx3 +# LLVM2: Section: +# LLVM2-SAME: <?> (0xA) + +# GNU2: Symbol table '.symtab' contains 7 entries: +# GNU2-NEXT: Num: {{.*}} Ndx Name +# GNU2-NEXT: 0: {{.*}} UND +# GNU2-NEXT: 1: {{.*}} 66 bad +# GNU2-NEXT: 2: {{.*}} 66 bad2 +# GNU2-NEXT: 3: {{.*}} 67 bad3 +# GNU2-NEXT: 4: {{.*}} 9 invalid_shndx +# GNU2-NEXT: 5: {{.*}} 9 invalid_shndx2 +# GNU2-NEXT: 6: {{.*}} 10 invalid_shndx3 + +# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 66 +# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 67 +# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 9 +# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 10 + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .symtab_shndx + Type: SHT_SYMTAB_SHNDX + Link: .symtab + Entries: [ 0, 0, 0, 0, 9, 9, 10 ] +Symbols: + - Name: bad + Index: 0x42 + - Name: bad2 + Index: 0x42 + - Name: bad3 + Index: 0x43 + - Name: invalid_shndx + Index: SHN_XINDEX + - Name: invalid_shndx2 + Index: SHN_XINDEX + - Name: invalid_shndx3 + Index: SHN_XINDEX + +## In this case, the symtab shndx section is missing, so symbols with section +## indexes of SHN_XINDEX print as Reserved symbols. +# RUN: yaml2obj --docnum=3 %s > %t3 +# RUN: llvm-readobj --symbols %t3 2> %t3.llvm.err | FileCheck %s --check-prefix=LLVM3 +# RUN: FileCheck %s --input-file=%t3.llvm.err --check-prefix=NO-SYMTAB-SHNDX --implicit-check-not=warning +# RUN: llvm-readelf --symbols %t3 2> %t3.gnu.err | FileCheck %s --check-prefix=GNU3 +# RUN: FileCheck %s --input-file=%t3.gnu.err --check-prefix=NO-SYMTAB-SHNDX --implicit-check-not=warning + +# LLVM3: Name: no_shndx +# LLVM3: Section: +# LLVM3-SAME: Reserved (0xFFFF) +# LLVM3: Name: no_shndx2 +# LLVM3: Section: +# LLVM3-SAME: Reserved (0xFFFF) + +# GNU3: Symbol table '.symtab' contains 3 entries: +# GNU3-NEXT: Num: {{.*}} Ndx Name +# GNU3-NEXT: 0: {{.*}} UND +# GNU3-NEXT: 1: {{.*}} RSV[0xffff] no_shndx +# GNU3-NEXT: 2: {{.*}} RSV[0xffff] no_shndx2 + +# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': extended symbol index (1) is past the end of the SHT_SYMTAB_SHNDX section of size 0 +# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': extended symbol index (2) is past the end of the SHT_SYMTAB_SHNDX section of size 0 + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Symbols: + - Name: no_shndx + Index: SHN_XINDEX + - Name: no_shndx2 + Index: SHN_XINDEX diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-types.test b/llvm/test/tools/llvm-readobj/ELF/symbol-types.test new file mode 100644 index 00000000000..3d0ba4a4808 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/symbol-types.test @@ -0,0 +1,120 @@ +# Show that llvm-readobj can print the type of symbol for all known symbol types +# and also for unknown types, both in the os/processor specific ranges and not, +# for both GNU and LLVM styles. + +# RUN: yaml2obj %s > %t +# RUN: llvm-readobj --symbols %t | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --symbols %t | FileCheck %s --check-prefix=GNU + +# LLVM: Name: notype +# LLVM: Type: None +# LLVM: Name: object +# LLVM: Type: Object +# LLVM: Name: func +# LLVM: Type: Function +# LLVM: Name: .text +# LLVM: Type: Section +# LLVM: Name: file +# LLVM: Type: File +# LLVM: Name: common +# LLVM: Type: Common +# LLVM: Name: tls +# LLVM: Type: TLS +# LLVM: Name: gnu_ifunc +# LLVM: Type: GNU_IFunc + +# LLVM: Name: os_specific_11 +# LLVM: Type: OS Specific (0xB) +# LLVM: Name: os_specific_12 +# LLVM: Type: OS Specific (0xC) + +# LLVM: Name: proc_specific_13 +# LLVM: Type: Proc Specific (0xD) +# LLVM: Name: proc_specific_14 +# LLVM: Type: Proc Specific (0xE) +# LLVM: Name: proc_specific_15 +# LLVM: Type: Proc Specific (0xF) + +# LLVM: Name: unknown_7 +# LLVM: Type: Unknown (0x7) +# LLVM: Name: unknown_8 +# LLVM: Type: Unknown (0x8) +# LLVM: Name: unknown_9 +# LLVM: Type: Unknown (0x9) + +# GNU: NOTYPE {{.*}} notype +# GNU: OBJECT {{.*}} object +# GNU: FUNC {{.*}} func +# GNU: SECTION {{.*}} .text +# GNU: FILE {{.*}} file +# GNU: COMMON {{.*}} common +# GNU: TLS {{.*}} tls +# GNU: IFUNC {{.*}} gnu_ifunc +# GNU: <OS specific>: 11 {{.*}} os_specific_11 +# GNU: <OS specific>: 12 {{.*}} os_specific_12 +# GNU: <processor specific>: 13 {{.*}} proc_specific_13 +# GNU: <processor specific>: 14 {{.*}} proc_specific_14 +# GNU: <processor specific>: 15 {{.*}} proc_specific_15 +# GNU: <unknown>: 7 {{.*}} unknown_7 +# GNU: <unknown>: 8 {{.*}} unknown_8 +# GNU: <unknown>: 9 {{.*}} unknown_9 + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: notype + Type: STT_NOTYPE + Binding: STB_GLOBAL + - Name: object + Type: STT_OBJECT + Binding: STB_GLOBAL + - Name: func + Type: STT_FUNC + Binding: STB_GLOBAL + - Name: .text + Type: STT_SECTION + Section: .text + Binding: STB_GLOBAL + - Name: file + Type: STT_FILE + Binding: STB_GLOBAL + - Name: common + Type: STT_COMMON + Binding: STB_GLOBAL + - Name: tls + Type: STT_TLS + Binding: STB_GLOBAL + - Name: gnu_ifunc + Type: STT_GNU_IFUNC + Binding: STB_GLOBAL + - Name: os_specific_11 + Type: 11 + Binding: STB_GLOBAL + - Name: os_specific_12 + Type: 12 + Binding: STB_GLOBAL + - Name: proc_specific_13 + Type: 13 + Binding: STB_GLOBAL + - Name: proc_specific_14 + Type: 14 + Binding: STB_GLOBAL + - Name: proc_specific_15 + Type: 15 + Binding: STB_GLOBAL + - Name: unknown_7 + Type: 7 + Binding: STB_GLOBAL + - Name: unknown_8 + Type: 8 + Binding: STB_GLOBAL + - Name: unknown_9 + Type: 9 + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-visibility.test b/llvm/test/tools/llvm-readobj/ELF/symbol-visibility.test new file mode 100644 index 00000000000..bdc66d77472 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/symbol-visibility.test @@ -0,0 +1,87 @@ +## Show that llvm-readobj prints the symbol visibility where recognised, or +## something sensible when not, for both GNU and LLVM output. + +## Check how we dump symbols when they have only STV_* bits set for st_other. +## (This is the most common case). + +# RUN: yaml2obj --docnum=1 %s > %t1.o +# RUN: llvm-readobj --symbols %t1.o | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf --symbols %t1.o | FileCheck %s --strict-whitespace --check-prefix=GNU + +# LLVM: Name: default +# LLVM: Other: 0 +# LLVM: Name: internal +# LLVM: Other [ (0x1) +# LLVM-NEXT: STV_INTERNAL (0x1) +# LLVM-NEXT: ] +# LLVM: Name: hidden +# LLVM: Other [ (0x2) +# LLVM-NEXT: STV_HIDDEN (0x2) +# LLVM-NEXT: ] +# LLVM: Name: protected +# LLVM: Other [ (0x3) +# LLVM-NEXT: STV_PROTECTED (0x3) +# LLVM-NEXT: ] + +# GNU: Vis Ndx Name +# GNU-NEXT: DEFAULT UND +# GNU-NEXT: DEFAULT UND default +# GNU-NEXT: INTERNAL UND internal +# GNU-NEXT: HIDDEN UND hidden +# GNU-NEXT: PROTECTED UND protected + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Symbols: + - Name: default + Other: [ STV_DEFAULT ] + Binding: STB_GLOBAL + - Name: internal + Other: [ STV_INTERNAL ] + Binding: STB_GLOBAL + - Name: hidden + Other: [ STV_HIDDEN ] + Binding: STB_GLOBAL + - Name: protected + Other: [ STV_PROTECTED ] + Binding: STB_GLOBAL + +## Check the output when we have non-visibility bits set for at least one of the symbols. + +# RUN: yaml2obj --docnum=2 %s > %t2.o +# RUN: llvm-readobj --symbols %t2.o | FileCheck %s --check-prefixes=LLVM,LLVM-OTHER +# RUN: llvm-readelf --symbols %t2.o | FileCheck %s --strict-whitespace --check-prefix=GNU-OTHER + +# LLVM-OTHER: Name: other +# LLVM-OTHER: Other [ (0x4) +# LLVM-OTHER-NEXT: ] + +# GNU-OTHER: Vis Ndx Name +# GNU-OTHER-NEXT: DEFAULT UND +# GNU-OTHER-NEXT: DEFAULT UND default +# GNU-OTHER-NEXT: INTERNAL UND internal +# GNU-OTHER-NEXT: HIDDEN UND hidden +# GNU-OTHER-NEXT: PROTECTED UND protected +# GNU-OTHER-NEXT: DEFAULT [<other: 0x4>] UND other + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Symbols: + - Name: default + Other: [ STV_DEFAULT ] + - Name: internal + Other: [ STV_INTERNAL ] + - Name: hidden + Other: [ STV_HIDDEN ] + - Name: protected + Other: [ STV_PROTECTED ] + - Name: other + Other: [ 4 ] diff --git a/llvm/test/tools/llvm-readobj/ELF/thin-archive-paths.test b/llvm/test/tools/llvm-readobj/ELF/thin-archive-paths.test new file mode 100644 index 00000000000..2e2ec56b99d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/thin-archive-paths.test @@ -0,0 +1,33 @@ +# RUN: rm -rf %t +# RUN: mkdir -p %t/a/b +# RUN: cd %t +# RUN: cp %p/Inputs/trivial.obj.elf-x86-64 a/b/1.o +# The archive is deliberately in a different directory to the cwd, to show that +# the member paths printed are exactly what's in the archive and not relative +# to the cwd. +# RUN: llvm-ar rcT a/relative.a a/b/1.o + +# Show that relative paths in the file header printing look sensible. +# RUN: llvm-readobj --file-headers a/relative.a | FileCheck %s -DARFILE="a/relative.a" --check-prefix=REL +# REL: File: [[ARFILE]](b/1.o) + +# Show that relative paths in an error message for both archive and member look +# sensible. +# RUN: rm a/b/1.o +# RUN: not llvm-readobj --file-headers a/relative.a 2>&1 | FileCheck %s --check-prefix=ERR1 +# RUN: not llvm-readelf --file-headers a/relative.a 2>&1 | FileCheck %s --check-prefix=ERR1 +# ERR1: error: 'a/relative.a': 'b/1.o': {{[Nn]}}o such file or directory + +# RUN: mkdir -p %t/c +# RUN: cp %p/Inputs/trivial.obj.elf-x86-64 a/b/1.o +# RUN: llvm-ar rcT c/absolute.a %t/a/b/1.o + +# Show that absolute paths in the file header printing are correct. +# RUN: llvm-readobj --file-headers c/absolute.a | FileCheck %s --check-prefix=ABS -DARFILE="c/absolute.a" -DDIR=%/t +# ABS: File: [[ARFILE]]([[DIR]]/a/b/1.o) + +# Show that absolute paths in an error message for both archive and member are correct. +# RUN: rm a/b/1.o +# RUN: not llvm-readobj --file-headers %/t/c/absolute.a 2>&1 | FileCheck %s --check-prefix=ERR2 -DDIR=%/t +# RUN: not llvm-readelf --file-headers %/t/c/absolute.a 2>&1 | FileCheck %s --check-prefix=ERR2 -DDIR=%/t +# ERR2: error: '[[DIR]]/c/absolute.a': '[[DIR]]/a/b/1.o': {{[Nn]}}o such file or directory diff --git a/llvm/test/tools/llvm-readobj/ELF/types.test b/llvm/test/tools/llvm-readobj/ELF/types.test new file mode 100644 index 00000000000..aecbdeacde9 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/types.test @@ -0,0 +1,116 @@ +# Show that llvm-readobj can handle all standard ELF types. +# RUN: yaml2obj %s --docnum=1 -o %t.none +# RUN: llvm-readobj --file-headers %t.none | FileCheck %s --check-prefix=LLVM-NONE +# RUN: llvm-readelf --file-headers %t.none | FileCheck %s --check-prefix=GNU-NONE + +# LLVM-NONE: Type: None (0x0) +# GNU-NONE: Type: NONE (none) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_NONE + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=2 -o %t.rel +# RUN: llvm-readobj --file-headers %t.rel | FileCheck %s --check-prefix=LLVM-REL +# RUN: llvm-readelf --file-headers %t.rel | FileCheck %s --check-prefix=GNU-REL + +# LLVM-REL: Type: Relocatable (0x1) +# GNU-REL: Type: REL (Relocatable file) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + + +# RUN: yaml2obj %s --docnum=3 -o %t.exec +# RUN: llvm-readobj --file-headers %t.exec | FileCheck %s --check-prefix=LLVM-EXEC +# RUN: llvm-readelf --file-headers %t.exec | FileCheck %s --check-prefix=GNU-EXEC + +# LLVM-EXEC: Type: Executable (0x2) +# GNU-EXEC: Type: EXEC (Executable file) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=4 -o %t.so +# RUN: llvm-readobj --file-headers %t.so | FileCheck %s --check-prefix=LLVM-SO +# RUN: llvm-readelf --file-headers %t.so | FileCheck %s --check-prefix=GNU-SO + +# LLVM-SO: Type: SharedObject (0x3) +# GNU-SO: Type: DYN (Shared object file) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 + +# RUN: yaml2obj %s --docnum=5 -o %t.core +# RUN: llvm-readobj --file-headers %t.core | FileCheck %s --check-prefix=LLVM-CORE +# RUN: llvm-readelf --file-headers %t.core | FileCheck %s --check-prefix=GNU-CORE + +# LLVM-CORE: Type: Core (0x4) +# GNU-CORE: Type: CORE (Core file) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_X86_64 + +# Show that llvm-readobj can handle an unknown ELF type. +# RUN: yaml2obj %s --docnum=6 -o %t.unknown +# RUN: llvm-readobj --file-headers %t.unknown | FileCheck %s --check-prefix=LLVM-UNKNOWN +# RUN: llvm-readelf --file-headers %t.unknown | FileCheck %s --check-prefix=GNU-UNKNOWN + +# LLVM-UNKNOWN: Type: 0x42 +# GNU-UNKNOWN: Type: 42 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: 0x42 + Machine: EM_X86_64 + +# Show that llvm-readobj can handle an unknown OS-specific ELF type. +# RUN: yaml2obj %s --docnum=7 -o %t.os +# RUN: llvm-readobj --file-headers %t.os | FileCheck %s --check-prefix=LLVM-OS +# RUN: llvm-readelf --file-headers %t.os | FileCheck %s --check-prefix=GNU-OS + +# LLVM-OS: Type: 0xFE00 +# GNU-OS: Type: fe00 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: 0xfe00 + Machine: EM_X86_64 + +# Show that llvm-readobj can handle an unknown machine-specific ELF type. +# RUN: yaml2obj %s --docnum=8 -o %t.proc +# RUN: llvm-readobj --file-headers %t.proc | FileCheck %s --check-prefix=LLVM-PROC +# RUN: llvm-readelf --file-headers %t.proc | FileCheck %s --check-prefix=GNU-PROC + +# LLVM-PROC: Type: 0xFF00 +# GNU-PROC: Type: ff00 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: 0xff00 + Machine: EM_X86_64 diff --git a/llvm/test/tools/llvm-readobj/ELF/unwind.test b/llvm/test/tools/llvm-readobj/ELF/unwind.test new file mode 100644 index 00000000000..a9e34f7a294 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/unwind.test @@ -0,0 +1,217 @@ +# RUN: yaml2obj %s > %t.exe +# RUN: llvm-readobj --unwind %t.exe | FileCheck %s + +# CHECK: EHFrameHeader { +# CHECK-NEXT: Address: 0x4013c0 +# CHECK-NEXT: Offset: 0xbc +# CHECK-NEXT: Size: 0x3c +# CHECK-NEXT: Corresponding Section: .eh_frame_hdr +# CHECK-NEXT: Header { +# CHECK-NEXT: version: 1 +# CHECK-NEXT: eh_frame_ptr_enc: 0x1b +# CHECK-NEXT: fde_count_enc: 0x3 +# CHECK-NEXT: table_enc: 0x3b +# CHECK-NEXT: eh_frame_ptr: 0x401400 +# CHECK-NEXT: fde_count: 6 +# CHECK-NEXT: entry 0 { +# CHECK-NEXT: initial_location: 0x4004a0 +# CHECK-NEXT: address: 0x401448 +# CHECK-NEXT: } +# CHECK-NEXT: entry 1 { +# CHECK-NEXT: initial_location: 0x4004d0 +# CHECK-NEXT: address: 0x401418 +# CHECK-NEXT: } +# CHECK-NEXT: entry 2 { +# CHECK-NEXT: initial_location: 0x4005b6 +# CHECK-NEXT: address: 0x401470 +# CHECK-NEXT: } +# CHECK-NEXT: entry 3 { +# CHECK-NEXT: initial_location: 0x4005d0 +# CHECK-NEXT: address: 0x401490 +# CHECK-NEXT: } +# CHECK-NEXT: entry 4 { +# CHECK-NEXT: initial_location: 0x401250 +# CHECK-NEXT: address: 0x4014c0 +# CHECK-NEXT: } +# CHECK-NEXT: entry 5 { +# CHECK-NEXT: initial_location: 0x4012c0 +# CHECK-NEXT: address: 0x4014f0 +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT:} + +# CHECK: .eh_frame section at offset 0xf8 address 0x401400: +# CHECK-NEXT: [0x401400] CIE length=20 +# CHECK-NEXT: version: 1 +# CHECK-NEXT: augmentation: zR +# CHECK-NEXT: code_alignment_factor: 1 +# CHECK-NEXT: data_alignment_factor: -8 +# CHECK-NEXT: return_address_register: 16 + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8 +# CHECK-NEXT: DW_CFA_offset: reg16 -8 +# CHECK-NEXT: DW_CFA_undefined: reg16 + +# CHECK: [0x401418] FDE length=20 cie=[0x401400] +# CHECK-NEXT: initial_location: 0x4004d0 +# CHECK-NEXT: address_range: 0x2a (end : 0x4004fa) + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +# CHECK: [0x401430] CIE length=20 +# CHECK-NEXT: version: 1 +# CHECK-NEXT: augmentation: zR +# CHECK-NEXT: code_alignment_factor: 1 +# CHECK-NEXT: data_alignment_factor: -8 +# CHECK-NEXT: return_address_register: 16 + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8 +# CHECK-NEXT: DW_CFA_offset: reg16 -8 +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +# CHECK: [0x401448] FDE length=36 cie=[0x401430] +# CHECK-NEXT: initial_location: 0x4004a0 +# CHECK-NEXT: address_range: 0x20 (end : 0x4004c0) + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_def_cfa_offset: +16 +# CHECK-NEXT: DW_CFA_advance_loc: 6 +# CHECK-NEXT: DW_CFA_def_cfa_offset: +24 +# CHECK-NEXT: DW_CFA_advance_loc: 10 +# CHECK-NEXT: DW_CFA_def_cfa_expression: DW_OP_breg7 +8, DW_OP_breg16 +0, DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge, DW_OP_lit3, DW_OP_shl, DW_OP_plus +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +# CHECK: [0x401470] FDE length=28 cie=[0x401430] +# CHECK-NEXT: initial_location: 0x4005b6 +# CHECK-NEXT: address_range: 0x10 (end : 0x4005c6) + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_advance_loc: 1 +# CHECK-NEXT: DW_CFA_def_cfa_offset: +16 +# CHECK-NEXT: DW_CFA_offset: reg6 -16 +# CHECK-NEXT: DW_CFA_advance_loc: 3 +# CHECK-NEXT: DW_CFA_def_cfa_register: reg6 +# CHECK-NEXT: DW_CFA_advance_loc: 11 +# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8 +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +# CHECK: [0x401490] FDE length=44 cie=[0x401430] +# CHECK-NEXT: initial_location: 0x4005d0 +# CHECK-NEXT: address_range: 0xc7f (end : 0x40124f) + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_advance_loc: 5 +# CHECK-NEXT: DW_CFA_def_cfa: reg10 +0 +# CHECK-NEXT: DW_CFA_advance_loc: 9 +# CHECK-NEXT: DW_CFA_expression: reg6 DW_OP_breg6 +0 +# CHECK-NEXT: DW_CFA_advance_loc: 5 +# CHECK-NEXT: DW_CFA_def_cfa_expression: DW_OP_breg6 -8, DW_OP_deref +# CHECK-NEXT: DW_CFA_advance_loc2: 3174 +# CHECK-NEXT: DW_CFA_def_cfa: reg10 +0 +# CHECK-NEXT: DW_CFA_advance_loc: 5 +# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8 +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +# CHECK: [0x4014c0] FDE length=44 cie=[0x401430] +# CHECK-NEXT: initial_location: 0x401250 +# CHECK-NEXT: address_range: 0x66 (end : 0x4012b6) + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_advance_loc: 1 +# CHECK-NEXT: DW_CFA_def_cfa_offset: +16 +# CHECK-NEXT: DW_CFA_offset: reg6 -16 +# CHECK-NEXT: DW_CFA_advance_loc: 3 +# CHECK-NEXT: DW_CFA_def_cfa_register: reg6 +# CHECK-NEXT: DW_CFA_advance_loc: 2 +# CHECK-NEXT: DW_CFA_offset: reg15 -24 +# CHECK-NEXT: DW_CFA_advance_loc: 5 +# CHECK-NEXT: DW_CFA_offset: reg14 -32 +# CHECK-NEXT: DW_CFA_advance_loc: 7 +# CHECK-NEXT: DW_CFA_offset: reg13 -40 +# CHECK-NEXT: DW_CFA_offset: reg12 -48 +# CHECK-NEXT: DW_CFA_advance_loc: 8 +# CHECK-NEXT: DW_CFA_offset: reg3 -56 +# CHECK-NEXT: DW_CFA_advance_loc1: 75 +# CHECK-NEXT: DW_CFA_def_cfa: reg7 +8 +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +# CHECK: [0x4014f0] FDE length=20 cie=[0x401430] +# CHECK-NEXT: initial_location: 0x4012c0 +# CHECK-NEXT: address_range: 0x1 (end : 0x4012c1) + +# CHECK: Program: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: +# CHECK-NEXT: DW_CFA_nop: + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x0000000000400000 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000400000 + AddressAlign: 16 + Content: 50C704240020400031C05AC3 + - Name: .eh_frame_hdr + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + Address: 0x00000000004013c0 + AddressAlign: 4 + Content: 011B033B3C00000006000000E0F0FFFF8800000010F1FFFF58000000F6F1FFFFB000000010F2FFFFD000000090FEFFFF0001000000FFFFFF30010000 + - Name: .eh_frame + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + Address: 0x0000000000401400 + AddressAlign: 8 + Content: 1400000000000000017A5200017810011B0C070890010710140000001C000000B0F0FFFF2A00000000000000000000001400000000000000017A5200017810011B0C070890010000240000001C00000050F0FFFF20000000000E10460E184A0F0B770880003F1A3B2A332422000000001C000000440000003EF1FFFF1000000000410E108602430D064B0C07080000002C0000006400000038F1FFFF7F0C000000450C0A00491006027600450F0376780603660C0C0A00450C070800000000002C0000009400000088FDFFFF6600000000410E108602430D06428F03458E04478D058C06488307024B0C07080000000014000000C4000000C8FDFFFF01000000000000000000000000000000 +Symbols: + - Name: myfunc + Type: STT_FUNC + Section: .text + Value: 0x0000000000400000 + Binding: STB_GLOBAL +ProgramHeaders: + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + VAddr: 0x00400000 + PAddr: 0x00400000 + Sections: + - Section: .text + - Type: PT_GNU_EH_FRAME + Flags: [ PF_X, PF_R ] + VAddr: 0x004013C0 + PAddr: 0x004013C0 + Sections: + - Section: .eh_frame_hdr +... diff --git a/llvm/test/tools/llvm-readobj/ELF/verdef-invalid.test b/llvm/test/tools/llvm-readobj/ELF/verdef-invalid.test new file mode 100644 index 00000000000..f80e9383f70 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/verdef-invalid.test @@ -0,0 +1,310 @@ +## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verdef sections. + +## Check that we report a warning when sh_link references a non-existent section. + +# RUN: yaml2obj %s --docnum=1 -o %t1 +# RUN: llvm-readobj -V %t1 2>&1 | FileCheck %s --check-prefix=INVALID-LINK-LLVM --implicit-check-not="warning:" -DFILE=%t1 +# RUN: llvm-readelf -V %t1 2>&1 | FileCheck %s --check-prefix=INVALID-LINK-GNU --implicit-check-not="warning:" -DFILE=%t1 + +# INVALID-LINK-LLVM: warning: '[[FILE]]': invalid section linked to SHT_GNU_verdef section with index 1: invalid section index: 255 + +# INVALID-LINK-GNU: Version definition section '.gnu.version_d' contains 0 entries: +# INVALID-LINK-GNU: warning: '[[FILE]]': invalid section linked to SHT_GNU_verdef section with index 1: invalid section index: 255 +# INVALID-LINK-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Link: 0xFF + Info: 0x0 + Entries: [] + +## Check that we report a warning when the sh_link field of a SHT_GNU_verdef section references a non-string table section. + +# RUN: yaml2obj %s --docnum=2 -o %t2 +# RUN: llvm-readobj -V %t2 2>&1 | FileCheck %s --check-prefix=INVALID-STRING-TABLE -DFILE=%t2 +# RUN: llvm-readelf -V %t2 2>&1 | FileCheck %s --check-prefix=INVALID-STRING-TABLE -DFILE=%t2 + +# INVALID-STRING-TABLE: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verdef section with index 1: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Link: 0x0 + Info: 0x0 + Entries: [] + +## Check that we report a warning when we can't read the content of the SHT_GNU_verdef section. + +# RUN: yaml2obj %s --docnum=3 -o %t3 +# RUN: llvm-readobj -V %t3 2>&1 | FileCheck %s --check-prefix=INVALID-DATA -DFILE=%t3 +# RUN: llvm-readelf -V %t3 2>&1 | FileCheck %s --check-prefix=INVALID-DATA -DFILE=%t3 + +# INVALID-DATA: warning: '[[FILE]]': cannot read content of SHT_GNU_verdef section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x0) that is greater than the file size (0x230) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Link: .dynstr + Info: 0x0 + Entries: [] + ShOffset: 0xFFFFFFFF +DynamicSymbols: + - Name: foo + +## Check that we report a warning when a SHT_GNU_verdef section contains a version definition +## that goes past the end of the section. + +# RUN: yaml2obj %s --docnum=4 -o %t4 +# RUN: llvm-readobj -V %t4 2>&1 | FileCheck %s --check-prefix=DEF-PAST-END -DFILE=%t4 +# RUN: llvm-readelf -V %t4 2>&1 | FileCheck %s --check-prefix=DEF-PAST-END -DFILE=%t4 + +# DEF-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: version definition 1 goes past the end of the section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Link: .dynstr + Info: 0x1 + Entries: + - Version: 1 + Flags: 0 + VersionNdx: 0 + Hash: 0 + Names: + - FOO + ShSize: 1 +DynamicSymbols: + - Name: foo + +## Check that we report a warning when a SHT_GNU_verdef section contains a version definition +## that refers to an auxiliary entry that goes past the end of the section. + +# RUN: yaml2obj %s --docnum=5 -o %t5 +# RUN: llvm-readobj -V %t5 2>&1 | FileCheck %s --check-prefix=AUX-PAST-END -DFILE=%t5 +# RUN: llvm-readelf -V %t5 2>&1 | FileCheck %s --check-prefix=AUX-PAST-END -DFILE=%t5 + +# AUX-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: version definition 1 refers to an auxiliary entry that goes past the end of the section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Link: .dynstr + Info: 0x1 + Entries: + - Version: 1 + Flags: 0 + VersionNdx: 0 + Hash: 0 + Names: + - FOO + ShSize: 21 +DynamicSymbols: + - Name: foo + +## Check that we can dump a SHT_GNU_verdef section properly even if it contains version names strings +## that overrun the linked string table. + +# RUN: yaml2obj %s --docnum=6 -o %t6 +# RUN: llvm-readobj -V %t6 2>&1 | FileCheck %s --check-prefix=PAST-STRTAB-END-LLVM --implicit-check-not="warning:" -DFILE=%t6 +# RUN: llvm-readelf -V %t6 2>&1 | FileCheck %s --check-prefix=PAST-STRTAB-END-GNU --implicit-check-not="warning:" -DFILE=%t6 + +# PAST-STRTAB-END-LLVM: VersionDefinitions [ +# PAST-STRTAB-END-LLVM-NEXT: Definition { +# PAST-STRTAB-END-LLVM-NEXT: Version: 1 +# PAST-STRTAB-END-LLVM-NEXT: Flags [ (0x0) +# PAST-STRTAB-END-LLVM-NEXT: ] +# PAST-STRTAB-END-LLVM-NEXT: Index: 0 +# PAST-STRTAB-END-LLVM-NEXT: Hash: 0 +# PAST-STRTAB-END-LLVM-NEXT: Name: <invalid vda_name: 5> +# PAST-STRTAB-END-LLVM-NEXT: Predecessors: [] +# PAST-STRTAB-END-LLVM-NEXT: } +# PAST-STRTAB-END-LLVM-NEXT: ] + +# PAST-STRTAB-END-GNU: Version definition section '.gnu.version_d' contains 1 entries: +# PAST-STRTAB-END-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 (.strtab) +# PAST-STRTAB-END-GNU-NEXT: 0x0000: Rev: 1 Flags: none Index: 0 Cnt: 1 Name: <invalid vda_name: 5> + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Link: .strtab + Info: 0x1 + Entries: + - Version: 1 + Flags: 0 + VersionNdx: 0 + Hash: 0 + Names: + - FOO + - Name: .strtab + Type: SHT_STRTAB +DynamicSymbols: + - Name: BAR + +## Check we report a warning when a version definition is not correctly aligned in memory. + +# RUN: yaml2obj %s --docnum=7 -o %t7 +# RUN: llvm-readobj -V %t7 2>&1 | FileCheck %s --check-prefix=MISALIGNED-DEF -DFILE=%t7 +# RUN: llvm-readelf -V %t7 2>&1 | FileCheck %s --check-prefix=MISALIGNED-DEF -DFILE=%t7 + +# MISALIGNED-DEF: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: found a misaligned version definition entry at offset 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Type: Fill + Size: 0x1 + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Link: .dynstr + Info: 0x1 + Entries: + - Version: 1 + Flags: 0 + VersionNdx: 0 + Hash: 0 + Names: + - FOO +DynamicSymbols: + - Name: foo + +## Check we report a warning when an auxiliary entry is not correctly aligned in memory. + +# RUN: yaml2obj %s --docnum=8 -o %t8 +# RUN: llvm-readobj -V %t8 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t8 +# RUN: llvm-readelf -V %t8 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t8 + +# MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verdef section with index 1: found a misaligned auxiliary entry at offset 0x13 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Flags: [ SHF_ALLOC ] + Link: .dynstr + Info: 0x1 +## The byte offset to the auxiliary entry is 0x13, i.e. it is not correctly aligned in memory. + Content: "0100000000000100000000001300000000000000" +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL + +## Check how we handle a version definition entry with an unsupported version. + +# RUN: yaml2obj %s --docnum=9 -o %t9 +# RUN: llvm-readobj -V %t9 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t9 +# RUN: llvm-readelf -V %t9 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t9 + +# UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verdef section with index 1: version 65278 is not yet supported + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Link: .dynstr + Info: 0x1 + Entries: + - Version: 0xfefe + Flags: 0 + VersionNdx: 0 + Hash: 0 + Names: [] +DynamicSymbols: + - Name: foo + +## Check we error out when trying to print version symbols, but SHT_GNU_verdef is invalid due to any reason. + +# RUN: yaml2obj %s --docnum=10 -o %t10 +# RUN: not llvm-readobj -V %t10 2>&1 | FileCheck %s --check-prefix=INVALID-VERDEF-LLVM -DFILE=%t10 +# RUN: not llvm-readelf -V %t10 2>&1 | FileCheck %s --check-prefix=INVALID-VERDEF-GNU -DFILE=%t10 + +# INVALID-VERDEF-LLVM: VersionSymbols [ +# INVALID-VERDEF-LLVM-NEXT: Symbol { +# INVALID-VERDEF-LLVM-NEXT: Version: 0 +# INVALID-VERDEF-LLVM-NEXT: Name: +# INVALID-VERDEF-LLVM-NEXT: } +# INVALID-VERDEF-LLVM-NEXT: Symbol { +# INVALID-VERDEF-LLVM-NEXT: Version: 2 +# INVALID-VERDEF-LLVM-EMPTY: +# INVALID-VERDEF-LLVM-NEXT: error: '[[FILE]]': invalid SHT_GNU_verdef section with index 2: version definition 1 goes past the end of the section + +# INVALID-VERDEF-GNU: Version symbols section '.gnu.version' contains 2 entries: +# INVALID-VERDEF-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 5 (.dynsym) +# INVALID-VERDEF-GNU-NEXT: 000: 0 (*local*) +# INVALID-VERDEF-GNU-NEXT: error: '[[FILE]]': invalid SHT_GNU_verdef section with index 2: version definition 1 goes past the end of the section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + AddressAlign: 0x0000000000000002 + EntSize: 0x0000000000000002 + Entries: [ 0, 2 ] + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Flags: [ SHF_ALLOC ] + Link: .dynstr + AddressAlign: 0x4 + Info: 0x1 + Entries: [] +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-readobj/ELF/verneed-flags.yaml b/llvm/test/tools/llvm-readobj/ELF/verneed-flags.yaml new file mode 100644 index 00000000000..eedc7fe7ad7 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/verneed-flags.yaml @@ -0,0 +1,107 @@ +## Check how llvm-readobj/llvm-readelf tools dump the flags of SHT_GNU_verneed +## section entries. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj -V %t | FileCheck %s --check-prefix=LLVM-VERDEF +# RUN: llvm-readelf -V %t | FileCheck %s --check-prefix=GNU-VERDEF + +# LLVM-VERDEF: VersionRequirements [ +# LLVM-VERDEF-NEXT: Dependency { +# LLVM-VERDEF-NEXT: Version: 1 +# LLVM-VERDEF-NEXT: Count: 6 +# LLVM-VERDEF-NEXT: FileName: dso.so.0 +# LLVM-VERDEF-NEXT: Entries [ +# LLVM-VERDEF-NEXT: Entry { +# LLVM-VERDEF-NEXT: Hash: 0 +# LLVM-VERDEF-NEXT: Flags: Base (0x1) +# LLVM-VERDEF-NEXT: Index: 0 +# LLVM-VERDEF-NEXT: Name: base +# LLVM-VERDEF-NEXT: } +# LLVM-VERDEF-NEXT: Entry { +# LLVM-VERDEF-NEXT: Hash: 0 +# LLVM-VERDEF-NEXT: Flags: Weak (0x2) +# LLVM-VERDEF-NEXT: Index: 0 +# LLVM-VERDEF-NEXT: Name: weak +# LLVM-VERDEF-NEXT: } +# LLVM-VERDEF-NEXT: Entry { +# LLVM-VERDEF-NEXT: Hash: 0 +# LLVM-VERDEF-NEXT: Flags: Info (0x4) +# LLVM-VERDEF-NEXT: Index: 0 +# LLVM-VERDEF-NEXT: Name: info +# LLVM-VERDEF-NEXT: } +# LLVM-VERDEF-NEXT: Entry { +# LLVM-VERDEF-NEXT: Hash: 0 +# LLVM-VERDEF-NEXT: Flags: 0x7 +# LLVM-VERDEF-NEXT: Index: 0 +# LLVM-VERDEF-NEXT: Name: all +# LLVM-VERDEF-NEXT: } +# LLVM-VERDEF-NEXT: Entry { +# LLVM-VERDEF-NEXT: Hash: 0 +# LLVM-VERDEF-NEXT: Flags: 0x8 +# LLVM-VERDEF-NEXT: Index: 0 +# LLVM-VERDEF-NEXT: Name: unknown +# LLVM-VERDEF-NEXT: } +# LLVM-VERDEF-NEXT: Entry { +# LLVM-VERDEF-NEXT: Hash: 0 +# LLVM-VERDEF-NEXT: Flags: 0xF +# LLVM-VERDEF-NEXT: Index: 0 +# LLVM-VERDEF-NEXT: Name: all_and_unknown +# LLVM-VERDEF-NEXT: } +# LLVM-VERDEF-NEXT: ] +# LLVM-VERDEF-NEXT: } +# LLVM-VERDEF-NEXT: ] + +# GNU-VERDEF: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-VERDEF-NEXT: Addr: 0000000000000000 Offset: 0x000200 Link: 6 (.dynstr) +# GNU-VERDEF-NEXT: 0x0000: Version: 1 File: dso.so.0 Cnt: 6 +# GNU-VERDEF-NEXT: 0x0010: Name: base Flags: BASE Version: 0 +# GNU-VERDEF-NEXT: 0x0020: Name: weak Flags: WEAK Version: 0 +# GNU-VERDEF-NEXT: 0x0030: Name: info Flags: INFO Version: 0 +# GNU-VERDEF-NEXT: 0x0040: Name: all Flags: BASE | WEAK | INFO Version: 0 +# GNU-VERDEF-NEXT: 0x0050: Name: unknown Flags: <unknown> Version: 0 +# GNU-VERDEF-NEXT: 0x0060: Name: all_and_unknown Flags: BASE | WEAK | INFO | <unknown> Version: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x0000000000201000 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Link: .dynstr + Info: 0x0000000000000001 + Dependencies: + - Version: 1 + File: dso.so.0 + Entries: + - Name: base + Hash: 0 + Flags: 0x1 + Other: 0 + - Name: weak + Hash: 0 + Flags: 0x2 + Other: 0 + - Name: info + Hash: 0 + Flags: 0x4 + Other: 0 + - Name: all + Hash: 0 + Flags: 0x7 + Other: 0 + - Name: unknown + Hash: 0 + Flags: 0x8 + Other: 0 + - Name: all_and_unknown + Hash: 0 + Flags: 0xf + Other: 0 +## Needed to trigger .dynstr creation, which is required by .gnu.version_r +DynamicSymbols: + - Name: f1 + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test b/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test new file mode 100644 index 00000000000..e8d75afe1e6 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/verneed-invalid.test @@ -0,0 +1,606 @@ +## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_verneed sections. + +## In the first case we have a SHT_GNU_versym section that refers to +## a version listed in a SHT_GNU_verneed section. That version has an +## empty name, making it invalid. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readelf -V %t1 | FileCheck %s --check-prefix=GNU-VERNEED-NAME +# RUN: llvm-readobj -V %t1 | FileCheck %s --check-prefix=LLVM-VERNEED-NAME + +# GNU-VERNEED-NAME: Version symbols section '.gnu.version' contains 2 entries: +# GNU-VERNEED-NAME-NEXT: Addr: 0000000000200210 Offset: 0x000040 Link: 5 (.dynsym) +# GNU-VERNEED-NAME-NEXT: 000: 0 (*local*) 2 (*invalid*) + +# GNU-VERNEED-NAME: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-VERNEED-NAME-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 6 (.dynstr) +# GNU-VERNEED-NAME-NEXT: 0x0000: Version: 1 File: somefile Cnt: 1 +# GNU-VERNEED-NAME-NEXT: 0x0010: Name: Flags: none Version: 2 + +# LLVM-VERNEED-NAME: VersionSymbols [ +# LLVM-VERNEED-NAME: Symbol { +# LLVM-VERNEED-NAME-NEXT: Version: 0 +# LLVM-VERNEED-NAME-NEXT: Name: +# LLVM-VERNEED-NAME-NEXT: } +# LLVM-VERNEED-NAME-NEXT: Symbol { +# LLVM-VERNEED-NAME-NEXT: Version: 2 +# LLVM-VERNEED-NAME-NEXT: Name: foo +# LLVM-VERNEED-NAME-NEXT: } +# LLVM-VERNEED-NAME-NEXT: ] + +# LLVM-VERNEED-NAME: VersionRequirements [ +# LLVM-VERNEED-NAME-NEXT: Dependency { +# LLVM-VERNEED-NAME-NEXT: Version: 1 +# LLVM-VERNEED-NAME-NEXT: Count: 1 +# LLVM-VERNEED-NAME-NEXT: FileName: somefile +# LLVM-VERNEED-NAME-NEXT: Entries [ +# LLVM-VERNEED-NAME-NEXT: Entry { +# LLVM-VERNEED-NAME-NEXT: Hash: 0 +# LLVM-VERNEED-NAME-NEXT: Flags [ (0x0) +# LLVM-VERNEED-NAME-NEXT: ] +# LLVM-VERNEED-NAME-NEXT: Index: 2 +# LLVM-VERNEED-NAME-NEXT: Name: {{$}} +# LLVM-VERNEED-NAME-NEXT: } +# LLVM-VERNEED-NAME-NEXT: ] +# LLVM-VERNEED-NAME-NEXT: } +# LLVM-VERNEED-NAME-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Address: 0x200210 + Link: .dynsym + Entries: [ 0, 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Link: .dynstr + Info: 1 + AddressAlign: 4 + Dependencies: + - Version: 1 + File: somefile + Entries: + - Name: '' ## invalid name + Hash: 0 + Flags: 0 + Other: 2 +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL +... + +## In this case SHT_GNU_verneed is not linked to a dynamic string table. We check we handle +## this situation properly. + +# RUN: yaml2obj --docnum=2 %s -o %t2 +# RUN: llvm-readelf -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=GNU-NOLINK +# RUN: llvm-readobj -V %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=LLVM-NOLINK + +# GNU-NOLINK: Version symbols section '.gnu.version' contains 2 entries: +# GNU-NOLINK-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 5 (.dynsym) +# GNU-NOLINK-NEXT: 000: 0 (*local*) +# GNU-NOLINK-NEXT: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verneed section with index 2: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL +# GNU-NOLINK-NEXT: 2 (<corrupt>) +# GNU-NOLINK-EMPTY: +# GNU-NOLINK: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-NOLINK-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 0 () +# GNU-NOLINK-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 9> Cnt: 1 +# GNU-NOLINK-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 2 + +# LLVM-NOLINK: VersionSymbols [ +# LLVM-NOLINK: Symbol { +# LLVM-NOLINK-NEXT: Version: 0 +# LLVM-NOLINK-NEXT: Name: +# LLVM-NOLINK-NEXT: } +# LLVM-NOLINK-NEXT: Symbol { +# LLVM-NOLINK-NEXT: Version: 2 +# LLVM-NOLINK-EMPTY: +# LLVM-NOLINK-NEXT: warning: '[[FILE]]': invalid string table linked to SHT_GNU_verneed section with index 2: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL +# LLVM-NOLINK-NEXT: Name: foo@<corrupt> +# LLVM-NOLINK-NEXT: } +# LLVM-NOLINK-NEXT: ] + +# LLVM-NOLINK: VersionRequirements [ +# LLVM-NOLINK-NEXT: Dependency { +# LLVM-NOLINK-NEXT: Version: 1 +# LLVM-NOLINK-NEXT: Count: 1 +# LLVM-NOLINK-NEXT: FileName: <corrupt vn_file: 9> +# LLVM-NOLINK-NEXT: Entries [ +# LLVM-NOLINK-NEXT: Entry { +# LLVM-NOLINK-NEXT: Hash: 0 +# LLVM-NOLINK-NEXT: Flags [ (0x0) +# LLVM-NOLINK-NEXT: ] +# LLVM-NOLINK-NEXT: Index: 2 +# LLVM-NOLINK-NEXT: Name: <corrupt> +# LLVM-NOLINK-NEXT: } +# LLVM-NOLINK-NEXT: ] +# LLVM-NOLINK-NEXT: } +# LLVM-NOLINK-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + Entries: [ 0, 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Link: 0 + Info: 1 + AddressAlign: 4 + Dependencies: + - Version: 1 + File: somefile + Entries: + - Name: 'bar' + Hash: 0 + Flags: 0 + Other: 2 +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL + +## We can't parse misaligned auxiliary version records. + +# RUN: yaml2obj --docnum=3 %s -o %t3 +# RUN: not llvm-readelf -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX +# RUN: not llvm-readobj -V %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=BROKEN-AUX + +# BROKEN-AUX: error: '[[FILE]]': invalid SHT_GNU_verneed section with index 2: found a misaligned auxiliary entry at offset 0x11 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + Entries: [ 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + AddressAlign: 4 +## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory. + Content: "0100010001000000110000000000000000000000" +DynamicSymbols: [] + +## Here we check that we can properly dump the case when a dependency file name +## and/or a dependency name string offset is equal to the string table size. +## +## We set the version dependency vn_file field to the offset of string 'foo' in +## the .dynstr, which is 1. We create a custom string table .mystrtab of size 1 +## and link it with the .gnu.version_r section. For the vna_name we use the same trick. + +# RUN: yaml2obj --docnum=4 %s -o %t4 +# RUN: llvm-readobj --sections --section-data -V %t4 | FileCheck %s --check-prefix=LLVM-OFFSET-EQ +# RUN: llvm-readelf --sections -V %t4 | FileCheck %s --check-prefix=GNU-OFFSET-EQ + +# LLVM-OFFSET-EQ: Name: .mystrtab +# LLVM-OFFSET-EQ: Size: +# LLVM-OFFSET-EQ-SAME: 1 + +# LLVM-OFFSET-EQ: Name: .dynstr +# LLVM-OFFSET-EQ: SectionData ( +# LLVM-OFFSET-EQ-NEXT: 0000: 00666F6F 00 |.foo.| +# LLVM-OFFSET-EQ-NEXT: ) + +# LLVM-OFFSET-EQ: VersionRequirements [ +# LLVM-OFFSET-EQ-NEXT: Dependency { +# LLVM-OFFSET-EQ-NEXT: Version: 1 +# LLVM-OFFSET-EQ-NEXT: Count: 1 +# LLVM-OFFSET-EQ-NEXT: FileName: <corrupt vn_file: 1> +# LLVM-OFFSET-EQ-NEXT: Entries [ +# LLVM-OFFSET-EQ-NEXT: Entry { +# LLVM-OFFSET-EQ-NEXT: Hash: 0 +# LLVM-OFFSET-EQ-NEXT: Flags [ (0x0) +# LLVM-OFFSET-EQ-NEXT: ] +# LLVM-OFFSET-EQ-NEXT: Index: 0 +# LLVM-OFFSET-EQ-NEXT: Name: <corrupt> +# LLVM-OFFSET-EQ-NEXT: } +# LLVM-OFFSET-EQ-NEXT: ] +# LLVM-OFFSET-EQ-NEXT: } +# LLVM-OFFSET-EQ-NEXT: ] + +# GNU-OFFSET-EQ: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-OFFSET-EQ-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 1 (.mystrtab) +# GNU-OFFSET-EQ-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1 +# GNU-OFFSET-EQ-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .mystrtab + Type: SHT_STRTAB + Content: "00" + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .mystrtab + AddressAlign: 4 + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Here we check that we can properly dump the case when a dependency file name +## and/or a dependency name string offset is greater than the string table size. +## +# RUN: yaml2obj --docnum=5 %s -o %t5 +# RUN: llvm-readobj --sections -V %t5 | FileCheck %s --check-prefix=LLVM-OFFSET-GR +# RUN: llvm-readelf --sections -V %t5 | FileCheck %s --check-prefix=GNU-OFFSET-GR + +# LLVM-OFFSET-GR: VersionRequirements [ +# LLVM-OFFSET-GR-NEXT: Dependency { +# LLVM-OFFSET-GR-NEXT: Version: 1 +# LLVM-OFFSET-GR-NEXT: Count: 1 +# LLVM-OFFSET-GR-NEXT: FileName: <corrupt vn_file: 1> +# LLVM-OFFSET-GR-NEXT: Entries [ +# LLVM-OFFSET-GR-NEXT: Entry { +# LLVM-OFFSET-GR-NEXT: Hash: 0 +# LLVM-OFFSET-GR-NEXT: Flags [ (0x0) +# LLVM-OFFSET-GR-NEXT: ] +# LLVM-OFFSET-GR-NEXT: Index: 0 +# LLVM-OFFSET-GR-NEXT: Name: <corrupt> +# LLVM-OFFSET-GR-NEXT: } +# LLVM-OFFSET-GR-NEXT: ] +# LLVM-OFFSET-GR-NEXT: } +# LLVM-OFFSET-GR-NEXT: ] + +# GNU-OFFSET-GR: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-OFFSET-GR-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 1 (.mystrtab) +# GNU-OFFSET-GR-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1 +# GNU-OFFSET-GR-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .mystrtab + Type: SHT_STRTAB + Content: "" + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .mystrtab + AddressAlign: 4 + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check that we report a warning when sh_link references a non-existent section. + +# RUN: yaml2obj --docnum=6 %s -o %t6 +# RUN: llvm-readobj --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-LLVM +# RUN: llvm-readelf --sections -V %t6 2>&1 | FileCheck %s -DFILE=%t6 --implicit-check-not="warning:" --check-prefix=INVALID-LINK-GNU + +# INVALID-LINK-LLVM: VersionRequirements [ +# INVALID-LINK-LLVM-EMPTY: +# INVALID-LINK-LLVM-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255 +# INVALID-LINK-LLVM-NEXT: Dependency { +# INVALID-LINK-LLVM-NEXT: Version: 1 +# INVALID-LINK-LLVM-NEXT: Count: 1 +# INVALID-LINK-LLVM-NEXT: FileName: <corrupt vn_file: 1> +# INVALID-LINK-LLVM-NEXT: Entries [ +# INVALID-LINK-LLVM-NEXT: Entry { +# INVALID-LINK-LLVM-NEXT: Hash: 0 +# INVALID-LINK-LLVM-NEXT: Flags [ (0x0) +# INVALID-LINK-LLVM-NEXT: ] +# INVALID-LINK-LLVM-NEXT: Index: 0 +# INVALID-LINK-LLVM-NEXT: Name: <corrupt> +# INVALID-LINK-LLVM-NEXT: } +# INVALID-LINK-LLVM-NEXT: ] +# INVALID-LINK-LLVM-NEXT: } +# INVALID-LINK-LLVM-NEXT: ] + +# INVALID-LINK-GNU: Version needs section '.gnu.version_r' contains 1 entries: +# INVALID-LINK-GNU-EMPTY: +# INVALID-LINK-GNU-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_verneed section with index 1: invalid section index: 255 +# INVALID-LINK-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>) +# INVALID-LINK-GNU-NEXT: 0x0000: Version: 1 File: <corrupt vn_file: 1> Cnt: 1 +# INVALID-LINK-GNU-NEXT: 0x0010: Name: <corrupt> Flags: none Version: 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: 0xFF + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check that we report a warning when we can't read the content of the SHT_GNU_verneed section. + +# RUN: yaml2obj --docnum=7 %s -o %t7 +# RUN: llvm-readobj --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA +# RUN: llvm-readelf --sections -V %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=INVALID-DATA + +# INVALID-DATA: warning: '[[FILE]]': cannot read content of SHT_GNU_verneed section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x0) that is greater than the file size (0x230) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + ShOffset: 0xFFFFFFFF +## Triggers creation of the .dynstr. +DynamicSymbols: + - Name: foo + +## Check that we report a warning when a SHT_GNU_verneed section contains a version dependency +## that goes past the end of the section. + +# RUN: yaml2obj --docnum=8 %s -o %t8 +# RUN: llvm-readobj --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END +# RUN: llvm-readelf --sections -V %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=DEP-PAST-END + +# DEP-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 goes past the end of the section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + ShSize: 0x1 + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check we report a warning when a version dependency is not correctly aligned in memory. + +# RUN: yaml2obj --docnum=9 %s -o %t9 +# RUN: llvm-readobj --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP +# RUN: llvm-readelf --sections -V %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=MISALIGNED-DEP + +# MISALIGNED-DEP: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned version dependency entry at offset 0x0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Type: Fill + Size: 0x1 + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check that we report a warning when a SHT_GNU_verneed section contains a dependency definition +## that refers to an auxiliary entry that goes past the end of the section. + +# RUN: yaml2obj --docnum=10 %s -o %t10 +# RUN: llvm-readobj --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END +# RUN: llvm-readelf --sections -V %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=AUX-PAST-END + +# AUX-PAST-END: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: version dependency 1 refers to an auxiliary entry that goes past the end of the section + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + ShSize: 21 + Dependencies: + - Version: 1 + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## Check we report a warning when an auxiliary entry is not correctly aligned in memory. + +# RUN: yaml2obj %s --docnum=11 -o %t11 +# RUN: llvm-readobj -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11 +# RUN: llvm-readelf -V %t11 2>&1 | FileCheck %s --check-prefix=MISALIGNED-AUX -DFILE=%t11 + +# MISALIGNED-AUX: warning: '[[FILE]]': invalid SHT_GNU_verneed section with index 1: found a misaligned auxiliary entry at offset 0x11 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr +## The byte offset to the auxiliary entry is 0x11, i.e. it is not correctly aligned in memory. + Content: "0100010001000000110000000000000000000000" +DynamicSymbols: + - Name: foo + +## Check how we handle the case when a dependency definition entry has an unsupported version. + +# RUN: yaml2obj %s --docnum=12 -o %t12 +# RUN: llvm-readobj -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12 +# RUN: llvm-readelf -V %t12 2>&1 | FileCheck %s --check-prefix=UNSUPPORTED-VERSION -DFILE=%t12 + +# UNSUPPORTED-VERSION: warning: '[[FILE]]': unable to dump SHT_GNU_verneed section with index 1: version 65278 is not yet supported + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Info: 1 + Link: .dynstr + Dependencies: + - Version: 0xfefe + File: foo + Entries: + - Name: 'foo' + Hash: 0 + Flags: 0 + Other: 0 +DynamicSymbols: + - Name: foo + +## In this case SHT_GNU_verneed is linked to a custom dynamic string table, which is not +## called ".dynstr". Check we handle this case properly. + +# RUN: yaml2obj --docnum=13 %s -o %t13 +# RUN: llvm-readelf -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=GNU-CUSTOM-DYNSTR +# RUN: llvm-readobj -V %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=LLVM-CUSTOM-DYNSTR + +# GNU-CUSTOM-DYNSTR: Version symbols section '.gnu.version' contains 2 entries: +# GNU-CUSTOM-DYNSTR-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 6 (.dynsym) +# GNU-CUSTOM-DYNSTR-NEXT: 000: 0 (*local*) 2 (bcdefghij) +# GNU-CUSTOM-DYNSTR: Version needs section '.gnu.version_r' contains 1 entries: +# GNU-CUSTOM-DYNSTR-NEXT: Addr: 0000000000000000 Offset: 0x000044 Link: 3 (.custom.dynstr) +# GNU-CUSTOM-DYNSTR-NEXT: 0x0000: Version: 1 File: j Cnt: 1 +# GNU-CUSTOM-DYNSTR-NEXT: 0x0010: Name: bcdefghij Flags: none Version: 2 + +# LLVM-CUSTOM-DYNSTR: VersionSymbols [ +# LLVM-CUSTOM-DYNSTR: Symbol { +# LLVM-CUSTOM-DYNSTR: Version: 2 +# LLVM-CUSTOM-DYNSTR-NEXT: Name: foo@bcdefghij + +# LLVM-CUSTOM-DYNSTR: VersionRequirements [ +# LLVM-CUSTOM-DYNSTR: Dependency { +# LLVM-CUSTOM-DYNSTR: Entries [ +# LLVM-CUSTOM-DYNSTR: Entry { +# LLVM-CUSTOM-DYNSTR: Index: 2 +# LLVM-CUSTOM-DYNSTR-NEXT: Name: bcdefghij + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + Entries: [ 0, 2 ] + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Link: .custom.dynstr + Info: 1 + AddressAlign: 4 + Dependencies: + - Version: 1 + File: zed + Entries: + - Name: 'bar' + Hash: 0 + Flags: 0 + Other: 2 + - Name: .custom.dynstr + Type: SHT_STRTAB + Content: "6162636465666768696a00" ## 'a','b','c','d','e','f','g','h','i','j',NIL +DynamicSymbols: + - Name: foo + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-readobj/ELF/versioninfo.test b/llvm/test/tools/llvm-readobj/ELF/versioninfo.test new file mode 100644 index 00000000000..a7eaa80bb5d --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/versioninfo.test @@ -0,0 +1,297 @@ +## Test how llvm-readobj/llvm-readelf tools dump versioning sections. +## Check that SHT_GNU_versym dumper can see versions described in +## SHT_GNU_verdef and SHT_GNU_verneed sections. + +# RUN: yaml2obj %s --docnum=1 -o %t1 +# RUN: llvm-readobj -V %t1 | FileCheck %s --check-prefix=LLVM +# RUN: llvm-readelf -V %t1 | FileCheck %s --check-prefix=GNU + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC ] + Link: .dynsym + AddressAlign: 0x0000000000000002 + EntSize: 0x0000000000000002 + Entries: [ 0, 2, 3, 4, 5, 6] + - Name: .gnu.version_d + Type: SHT_GNU_verdef + Flags: [ SHF_ALLOC ] + Link: .dynstr + AddressAlign: 0x0000000000000004 + Info: 0x0000000000000006 + Entries: + - Version: 1 + Flags: 0 + VersionNdx: 0 + Hash: 0 + Names: + - VERSION1 + - Version: 1 + Flags: 1 + VersionNdx: 0 + Hash: 0 + Names: + - VERSION1 + - Version: 1 + Flags: 2 + VersionNdx: 0 + Hash: 0 + Names: + - VERSION1 + - Version: 1 + Flags: 4 + VersionNdx: 0 + Hash: 0 + Names: + - VERSION1 + - Version: 1 + Flags: 7 + VersionNdx: 2 + Hash: 175630257 + Names: + - VERSION1 + - Version: 1 + Flags: 8 + VersionNdx: 3 + Hash: 175630258 + Names: + - VERSION2 + - VERSION1 + - VERSION3 + - Name: .gnu.version_r + Type: SHT_GNU_verneed + Flags: [ SHF_ALLOC ] + Link: .dynstr + AddressAlign: 0x0000000000000004 + Info: 0x0000000000000002 + Dependencies: + - Version: 1 + File: verneed1.so.0 + Entries: + - Name: v1 + Hash: 0 + Flags: 1 + Other: 0 + - Name: v1 + Hash: 0 + Flags: 2 + Other: 0 + - Name: v1 + Hash: 0 + Flags: 4 + Other: 0 + - Name: v1 + Hash: 1938 + Flags: 7 + Other: 4 + - Name: v2 + Hash: 1939 + Flags: 8 + Other: 5 + - Version: 1 + File: verneed2.so.0 + Entries: + - Name: v3 + Hash: 1937 + Flags: 0 + Other: 6 +DynamicSymbols: + - Name: sym1 + Binding: STB_GLOBAL + - Name: sym2 + Binding: STB_GLOBAL + - Name: sym3 + Binding: STB_GLOBAL + - Name: sym4 + Binding: STB_GLOBAL + - Name: sym5 + Binding: STB_GLOBAL +... + +# LLVM: VersionSymbols [ +# LLVM-NEXT: Symbol { +# LLVM-NEXT: Version: 0 +# LLVM-NEXT: Name: +# LLVM-NEXT: } +# LLVM-NEXT: Symbol { +# LLVM-NEXT: Version: 2 +# LLVM-NEXT: Name: sym1@@VERSION1 +# LLVM-NEXT: } +# LLVM-NEXT: Symbol { +# LLVM-NEXT: Version: 3 +# LLVM-NEXT: Name: sym2@@VERSION2 +# LLVM-NEXT: } +# LLVM-NEXT: Symbol { +# LLVM-NEXT: Version: 4 +# LLVM-NEXT: Name: sym3@v1 +# LLVM-NEXT: } +# LLVM-NEXT: Symbol { +# LLVM-NEXT: Version: 5 +# LLVM-NEXT: Name: sym4@v2 +# LLVM-NEXT: } +# LLVM-NEXT: Symbol { +# LLVM-NEXT: Version: 6 +# LLVM-NEXT: Name: sym5@v3 +# LLVM-NEXT: } +# LLVM-NEXT: ] +# LLVM-NEXT: VersionDefinitions [ +# LLVM-NEXT: Definition { +# LLVM-NEXT: Version: 1 +# LLVM-NEXT: Flags [ (0x0) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 0 +# LLVM-NEXT: Hash: 0 +# LLVM-NEXT: Name: VERSION1 +# LLVM-NEXT: Predecessors: [] +# LLVM-NEXT: } +# LLVM-NEXT: Definition { +# LLVM-NEXT: Version: 1 +# LLVM-NEXT: Flags [ (0x1) +# LLVM-NEXT: Base (0x1) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 0 +# LLVM-NEXT: Hash: 0 +# LLVM-NEXT: Name: VERSION1 +# LLVM-NEXT: Predecessors: [] +# LLVM-NEXT: } +# LLVM-NEXT: Definition { +# LLVM-NEXT: Version: 1 +# LLVM-NEXT: Flags [ (0x2) +# LLVM-NEXT: Weak (0x2) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 0 +# LLVM-NEXT: Hash: 0 +# LLVM-NEXT: Name: VERSION1 +# LLVM-NEXT: Predecessors: [] +# LLVM-NEXT: } +# LLVM-NEXT: Definition { +# LLVM-NEXT: Version: 1 +# LLVM-NEXT: Flags [ (0x4) +# LLVM-NEXT: Info (0x4) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 0 +# LLVM-NEXT: Hash: 0 +# LLVM-NEXT: Name: VERSION1 +# LLVM-NEXT: Predecessors: [] +# LLVM-NEXT: } +# LLVM-NEXT: Definition { +# LLVM-NEXT: Version: 1 +# LLVM-NEXT: Flags [ (0x7) +# LLVM-NEXT: Base (0x1) +# LLVM-NEXT: Info (0x4) +# LLVM-NEXT: Weak (0x2) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 2 +# LLVM-NEXT: Hash: 175630257 +# LLVM-NEXT: Name: VERSION1 +# LLVM-NEXT: Predecessors: [] +# LLVM-NEXT: } +# LLVM-NEXT: Definition { +# LLVM-NEXT: Version: 1 +# LLVM-NEXT: Flags [ (0x8) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 3 +# LLVM-NEXT: Hash: 175630258 +# LLVM-NEXT: Name: VERSION2 +# LLVM-NEXT: Predecessors: [VERSION1, VERSION3] +# LLVM-NEXT: } +# LLVM-NEXT: ] +# LLVM-NEXT: VersionRequirements [ +# LLVM-NEXT: Dependency { +# LLVM-NEXT: Version: 1 +# LLVM-NEXT: Count: 5 +# LLVM-NEXT: FileName: verneed1.so.0 +# LLVM-NEXT: Entries [ +# LLVM-NEXT: Entry { +# LLVM-NEXT: Hash: 0 +# LLVM-NEXT: Flags [ (0x1) +# LLVM-NEXT: Base (0x1) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 0 +# LLVM-NEXT: Name: v1 +# LLVM-NEXT: } +# LLVM-NEXT: Entry { +# LLVM-NEXT: Hash: 0 +# LLVM-NEXT: Flags [ (0x2) +# LLVM-NEXT: Weak (0x2) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 0 +# LLVM-NEXT: Name: v1 +# LLVM-NEXT: } +# LLVM-NEXT: Entry { +# LLVM-NEXT: Hash: 0 +# LLVM-NEXT: Flags [ (0x4) +# LLVM-NEXT: Info (0x4) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 0 +# LLVM-NEXT: Name: v1 +# LLVM-NEXT: } +# LLVM-NEXT: Entry { +# LLVM-NEXT: Hash: 1938 +# LLVM-NEXT: Flags [ (0x7) +# LLVM-NEXT: Base (0x1) +# LLVM-NEXT: Info (0x4) +# LLVM-NEXT: Weak (0x2) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 4 +# LLVM-NEXT: Name: v1 +# LLVM-NEXT: } +# LLVM-NEXT: Entry { +# LLVM-NEXT: Hash: 1939 +# LLVM-NEXT: Flags [ (0x8) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 5 +# LLVM-NEXT: Name: v2 +# LLVM-NEXT: } +# LLVM-NEXT: ] +# LLVM-NEXT: } +# LLVM-NEXT: Dependency { +# LLVM-NEXT: Version: 1 +# LLVM-NEXT: Count: 1 +# LLVM-NEXT: FileName: verneed2.so.0 +# LLVM-NEXT: Entries [ +# LLVM-NEXT: Entry { +# LLVM-NEXT: Hash: 1937 +# LLVM-NEXT: Flags [ (0x0) +# LLVM-NEXT: ] +# LLVM-NEXT: Index: 6 +# LLVM-NEXT: Name: v3 +# LLVM-NEXT: } +# LLVM-NEXT: ] +# LLVM-NEXT: } +# LLVM-NEXT: ] + +# GNU: Version symbols section '.gnu.version' contains 6 entries: +# GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 6 (.dynsym) +# GNU-NEXT: 000: 0 (*local*) 2 (VERSION1) 3 (VERSION2) 4 (v1) +# GNU-NEXT: 004: 5 (v2) 6 (v3) +# GNU-EMPTY: +# GNU-NEXT: Version definition section '.gnu.version_d' contains 6 entries: +# GNU-NEXT: Addr: 0000000000000000 Offset: 0x00004c Link: 7 (.dynstr) +# GNU-NEXT: 0x0000: Rev: 1 Flags: none Index: 0 Cnt: 1 Name: VERSION1 +# GNU-NEXT: 0x001c: Rev: 1 Flags: BASE Index: 0 Cnt: 1 Name: VERSION1 +# GNU-NEXT: 0x0038: Rev: 1 Flags: WEAK Index: 0 Cnt: 1 Name: VERSION1 +# GNU-NEXT: 0x0054: Rev: 1 Flags: INFO Index: 0 Cnt: 1 Name: VERSION1 +# GNU-NEXT: 0x0070: Rev: 1 Flags: BASE | WEAK | INFO Index: 2 Cnt: 1 Name: VERSION1 +# GNU-NEXT: 0x008c: Rev: 1 Flags: <unknown> Index: 3 Cnt: 3 Name: VERSION2 +# GNU-NEXT: 0x00b0: Parent 1: VERSION1 +# GNU-NEXT: 0x00b0: Parent 2: VERSION3 +# GNU-EMPTY: +# GNU-NEXT: Version needs section '.gnu.version_r' contains 2 entries: +# GNU-NEXT: Addr: 0000000000000000 Offset: 0x000104 Link: 7 (.dynstr) +# GNU-NEXT: 0x0000: Version: 1 File: verneed1.so.0 Cnt: 5 +# GNU-NEXT: 0x0010: Name: v1 Flags: BASE Version: 0 +# GNU-NEXT: 0x0020: Name: v1 Flags: WEAK Version: 0 +# GNU-NEXT: 0x0030: Name: v1 Flags: INFO Version: 0 +# GNU-NEXT: 0x0040: Name: v1 Flags: BASE | WEAK | INFO Version: 4 +# GNU-NEXT: 0x0050: Name: v2 Flags: <unknown> Version: 5 +# GNU-NEXT: 0x0060: Version: 1 File: verneed2.so.0 Cnt: 1 +# GNU-NEXT: 0x0070: Name: v3 Flags: none Version: 6 diff --git a/llvm/test/tools/llvm-readobj/ELF/versym-invalid.test b/llvm/test/tools/llvm-readobj/ELF/versym-invalid.test new file mode 100644 index 00000000000..a88318e5f49 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/versym-invalid.test @@ -0,0 +1,220 @@ +## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_versym sections. + +## Check that we report a warning when sh_link references a non-existent section. + +# RUN: yaml2obj --docnum=1 %s -o %t1 +# RUN: llvm-readelf -V %t1 2>&1 | FileCheck -DFILE=%t1 %s --check-prefix=GNU-INVALID-LINK +# RUN: llvm-readobj -V %t1 2>&1 | FileCheck -DFILE=%t1 %s --check-prefix=LLVM-INVALID-LINK + +# GNU-INVALID-LINK: Version symbols section '.gnu.version' contains 0 entries: +# GNU-INVALID-LINK-EMPTY: +# GNU-INVALID-LINK-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: invalid section index: 255 +# GNU-INVALID-LINK-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 255 (<corrupt>) + +# LLVM-INVALID-LINK: VersionSymbols [ +# LLVM-INVALID-LINK-EMPTY: +# LLVM-INVALID-LINK-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: invalid section index: 255 +# LLVM-INVALID-LINK-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Link: 0xFF + Entries: [ ] + +## Check that we report a warning when the sh_link field of a SHT_GNU_versym section does not reference +## a dynamic symbol table section. + +# RUN: yaml2obj --docnum=2 %s -o %t2 +# RUN: llvm-readelf -V %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefix=INVALID-SYMBOL-TABLE-GNU +# RUN: llvm-readobj -V %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefix=INVALID-SYMBOL-TABLE-LLVM + +# INVALID-SYMBOL-TABLE-GNU: Version symbols section '.gnu.version' contains 1 entries: +# INVALID-SYMBOL-TABLE-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 0 () +# INVALID-SYMBOL-TABLE-GNU-EMPTY: +# INVALID-SYMBOL-TABLE-GNU-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: expected SHT_DYNSYM, but got SHT_NULL +# INVALID-SYMBOL-TABLE-GNU-NEXT: 000: 0 (*local*) + +# INVALID-SYMBOL-TABLE-LLVM: VersionSymbols [ +# INVALID-SYMBOL-TABLE-LLVM-EMPTY: +# INVALID-SYMBOL-TABLE-LLVM-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: expected SHT_DYNSYM, but got SHT_NULL +# INVALID-SYMBOL-TABLE-LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Link: 0x0 + Entries: [ 0 ] + +## Check we report a warning when something is wrong with a string table linked to a symbol table that +## is linked with SHT_GNU_versym. In this case we are unable to produce LLVM style output, +## but GNU style is fine because it does not need that string table. + +# RUN: yaml2obj --docnum=3 %s -o %t3 +# RUN: llvm-readelf -V %t3 2>&1 | FileCheck -DFILE=%t3 %s --check-prefix=INVALID-STRING-TABLE-GNU +# RUN: llvm-readobj -V %t3 2>&1 | FileCheck -DFILE=%t3 %s --check-prefix=INVALID-STRING-TABLE-LLVM + +# INVALID-STRING-TABLE-GNU: Version symbols section '.gnu.version' contains 1 entries: +# INVALID-STRING-TABLE-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 5 (.dynsym) +# INVALID-STRING-TABLE-GNU-EMPTY: +# INVALID-STRING-TABLE-GNU-NEXT: warning: '[[FILE]]': can't get a string table for the symbol table linked to SHT_GNU_versym section with index 1: invalid string table linked to SHT_DYNSYM section with index 5: invalid sh_type for string table section [index 2]: expected SHT_STRTAB, but got SHT_NULL +# INVALID-STRING-TABLE-GNU-NEXT: 000: 0 (*local*) + +# INVALID-STRING-TABLE-LLVM: VersionSymbols [ +# INVALID-STRING-TABLE-LLVM-EMPTY: +# INVALID-STRING-TABLE-LLVM-NEXT: warning: '[[FILE]]': can't get a string table for the symbol table linked to SHT_GNU_versym section with index 1: invalid string table linked to SHT_DYNSYM section with index 5: invalid sh_type for string table section [index 2]: expected SHT_STRTAB, but got SHT_NULL +# INVALID-STRING-TABLE-LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Link: .dynsym + Entries: [ 0 ] + - Name: .dynstr + Type: SHT_NULL +DynamicSymbols: [] + +## Check we report a warning when a SHT_GNU_versym section is not correctly aligned in memory. + +# RUN: yaml2obj --docnum=4 %s -o %t4 +# RUN: llvm-readelf -V %t4 2>&1 | FileCheck -DFILE=%t4 %s --check-prefix=MISALIGNED-GNU +# RUN: llvm-readobj -V %t4 2>&1 | FileCheck -DFILE=%t4 %s --check-prefix=MISALIGNED-LLVM + +# MISALIGNED-GNU: Version symbols section '.gnu.version' contains 0 entries: +# MISALIGNED-GNU-NEXT: Addr: 0000000000000000 Offset: 0x00ffff Link: 0 () +# MISALIGNED-GNU-EMPTY: +# MISALIGNED-GNU-NEXT: warning: '[[FILE]]': the SHT_GNU_versym section with index 1 is misaligned + +# MISALIGNED-LLVM: VersionSymbols [ +# MISALIGNED-LLVM-EMPTY: +# MISALIGNED-LLVM-NEXT: warning: '[[FILE]]': the SHT_GNU_versym section with index 1 is misaligned +# MISALIGNED-LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Entries: [ ] + ShOffset: 0xffff + +## Check we report a warning when a SHT_GNU_versym section has an invalid entry size. + +# RUN: yaml2obj --docnum=5 %s -o %t5 +# RUN: llvm-readelf -V %t5 2>&1 | FileCheck -DFILE=%t5 %s --check-prefix=INVALID-ENT-SIZE-GNU +# RUN: llvm-readobj -V %t5 2>&1 | FileCheck -DFILE=%t5 %s --check-prefix=INVALID-ENT-SIZE-LLVM + +# INVALID-ENT-SIZE-GNU: Version symbols section '.gnu.version' contains 1 entries: +# INVALID-ENT-SIZE-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 0 () +# INVALID-ENT-SIZE-GNU-EMPTY: +# INVALID-ENT-SIZE-GNU-NEXT: warning: '[[FILE]]': cannot read content of SHT_GNU_versym section with index 1: section [index 1] has an invalid sh_entsize: 3 + +# INVALID-ENT-SIZE-LLVM: VersionSymbols [ +# INVALID-ENT-SIZE-LLVM-EMPTY: +# INVALID-ENT-SIZE-LLVM-NEXT: warning: '[[FILE]]': cannot read content of SHT_GNU_versym section with index 1: section [index 1] has an invalid sh_entsize: 3 +# INVALID-ENT-SIZE-LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Entries: [ 0 ] + EntSize: 3 + +## Check we report a warning when the number of version entries does not match the number of symbols in the associated symbol table. + +# RUN: yaml2obj --docnum=6 %s -o %t6 +# RUN: llvm-readelf -V %t6 2>&1 | FileCheck -DFILE=%t6 %s --check-prefix=SYMBOLS-NUM-MISMATCH-GNU +# RUN: llvm-readobj -V %t6 2>&1 | FileCheck -DFILE=%t6 %s --check-prefix=SYMBOLS-NUM-MISMATCH-LLVM + +# SYMBOLS-NUM-MISMATCH-GNU: Version symbols section '.gnu.version' contains 2 entries: +# SYMBOLS-NUM-MISMATCH-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 4 (.dynsym) +# SYMBOLS-NUM-MISMATCH-GNU-EMPTY: +# SYMBOLS-NUM-MISMATCH-GNU-NEXT: warning: '[[FILE]]': SHT_GNU_versym section with index 1: the number of entries (2) does not match the number of symbols (3) in the symbol table with index 4 +# SYMBOLS-NUM-MISMATCH-GNU-NEXT: 000: 0 (*local*) 1 (*global*) + +# SYMBOLS-NUM-MISMATCH-LLVM: VersionSymbols [ +# SYMBOLS-NUM-MISMATCH-LLVM-EMPTY: +# SYMBOLS-NUM-MISMATCH-LLVM-NEXT: warning: '[[FILE]]': SHT_GNU_versym section with index 1: the number of entries (2) does not match the number of symbols (3) in the symbol table with index 4 +# SYMBOLS-NUM-MISMATCH-LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Entries: [ 0, 1 ] + Link: .dynsym +DynamicSymbols: + - Name: foo + - Name: bar + +## Check we can dump a SHT_GNU_versym section when it is linked to a custom dynamic symbol +## table that is not called ".dynsym". + +# RUN: yaml2obj --docnum=7 %s -o %t7 +# RUN: llvm-readelf -V %t7 2>&1 | FileCheck -DFILE=%t7 %s --check-prefix=CUSTOM-SYMTAB-GNU +# RUN: llvm-readobj -V %t7 2>&1 | FileCheck -DFILE=%t7 %s --check-prefix=CUSTOM-SYMTAB-LLVM + +# CUSTOM-SYMTAB-GNU: Version symbols section '.gnu.version' contains 1 entries: +# CUSTOM-SYMTAB-GNU-NEXT: Addr: 0000000000000000 Offset: 0x000040 Link: 2 (.foo.dynsym) +# CUSTOM-SYMTAB-GNU-NEXT: 000: 0 (*local*) + +# CUSTOM-SYMTAB-LLVM: VersionSymbols [ +# CUSTOM-SYMTAB-LLVM-NEXT: Symbol { +# CUSTOM-SYMTAB-LLVM-NEXT: Version: 0 +# CUSTOM-SYMTAB-LLVM-NEXT: Name: +# CUSTOM-SYMTAB-LLVM-NEXT: } +# CUSTOM-SYMTAB-LLVM-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .gnu.version + Type: SHT_GNU_versym + Link: .foo.dynsym + Entries: [ 0 ] +## A custom empty dynamic symbol table with a null entry. + - Name: .foo.dynsym + Type: SHT_DYNSYM + Link: .dynstr + EntSize: 24 + Size: 24 +DynamicSymbols: + - Name: foo + - Name: bar diff --git a/llvm/test/tools/llvm-readobj/ELF/wrong-shstrtab-type.test b/llvm/test/tools/llvm-readobj/ELF/wrong-shstrtab-type.test new file mode 100644 index 00000000000..cc40f49d4a5 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/ELF/wrong-shstrtab-type.test @@ -0,0 +1,45 @@ +## Check we do not fail to dump the section headers when +## a .shstrtab section does not have a SHT_STRTAB type. + +## Check we report only one warning for the issue for each input object. + +# RUN: yaml2obj %s -o %t1 +# RUN: llvm-readobj -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --implicit-check-not warning --check-prefix LLVM +# RUN: llvm-readelf -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --implicit-check-not warning --check-prefix GNU + +# LLVM: warning: '[[FILE]]': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS +# LLVM: Section { +# LLVM: Name: .shstrtab +# LLVM: Type: SHT_PROGBITS + +# GNU: Section Headers: +# GNU: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# GNU: warning: '[[FILE]]': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS +# GNU: [ 1] .shstrtab PROGBITS 0000000000000000 000040 000013 00 0 0 0 + +## Test we report multiple identical warnings (one for each object) when dumping an archive. + +# RUN: rm -f %t.a +# RUN: cp %t1 %t2 +# RUN: llvm-ar rc %t.a %t1 %t2 %t1 +# RUN: llvm-readobj -S %t.a 2>&1 | FileCheck %s --implicit-check-not warning --check-prefix WARNINGS +# RUN: llvm-readelf -S %t.a 2>&1 | FileCheck %s --implicit-check-not warning --check-prefix WARNINGS + +# WARNINGS: warning: '{{.*}}1': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS +# WARNINGS: warning: '{{.*}}2': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS +# WARNINGS: warning: '{{.*}}1': invalid sh_type for string table section [index 1]: expected SHT_STRTAB, but got SHT_PROGBITS + +## Test we report the warning for each input file specified on the command line. + +# RUN: llvm-readobj -S %t1 %t2 %t1 2>&1 | FileCheck %s --implicit-check-not warning --check-prefix WARNINGS +# RUN: llvm-readelf -S %t1 %t2 %t1 2>&1 | FileCheck %s --implicit-check-not warning --check-prefix WARNINGS + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .shstrtab + Type: SHT_PROGBITS |