mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-31 01:43:03 +08:00
107fb76317
_dyld_get_all_image_infos() was only used in test code in Crashpad. This addresses two related problems. When running on 10.13 or later, _dyld_get_all_image_infos() is not available. It appears to still be implemented in dyld, but its symbol is now private. This was always known to be an “internal” interface. When it’s not available, fall back to obtaining the address of the process’ dyld_all_image_infos structure by calling task_info(…, TASK_DYLD_INFO, …). Note that this is the same thing that the code being tested does, although the tests are not rendered entirely pointless because the code being tested consumes dyld_all_image_infos through its own implementation of an out-of-process reader interface, while the dyld_all_image_infos data obtained by _dyld_get_all_image_infos() is handled strictly in-process by ordinary memory reads. This is covered by bug 187. When building with the 10.13 SDK, no _dyld_get_all_image_infos symbol is available to link against. In this case, access the symbol strictly at runtime via dlopen() if it may be available, or when expecting to only run on 10.13 and later, don’t even bother looking for this symbol. This is covered by part of bug 188. Bug: crashpad:185, crashpad:187, crashpad:188 Change-Id: Ib283e070faf5d1ec35deee420213b53ec24fb1d3 Reviewed-on: https://chromium-review.googlesource.com/534633 Reviewed-by: Robert Sesek <rsesek@chromium.org>
47 lines
1.2 KiB
C++
47 lines
1.2 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.
|
|
|
|
#include "test/scoped_module_handle.h"
|
|
|
|
#include "base/logging.h"
|
|
|
|
namespace crashpad {
|
|
namespace test {
|
|
|
|
// static
|
|
void ScopedModuleHandle::Impl::Close(ModuleHandle handle) {
|
|
#if defined(OS_POSIX)
|
|
if (dlclose(handle) != 0) {
|
|
LOG(ERROR) << "dlclose: " << dlerror();
|
|
}
|
|
#elif defined(OS_WIN)
|
|
if (!FreeLibrary(handle)) {
|
|
PLOG(ERROR) << "FreeLibrary";
|
|
}
|
|
#else
|
|
#error Port
|
|
#endif
|
|
}
|
|
|
|
ScopedModuleHandle::ScopedModuleHandle(ModuleHandle handle) : handle_(handle) {}
|
|
|
|
ScopedModuleHandle::~ScopedModuleHandle() {
|
|
if (valid()) {
|
|
Impl::Close(handle_);
|
|
}
|
|
}
|
|
|
|
} // namespace test
|
|
} // namespace crashpad
|