//===-- Header file of gnu_property_section -------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_STARTUP_LINUX_GNU_PROPERTY_SECTION_H #define LLVM_LIBC_STARTUP_LINUX_GNU_PROPERTY_SECTION_H #include "hdr/elf_proxy.h" #include "hdr/link_macros.h" #include "src/__support/macros/attributes.h" #include "src/__support/macros/config.h" namespace LIBC_NAMESPACE_DECL { struct GnuPropertyFeatures { // Set if the binary was compiled with SHSTK enabled and declares support. bool shstk_supported = false; }; // This class parses the .note.gnu.property section within the ELF binary. // Currently it only extracts the bit representing SHSTK support but can easily // be expanded to other features included in it. // The layout of the .note.gnu.property section and the program property is // described in "System V Application Binary Interface - Linux Extensions" // (https://github.com/hjl-tools/linux-abi/wiki). class GnuPropertySection { private: [[maybe_unused]] GnuPropertyFeatures features_; public: LIBC_INLINE GnuPropertySection() = default; bool parse(const ElfW(Phdr) * gnu_property_phdr, const ElfW(Addr) base); LIBC_INLINE bool is_shstk_supported() const { return features_.shstk_supported; } }; } // namespace LIBC_NAMESPACE_DECL #endif // LLVM_LIBC_STARTUP_LINUX_GNU_PROPERTY_SECTION_H