NativeProcessLinux is not able to properly read libraries-svr4 data when running with ld.so as the "main" executable. Normally, this is not a big problem, as it returns an error message, and lldb can fallback to manual library loading. Unfortunately, lldb-server also does not clear cached svr4 data on exec, which means that it does *not* return an error when the application execs from the "regular" to the "ld.so" mode. Instead it returns incorrect data (it is missing the main executable) and causes TestDyldExecLinux to fail (but only when building with xml support enabled). This patch makes ensures that cached process data is cleared on exec, fixing the test. Since TestDyldExecLinux has shown to be sensitive to the way we read library info, I fork it into two (with svr4 enabled and disabled).
65 lines
2.1 KiB
C++
65 lines
2.1 KiB
C++
//===-- NativeProcessELF.h ------------------------------------ -*- C++ -*-===//
|
|
//
|
|
// 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 liblldb_NativeProcessELF_H_
|
|
#define liblldb_NativeProcessELF_H_
|
|
|
|
#include "Plugins/Process/Utility/AuxVector.h"
|
|
#include "lldb/Host/common/NativeProcessProtocol.h"
|
|
#include "llvm/BinaryFormat/ELF.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
/// \class NativeProcessELF
|
|
/// Abstract class that extends \a NativeProcessProtocol with ELF specific
|
|
/// logic. Meant to be subclassed by ELF based NativeProcess* implementations.
|
|
class NativeProcessELF : public NativeProcessProtocol {
|
|
using NativeProcessProtocol::NativeProcessProtocol;
|
|
|
|
public:
|
|
llvm::Optional<uint64_t> GetAuxValue(enum AuxVector::EntryType type);
|
|
|
|
protected:
|
|
template <typename T> struct ELFLinkMap {
|
|
T l_addr;
|
|
T l_name;
|
|
T l_ld;
|
|
T l_next;
|
|
T l_prev;
|
|
};
|
|
|
|
lldb::addr_t GetSharedLibraryInfoAddress() override;
|
|
|
|
template <typename ELF_EHDR, typename ELF_PHDR, typename ELF_DYN>
|
|
lldb::addr_t GetELFImageInfoAddress();
|
|
|
|
llvm::Expected<std::vector<SVR4LibraryInfo>>
|
|
GetLoadedSVR4Libraries() override;
|
|
|
|
template <typename T>
|
|
llvm::Expected<SVR4LibraryInfo>
|
|
ReadSVR4LibraryInfo(lldb::addr_t link_map_addr);
|
|
|
|
void NotifyDidExec() override;
|
|
|
|
std::unique_ptr<AuxVector> m_aux_vector;
|
|
llvm::Optional<lldb::addr_t> m_shared_library_info_addr;
|
|
};
|
|
|
|
// Explicitly declare the two 32/64 bit templates that NativeProcessELF.cpp will
|
|
// define. This allows us to keep the template definition here and usable
|
|
// elsewhere.
|
|
extern template lldb::addr_t NativeProcessELF::GetELFImageInfoAddress<
|
|
llvm::ELF::Elf32_Ehdr, llvm::ELF::Elf32_Phdr, llvm::ELF::Elf32_Dyn>();
|
|
extern template lldb::addr_t NativeProcessELF::GetELFImageInfoAddress<
|
|
llvm::ELF::Elf64_Ehdr, llvm::ELF::Elf64_Phdr, llvm::ELF::Elf64_Dyn>();
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif
|