1f4335b8eSAntonio Afonso //===-- NativeProcessELF.h ------------------------------------ -*- C++ -*-===// 2f4335b8eSAntonio Afonso // 3f4335b8eSAntonio Afonso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f4335b8eSAntonio Afonso // See https://llvm.org/LICENSE.txt for license information. 5f4335b8eSAntonio Afonso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f4335b8eSAntonio Afonso // 7f4335b8eSAntonio Afonso //===----------------------------------------------------------------------===// 8f4335b8eSAntonio Afonso 9f4335b8eSAntonio Afonso #ifndef liblldb_NativeProcessELF_H_ 10f4335b8eSAntonio Afonso #define liblldb_NativeProcessELF_H_ 11f4335b8eSAntonio Afonso 12f4335b8eSAntonio Afonso #include "Plugins/Process/Utility/AuxVector.h" 13f4335b8eSAntonio Afonso #include "lldb/Host/common/NativeProcessProtocol.h" 14f4335b8eSAntonio Afonso #include "llvm/BinaryFormat/ELF.h" 15f4335b8eSAntonio Afonso 16f4335b8eSAntonio Afonso namespace lldb_private { 17f4335b8eSAntonio Afonso 18f4335b8eSAntonio Afonso /// \class NativeProcessELF 19f4335b8eSAntonio Afonso /// Abstract class that extends \a NativeProcessProtocol with ELF specific 20f4335b8eSAntonio Afonso /// logic. Meant to be subclassed by ELF based NativeProcess* implementations. 21f4335b8eSAntonio Afonso class NativeProcessELF : public NativeProcessProtocol { 22f4335b8eSAntonio Afonso using NativeProcessProtocol::NativeProcessProtocol; 23f4335b8eSAntonio Afonso 2488a5b35dSMuhammad Omair Javaid public: 2588a5b35dSMuhammad Omair Javaid llvm::Optional<uint64_t> GetAuxValue(enum AuxVector::EntryType type); 2688a5b35dSMuhammad Omair Javaid 27f4335b8eSAntonio Afonso protected: 28f4335b8eSAntonio Afonso template <typename T> struct ELFLinkMap { 29f4335b8eSAntonio Afonso T l_addr; 30f4335b8eSAntonio Afonso T l_name; 31f4335b8eSAntonio Afonso T l_ld; 32f4335b8eSAntonio Afonso T l_next; 33f4335b8eSAntonio Afonso T l_prev; 34f4335b8eSAntonio Afonso }; 35f4335b8eSAntonio Afonso 36f4335b8eSAntonio Afonso lldb::addr_t GetSharedLibraryInfoAddress() override; 37f4335b8eSAntonio Afonso 38f4335b8eSAntonio Afonso template <typename ELF_EHDR, typename ELF_PHDR, typename ELF_DYN> 39f4335b8eSAntonio Afonso lldb::addr_t GetELFImageInfoAddress(); 40f4335b8eSAntonio Afonso 4105e32badSAntonio Afonso llvm::Expected<std::vector<SVR4LibraryInfo>> 4205e32badSAntonio Afonso GetLoadedSVR4Libraries() override; 4305e32badSAntonio Afonso 4405e32badSAntonio Afonso template <typename T> 4505e32badSAntonio Afonso llvm::Expected<SVR4LibraryInfo> 4605e32badSAntonio Afonso ReadSVR4LibraryInfo(lldb::addr_t link_map_addr); 4705e32badSAntonio Afonso 48*cf2c8e41SPavel Labath void NotifyDidExec() override; 49*cf2c8e41SPavel Labath 50f4335b8eSAntonio Afonso std::unique_ptr<AuxVector> m_aux_vector; 51f4335b8eSAntonio Afonso llvm::Optional<lldb::addr_t> m_shared_library_info_addr; 52f4335b8eSAntonio Afonso }; 53f4335b8eSAntonio Afonso 54fbef6c55SJordan Rupprecht // Explicitly declare the two 32/64 bit templates that NativeProcessELF.cpp will 55fbef6c55SJordan Rupprecht // define. This allows us to keep the template definition here and usable 56fbef6c55SJordan Rupprecht // elsewhere. 57fbef6c55SJordan Rupprecht extern template lldb::addr_t NativeProcessELF::GetELFImageInfoAddress< 58fbef6c55SJordan Rupprecht llvm::ELF::Elf32_Ehdr, llvm::ELF::Elf32_Phdr, llvm::ELF::Elf32_Dyn>(); 59fbef6c55SJordan Rupprecht extern template lldb::addr_t NativeProcessELF::GetELFImageInfoAddress< 60fbef6c55SJordan Rupprecht llvm::ELF::Elf64_Ehdr, llvm::ELF::Elf64_Phdr, llvm::ELF::Elf64_Dyn>(); 61fbef6c55SJordan Rupprecht 62f4335b8eSAntonio Afonso } // namespace lldb_private 63f4335b8eSAntonio Afonso 64f4335b8eSAntonio Afonso #endif 65