mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-26 23:01:05 +08:00
52ff1accbb
The general strategy used by Crashpad to determine loaded modules is to read the link_map to get the addresses of the dynamic arrays for all loaded modules. Those addresses can then be used to query the MemoryMap to locate the module's mappings, and in particular the base mapping from which Crashpad can parse the entire loaded ELF file. ELF modules are typically loaded in several mappings with varying permissions for different segments. The previous strategy used to find the base mapping for a module was to search backwards from the mapping for the dynamic array until a mapping from file offset 0 was found for the same file. This fails when the file is mapped multiple times from file offset 0, which can happen if the first page of the file contains a GNU_RELRO segment. This new strategy queries the MemoryMap for ALL mappings associated with the dynamic array's mapping, mapped from offset 0. The consumer (process_reader_linux.cc) can then determine which mapping is the correct base by attempting to parse a module at that address and corroborating the PT_DYNAMIC or program header table address from the parsed module with the values Crashpad gets from the link_map or auxiliary vector. Bug: crashpad:30 Change-Id: Ibfcbba512e8fccc8c65afef734ea5640b71e9f70 Reviewed-on: https://chromium-review.googlesource.com/1139396 Commit-Queue: Joshua Peraza <jperaza@chromium.org> Reviewed-by: Mark Mentovai <mark@chromium.org>
86 lines
2.4 KiB
C++
86 lines
2.4 KiB
C++
// Copyright 2017 The Crashpad Authors. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef CRASHPAD_TEST_SCOPED_MODULE_HANDLE_H_
|
|
#define CRASHPAD_TEST_SCOPED_MODULE_HANDLE_H_
|
|
|
|
#include "base/macros.h"
|
|
#include "build/build_config.h"
|
|
|
|
#if defined(OS_POSIX)
|
|
#include <dlfcn.h>
|
|
#elif defined(OS_WIN)
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
namespace crashpad {
|
|
namespace test {
|
|
|
|
//! \brief Maintains ownership of a loadable module handle, releasing it as
|
|
//! appropriate on destruction.
|
|
class ScopedModuleHandle {
|
|
private:
|
|
class Impl {
|
|
public:
|
|
#if defined(OS_POSIX)
|
|
using ModuleHandle = void*;
|
|
|
|
static void* LookUpSymbol(ModuleHandle handle, const char* symbol_name) {
|
|
return dlsym(handle, symbol_name);
|
|
}
|
|
#elif defined(OS_WIN)
|
|
using ModuleHandle = HMODULE;
|
|
|
|
static void* LookUpSymbol(ModuleHandle handle, const char* symbol_name) {
|
|
return reinterpret_cast<void*>(GetProcAddress(handle, symbol_name));
|
|
}
|
|
#endif
|
|
|
|
static void Close(ModuleHandle handle);
|
|
|
|
private:
|
|
DISALLOW_IMPLICIT_CONSTRUCTORS(Impl);
|
|
};
|
|
|
|
public:
|
|
using ModuleHandle = Impl::ModuleHandle;
|
|
|
|
explicit ScopedModuleHandle(ModuleHandle handle);
|
|
ScopedModuleHandle(ScopedModuleHandle&& handle);
|
|
~ScopedModuleHandle();
|
|
|
|
//! \return The module handle being managed.
|
|
ModuleHandle get() const { return handle_; }
|
|
|
|
//! \return `true` if this object manages a valid loadable module handle.
|
|
bool valid() const { return handle_ != nullptr; }
|
|
|
|
//! \return The value of the symbol named by \a symbol_name, or `nullptr` on
|
|
//! failure.
|
|
template <typename T>
|
|
T LookUpSymbol(const char* symbol_name) const {
|
|
return reinterpret_cast<T>(Impl::LookUpSymbol(handle_, symbol_name));
|
|
}
|
|
|
|
private:
|
|
ModuleHandle handle_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(ScopedModuleHandle);
|
|
};
|
|
|
|
} // namespace test
|
|
} // namespace crashpad
|
|
|
|
#endif // CRASHPAD_TEST_SCOPED_MODULE_HANDLE_H_
|