10b57cec5SDimitry Andric //===-- NativeProcessELF.h ------------------------------------ -*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef liblldb_NativeProcessELF_H_ 100b57cec5SDimitry Andric #define liblldb_NativeProcessELF_H_ 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "Plugins/Process/Utility/AuxVector.h" 130b57cec5SDimitry Andric #include "lldb/Host/common/NativeProcessProtocol.h" 140b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELF.h" 15*bdd1243dSDimitry Andric #include <optional> 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric namespace lldb_private { 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric /// \class NativeProcessELF 200b57cec5SDimitry Andric /// Abstract class that extends \a NativeProcessProtocol with ELF specific 210b57cec5SDimitry Andric /// logic. Meant to be subclassed by ELF based NativeProcess* implementations. 220b57cec5SDimitry Andric class NativeProcessELF : public NativeProcessProtocol { 230b57cec5SDimitry Andric using NativeProcessProtocol::NativeProcessProtocol; 240b57cec5SDimitry Andric 25fe6060f1SDimitry Andric public: 26*bdd1243dSDimitry Andric std::optional<uint64_t> GetAuxValue(enum AuxVector::EntryType type); 27fe6060f1SDimitry Andric 280b57cec5SDimitry Andric protected: 290b57cec5SDimitry Andric template <typename T> struct ELFLinkMap { 300b57cec5SDimitry Andric T l_addr; 310b57cec5SDimitry Andric T l_name; 320b57cec5SDimitry Andric T l_ld; 330b57cec5SDimitry Andric T l_next; 340b57cec5SDimitry Andric T l_prev; 350b57cec5SDimitry Andric }; 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric lldb::addr_t GetSharedLibraryInfoAddress() override; 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric template <typename ELF_EHDR, typename ELF_PHDR, typename ELF_DYN> 400b57cec5SDimitry Andric lldb::addr_t GetELFImageInfoAddress(); 410b57cec5SDimitry Andric 429dba64beSDimitry Andric llvm::Expected<std::vector<SVR4LibraryInfo>> 439dba64beSDimitry Andric GetLoadedSVR4Libraries() override; 449dba64beSDimitry Andric 459dba64beSDimitry Andric template <typename T> 469dba64beSDimitry Andric llvm::Expected<SVR4LibraryInfo> 479dba64beSDimitry Andric ReadSVR4LibraryInfo(lldb::addr_t link_map_addr); 489dba64beSDimitry Andric 4981ad6265SDimitry Andric void NotifyDidExec() override; 5081ad6265SDimitry Andric 510b57cec5SDimitry Andric std::unique_ptr<AuxVector> m_aux_vector; 52*bdd1243dSDimitry Andric std::optional<lldb::addr_t> m_shared_library_info_addr; 530b57cec5SDimitry Andric }; 540b57cec5SDimitry Andric 555ffd83dbSDimitry Andric // Explicitly declare the two 32/64 bit templates that NativeProcessELF.cpp will 565ffd83dbSDimitry Andric // define. This allows us to keep the template definition here and usable 575ffd83dbSDimitry Andric // elsewhere. 585ffd83dbSDimitry Andric extern template lldb::addr_t NativeProcessELF::GetELFImageInfoAddress< 595ffd83dbSDimitry Andric llvm::ELF::Elf32_Ehdr, llvm::ELF::Elf32_Phdr, llvm::ELF::Elf32_Dyn>(); 605ffd83dbSDimitry Andric extern template lldb::addr_t NativeProcessELF::GetELFImageInfoAddress< 615ffd83dbSDimitry Andric llvm::ELF::Elf64_Ehdr, llvm::ELF::Elf64_Phdr, llvm::ELF::Elf64_Dyn>(); 625ffd83dbSDimitry Andric 630b57cec5SDimitry Andric } // namespace lldb_private 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric #endif 66