| //===-- 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 |