xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Process/POSIX/NativeProcessELF.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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