diff --git a/compat/compat.gyp b/compat/compat.gyp index e2b2df6d..e14bb498 100644 --- a/compat/compat.gyp +++ b/compat/compat.gyp @@ -94,6 +94,16 @@ ], }, }], + ['OS=="linux"', { + 'include_dirs': [ + 'linux', + ], + 'direct_dependent_settings': { + 'include_dirs': [ + 'linux', + ], + }, + }], ], }, ], diff --git a/compat/linux/sys/ptrace.h b/compat/linux/sys/ptrace.h new file mode 100644 index 00000000..57c5c5ba --- /dev/null +++ b/compat/linux/sys/ptrace.h @@ -0,0 +1,27 @@ +// 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_COMPAT_LINUX_SYS_PTRACE_H_ +#define CRASHPAD_COMPAT_LINUX_SYS_PTRACE_H_ + +#include_next + +#include + +#if defined(__GLIBC__) && defined(__x86_64__) +static constexpr __ptrace_request PTRACE_GET_THREAD_AREA = + static_cast<__ptrace_request>(25); +#endif // __GLIBC__ && __x86_64__ + +#endif // CRASHPAD_COMPAT_LINUX_SYS_PTRACE_H_ diff --git a/util/linux/thread_info.cc b/util/linux/thread_info.cc index 300ae7d3..f63106a6 100644 --- a/util/linux/thread_info.cc +++ b/util/linux/thread_info.cc @@ -283,17 +283,16 @@ bool ThreadInfo::GetThreadArea(LinuxVMAddress* address) { return true; } + size_t index = (context_.t32.xgs & 0xffff) >> 3; user_desc desc; - iovec iov; - iov.iov_base = &desc; - iov.iov_len = sizeof(desc); - *address = 0; - if (ptrace( - PTRACE_GETREGSET, tid_, reinterpret_cast(NT_386_TLS), &iov) != - 0) { + if (ptrace(PTRACE_GET_THREAD_AREA, + tid_, + reinterpret_cast(index), + &desc) != 0) { PLOG(ERROR) << "ptrace"; return false; } + *address = desc.base_addr; return true;