From 20a7b84aa6ce683319207bf5c0e348f614a4006f Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Tue, 15 Jul 2025 10:44:23 +0200 Subject: [PATCH] [elf] Add support for {SHT,PT}_GNU_SFRAME constants Reference: https://sourceware.org/git/?p=gnu-gabi.git;a=blob;f=program-loading-and-dynamic-linking.txt;h=3357d865720285df2d29c4e8f92de49ddf1beb40;hb=refs/heads/master --- llvm/include/llvm/BinaryFormat/ELF.h | 2 + llvm/lib/Object/ELF.cpp | 1 + llvm/lib/ObjectYAML/ELFYAML.cpp | 2 + .../llvm-objdump/ELF/program-headers.test | 119 ++++++++++-------- .../tools/llvm-readobj/ELF/section-types.test | 5 + .../tools/yaml2obj/ELF/program-header.yaml | 4 + llvm/tools/llvm-objdump/ELFDump.cpp | 3 + llvm/tools/llvm-readobj/ELFDumper.cpp | 1 + 8 files changed, 82 insertions(+), 55 deletions(-) diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h index ebb257ab33821..6a90aca6a262f 100644 --- a/llvm/include/llvm/BinaryFormat/ELF.h +++ b/llvm/include/llvm/BinaryFormat/ELF.h @@ -1162,6 +1162,7 @@ enum : unsigned { // Android's experimental support for SHT_RELR sections. // https://android.googlesource.com/platform/bionic/+/b7feec74547f84559a1467aca02708ff61346d2a/libc/include/elf.h#512 SHT_ANDROID_RELR = 0x6fffff00, // Relocation entries; only offsets. + SHT_GNU_SFRAME = 0x6ffffff4, // GNU SFrame stack trace format. SHT_GNU_ATTRIBUTES = 0x6ffffff5, // Object attributes. SHT_GNU_HASH = 0x6ffffff6, // GNU-style hash table. SHT_GNU_verdef = 0x6ffffffd, // GNU version definitions. @@ -1546,6 +1547,7 @@ enum { PT_GNU_STACK = 0x6474e551, // Indicates stack executability. PT_GNU_RELRO = 0x6474e552, // Read-only after relocation. PT_GNU_PROPERTY = 0x6474e553, // .note.gnu.property notes sections. + PT_GNU_SFRAME = 0x6474e554, // GNU SFrame stack trace format. PT_OPENBSD_MUTABLE = 0x65a3dbe5, // Like bss, but not immutable. PT_OPENBSD_RANDOMIZE = 0x65a3dbe6, // Fill with random data. diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp index ff99dc25abe07..af073f6a1a917 100644 --- a/llvm/lib/Object/ELF.cpp +++ b/llvm/lib/Object/ELF.cpp @@ -321,6 +321,7 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) { STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_OFFLOADING); STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_LTO); STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_JT_SIZES) + STRINGIFY_ENUM_CASE(ELF, SHT_GNU_SFRAME); STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES); STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH); STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verdef); diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index 970811f40f918..7fcabb684e87f 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -70,6 +70,7 @@ void ScalarEnumerationTraits::enumeration( ECase(PT_GNU_STACK); ECase(PT_GNU_RELRO); ECase(PT_GNU_PROPERTY); + ECase(PT_GNU_SFRAME); #undef ECase IO.enumFallback(Value); } @@ -723,6 +724,7 @@ void ScalarEnumerationTraits::enumeration( ECase(SHT_LLVM_BB_ADDR_MAP); ECase(SHT_LLVM_OFFLOADING); ECase(SHT_LLVM_LTO); + ECase(SHT_GNU_SFRAME); ECase(SHT_GNU_ATTRIBUTES); ECase(SHT_GNU_HASH); ECase(SHT_GNU_verdef); diff --git a/llvm/test/tools/llvm-objdump/ELF/program-headers.test b/llvm/test/tools/llvm-objdump/ELF/program-headers.test index abd4894c45124..a6be34696a87f 100644 --- a/llvm/test/tools/llvm-objdump/ELF/program-headers.test +++ b/llvm/test/tools/llvm-objdump/ELF/program-headers.test @@ -4,51 +4,53 @@ # RUN: llvm-objdump --private-headers %t32.elf | FileCheck %s --check-prefixes=ELF32 # ELF32: Program Header: -# ELF32-NEXT: PHDR off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: PHDR off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags -w- -# ELF32-NEXT: PHDR off 0x00000317 vaddr 0x00002000 paddr 0x00002000 align 2**0 +# ELF32-NEXT: PHDR off 0x00000337 vaddr 0x00002000 paddr 0x00002000 align 2**0 # ELF32-NEXT: filesz 0x00000007 memsz 0x00000007 flags --x -# ELF32-NEXT: UNKNOWN off 0x00000317 vaddr 0x00002000 paddr 0x00002000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000337 vaddr 0x00002000 paddr 0x00002000 align 2**0 # ELF32-NEXT: filesz 0x00000007 memsz 0x00000007 flags --x -# ELF32-NEXT: DYNAMIC off 0x00000324 vaddr 0x00006000 paddr 0x00006000 align 2**0 +# ELF32-NEXT: DYNAMIC off 0x00000344 vaddr 0x00006000 paddr 0x00006000 align 2**0 # ELF32-NEXT: filesz 0x00000010 memsz 0x00000010 flags rwx -# ELF32-NEXT: INTERP off 0x0000031e vaddr 0x00003000 paddr 0x00003000 align 2**0 +# ELF32-NEXT: INTERP off 0x0000033e vaddr 0x00003000 paddr 0x00003000 align 2**0 # ELF32-NEXT: filesz 0x00000004 memsz 0x00000004 flags rw- -# ELF32-NEXT: NOTE off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: NOTE off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000001 memsz 0x00000001 flags --- -# ELF32-NEXT: TLS off 0x00000322 vaddr 0x00004000 paddr 0x00004000 align 2**0 +# ELF32-NEXT: TLS off 0x00000342 vaddr 0x00004000 paddr 0x00004000 align 2**0 # ELF32-NEXT: filesz 0x00000001 memsz 0x00000001 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT:EH_FRAME off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT:EH_FRAME off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: STACK off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: STACK off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: RELRO off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: RELRO off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT:PROPERTY off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT:PROPERTY off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: OPENBSD_RANDOMIZE off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: SFRAME off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: OPENBSD_WXNEEDED off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: OPENBSD_RANDOMIZE off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: OPENBSD_BOOTDATA off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: OPENBSD_WXNEEDED off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: OPENBSD_BOOTDATA off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- -# ELF32-NEXT: UNKNOWN off 0x00000314 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 +# ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- +# ELF32-NEXT: UNKNOWN off 0x00000334 vaddr 0x00001000 paddr 0x00001000 align 2**0 # ELF32-NEXT: filesz 0x00000003 memsz 0x00000003 flags --- # ELF32-EMPTY: @@ -56,51 +58,53 @@ # RUN: llvm-objdump --private-headers %t64.elf | FileCheck %s --check-prefixes=ELF64 # ELF64: Program Header: -# ELF64-NEXT: PHDR off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: PHDR off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags -w- -# ELF64-NEXT: PHDR off 0x000000000000054b vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**0 +# ELF64-NEXT: PHDR off 0x0000000000000583 vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000007 memsz 0x0000000000000007 flags --x -# ELF64-NEXT: UNKNOWN off 0x000000000000054b vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000583 vaddr 0x0000000000002000 paddr 0x0000000000002000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000007 memsz 0x0000000000000007 flags --x -# ELF64-NEXT: DYNAMIC off 0x0000000000000558 vaddr 0x0000000000006000 paddr 0x0000000000006000 align 2**0 +# ELF64-NEXT: DYNAMIC off 0x0000000000000590 vaddr 0x0000000000006000 paddr 0x0000000000006000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000020 memsz 0x0000000000000020 flags rwx -# ELF64-NEXT: INTERP off 0x0000000000000552 vaddr 0x0000000000003000 paddr 0x0000000000003000 align 2**0 +# ELF64-NEXT: INTERP off 0x000000000000058a vaddr 0x0000000000003000 paddr 0x0000000000003000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000004 memsz 0x0000000000000004 flags rw- -# ELF64-NEXT: NOTE off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: NOTE off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000001 memsz 0x0000000000000001 flags --- -# ELF64-NEXT: TLS off 0x0000000000000556 vaddr 0x0000000000004000 paddr 0x0000000000004000 align 2**0 +# ELF64-NEXT: TLS off 0x000000000000058e vaddr 0x0000000000004000 paddr 0x0000000000004000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000001 memsz 0x0000000000000001 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- +# ELF64-NEXT:EH_FRAME off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT:EH_FRAME off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: STACK off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: STACK off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: RELRO off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: RELRO off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: PROPERTY off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: PROPERTY off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: SFRAME off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: OPENBSD_RANDOMIZE off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: OPENBSD_RANDOMIZE off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: OPENBSD_WXNEEDED off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: OPENBSD_WXNEEDED off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: OPENBSD_BOOTDATA off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: OPENBSD_BOOTDATA off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- -# ELF64-NEXT: UNKNOWN off 0x0000000000000548 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 +# ELF64-NEXT: UNKNOWN off 0x0000000000000580 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**0 # ELF64-NEXT: filesz 0x0000000000000003 memsz 0x0000000000000003 flags --- # ELF64-EMPTY: @@ -229,47 +233,52 @@ ProgramHeaders: VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 15: the PT_OPENBSD_RANDOMIZE segment. +## Case 15: the PT_GNU_SFRAME segment. + - Type: 0x6474e554 ## PT_GNU_SFRAME + VAddr: 0x1000 + FirstSec: .foo.begin + LastSec: .foo.end +## Case 16: the PT_OPENBSD_RANDOMIZE segment. - Type: 0x65a3dbe6 ## PT_OPENBSD_RANDOMIZE VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 16: the PT_OPENBSD_WXNEEDED segment. +## Case 17: the PT_OPENBSD_WXNEEDED segment. - Type: 0x65a3dbe7 ## PT_OPENBSD_WXNEEDED VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 17: the PT_OPENBSD_BOOTDATA segment. +## Case 18: the PT_OPENBSD_BOOTDATA segment. - Type: 0x65a41be6 ## PT_OPENBSD_BOOTDATA VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 18: the PT_HIOS segment. +## Case 19: the PT_HIOS segment. - Type: 0x6fffffff ## PT_HIOS VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 19: the PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO segment. +## Case 20: the PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO segment. - Type: 0x70000000 ## PT_LOPROC/PT_ARM_ARCHEXT/PT_MIPS_REGINFO VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 20: the PT_ARM_EXIDX/PT_MIPS_RTPROC segment. +## Case 21: the PT_ARM_EXIDX/PT_MIPS_RTPROC segment. - Type: 0x70000001 ## PT_ARM_EXIDX, PT_MIPS_RTPROC VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 20: the PT_MIPS_OPTIONS segment. +## Case 22: the PT_MIPS_OPTIONS segment. - Type: 0x70000002 ## PT_MIPS_OPTIONS VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 21: the PT_MIPS_ABIFLAGS segment. +## Case 23: the PT_MIPS_ABIFLAGS segment. - Type: 0x70000003 ## PT_MIPS_ABIFLAGS VAddr: 0x1000 FirstSec: .foo.begin LastSec: .foo.end -## Case 22: the PT_HIPROC segment. +## Case 24: the PT_HIPROC segment. - Type: 0x7fffffff ## PT_HIPROC VAddr: 0x1000 FirstSec: .foo.begin diff --git a/llvm/test/tools/llvm-readobj/ELF/section-types.test b/llvm/test/tools/llvm-readobj/ELF/section-types.test index a428666c6ada9..e3a66832fa0d2 100644 --- a/llvm/test/tools/llvm-readobj/ELF/section-types.test +++ b/llvm/test/tools/llvm-readobj/ELF/section-types.test @@ -63,6 +63,8 @@ # LLVM: Type: SHT_LLVM_PART_PHDR # LLVM: Name: .llvm.lto # LLVM: Type: SHT_LLVM_LTO +# LLVM: Name: gnu_sframe +# LLVM: Type: SHT_GNU_SFRAME # LLVM: Name: gnu_attributes # LLVM: Type: SHT_GNU_ATTRIBUTES # LLVM: Name: gnu_hash @@ -125,6 +127,7 @@ # GNU-NEXT: part1 LLVM_PART_EHDR # GNU-NEXT: .phdrs LLVM_PART_PHDR # GNU-NEXT: .llvm.lto LLVM_LTO +# GNU-NEXT: gnu_sframe SFRAME # GNU-NEXT: gnu_attributes ATTRIBUTES # GNU-NEXT: gnu_hash GNU_HASH # GNU-NEXT: gnu_verdef VERDEF @@ -215,6 +218,8 @@ Sections: Type: SHT_LLVM_PART_PHDR - Name: .llvm.lto Type: SHT_LLVM_LTO + - Name: gnu_sframe + Type: SHT_GNU_SFRAME - Name: gnu_attributes Type: SHT_GNU_ATTRIBUTES - Name: gnu_hash diff --git a/llvm/test/tools/yaml2obj/ELF/program-header.yaml b/llvm/test/tools/yaml2obj/ELF/program-header.yaml index 4899102346af4..b2b7ead6e794b 100644 --- a/llvm/test/tools/yaml2obj/ELF/program-header.yaml +++ b/llvm/test/tools/yaml2obj/ELF/program-header.yaml @@ -39,6 +39,7 @@ ProgramHeaders: - Type: PT_GNU_STACK - Type: PT_GNU_RELRO - Type: PT_GNU_PROPERTY + - Type: PT_GNU_SFRAME #CHECK: ProgramHeaders [ #CHECK-NEXT: ProgramHeader { @@ -78,6 +79,9 @@ ProgramHeaders: #CHECK-NEXT: ProgramHeader { #CHECK-NEXT: Type: PT_GNU_PROPERTY (0x6474E553) #CHECK: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_GNU_SFRAME (0x6474E554) +#CHECK: } #CHECK-NEXT:] ## Check we do not allow referencing sections that do not exist. diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp index 2503008929f98..1e7bb00916cd7 100644 --- a/llvm/tools/llvm-objdump/ELFDump.cpp +++ b/llvm/tools/llvm-objdump/ELFDump.cpp @@ -291,6 +291,9 @@ template void ELFDumper::printProgramHeaders() { case ELF::PT_GNU_STACK: outs() << " STACK "; break; + case ELF::PT_GNU_SFRAME: + outs() << " SFRAME "; + break; case ELF::PT_INTERP: outs() << " INTERP "; break; diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 101079f09e1d2..465c189680cae 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -1490,6 +1490,7 @@ static StringRef segmentTypeToString(unsigned Arch, unsigned Type) { LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_STACK); LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_RELRO); LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_PROPERTY); + LLVM_READOBJ_ENUM_CASE(ELF, PT_GNU_SFRAME); LLVM_READOBJ_ENUM_CASE(ELF, PT_OPENBSD_MUTABLE); LLVM_READOBJ_ENUM_CASE(ELF, PT_OPENBSD_RANDOMIZE);