Skip to content

[elf] Add support for {SHT,PT}_GNU_SFRAME constants #148803

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

labath
Copy link
Collaborator

@labath labath commented Jul 15, 2025

@llvmbot
Copy link
Member

llvmbot commented Jul 15, 2025

@llvm/pr-subscribers-objectyaml

@llvm/pr-subscribers-llvm-binary-utilities

Author: Pavel Labath (labath)

Changes

Reference: https://sourceware.org/git/?p=gnu-gabi.git;a=blob;f=program-loading-and-dynamic-linking.txt;h=3357d865720285df2d29c4e8f92de49ddf1beb40;hb=refs/heads/master


Patch is 20.76 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/148803.diff

8 Files Affected:

  • (modified) llvm/include/llvm/BinaryFormat/ELF.h (+2)
  • (modified) llvm/lib/Object/ELF.cpp (+1)
  • (modified) llvm/lib/ObjectYAML/ELFYAML.cpp (+2)
  • (modified) llvm/test/tools/llvm-objdump/ELF/program-headers.test (+64-55)
  • (modified) llvm/test/tools/llvm-readobj/ELF/section-types.test (+5)
  • (modified) llvm/test/tools/yaml2obj/ELF/program-header.yaml (+4)
  • (modified) llvm/tools/llvm-objdump/ELFDump.cpp (+3)
  • (modified) llvm/tools/llvm-readobj/ELFDumper.cpp (+1)
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<ELFYAML::ELF_PT>::enumeration(
   ECase(PT_GNU_STACK);
   ECase(PT_GNU_RELRO);
   ECase(PT_GNU_PROPERTY);
+  ECase(PT_GNU_SFRAME);
 #undef ECase
   IO.enumFallback<Hex32>(Value);
 }
@@ -723,6 +724,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::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 <class ELFT> void ELFDumper<ELFT>::printProgramHeaders() {
     case ELF::PT_GNU_STACK:
       outs() << "   STACK ";
...
[truncated]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants