python-pyflame: Upgrade to 1.6.7

Disable build on ppc as well
Drop already upstreamed patches

Signed-off-by: Khem Raj <raj.khem@gmail.com>
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: Tim "moto-timo" Orling <TicoTimo@gmail.com>
Cc: Derek Straka <derek@asterius.io>
This commit is contained in:
Khem Raj
2018-12-23 10:57:37 -08:00
parent 7227733cbf
commit 3b59515c5a
5 changed files with 6 additions and 210 deletions

View File

@@ -1,69 +0,0 @@
From 2ef124e235a47dd4742813cf80e11a89cf4f02f8 Mon Sep 17 00:00:00 2001
From: Andrew Jeffery <andrew@aj.id.au>
Date: Thu, 3 May 2018 12:35:31 +0930
Subject: [PATCH] ptrace: Abstract over user_regs_struct name, which differs on
ARM32
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
---
src/ptrace.cc | 6 +++---
src/ptrace.h | 10 ++++++++--
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/ptrace.cc b/src/ptrace.cc
index 485f58e4d82e..610fabb3b8e8 100644
--- a/src/ptrace.cc
+++ b/src/ptrace.cc
@@ -122,8 +122,8 @@ void PtraceInterrupt(pid_t pid) {
DoWait(pid);
}
-struct user_regs_struct PtraceGetRegs(pid_t pid) {
- struct user_regs_struct regs;
+user_regs_struct PtraceGetRegs(pid_t pid) {
+ user_regs_struct regs;
if (ptrace(PTRACE_GETREGS, pid, 0, &regs)) {
std::ostringstream ss;
ss << "Failed to PTRACE_GETREGS: " << strerror(errno);
@@ -132,7 +132,7 @@ struct user_regs_struct PtraceGetRegs(pid_t pid) {
return regs;
}
-void PtraceSetRegs(pid_t pid, struct user_regs_struct regs) {
+void PtraceSetRegs(pid_t pid, user_regs_struct regs) {
if (ptrace(PTRACE_SETREGS, pid, 0, &regs)) {
std::ostringstream ss;
ss << "Failed to PTRACE_SETREGS: " << strerror(errno);
diff --git a/src/ptrace.h b/src/ptrace.h
index 7083be1c4dfd..d6af8bf9f83a 100644
--- a/src/ptrace.h
+++ b/src/ptrace.h
@@ -23,6 +23,12 @@
#include "./config.h"
+#if defined(__arm__)
+typedef struct user_regs user_regs_struct;
+#else
+typedef struct user_regs_struct user_regs_struct;
+#endif
+
namespace pyflame {
int DoWait(pid_t pid, int options = 0);
@@ -39,10 +45,10 @@ void PtraceSeize(pid_t pid);
void PtraceInterrupt(pid_t pid);
// get regs from a process
-struct user_regs_struct PtraceGetRegs(pid_t pid);
+user_regs_struct PtraceGetRegs(pid_t pid);
// set regs in a process
-void PtraceSetRegs(pid_t pid, struct user_regs_struct regs);
+void PtraceSetRegs(pid_t pid, user_regs_struct regs);
// poke a long word into an address
void PtracePoke(pid_t pid, unsigned long addr, long data);
--
2.14.1

View File

@@ -1,134 +0,0 @@
From 007965d341349679607699d005c4af811b2c419a Mon Sep 17 00:00:00 2001
From: Andrew Jeffery <andrew@aj.id.au>
Date: Fri, 4 May 2018 11:23:53 +0930
Subject: [PATCH] symbol: Account for prelinked shared objects
Some projects, such as those derived from Yocto, tend to prelink their
binaries and libraries to reduce runtime overhead. Currently this trips
up pyflame in its symbol address calculations, and leads to ptrace
failures due to spurious addresses:
$ pyflame -t python -c "print 'foo'"
Unexpected ptrace(2) exception: Failed to PTRACE_PEEKDATA (pid 1482, addr 0x9f9b1d70): Input/output error
Unexpected ptrace(2) exception: Failed to PTRACE_PEEKDATA (pid 1482, addr 0x9f9b1d70): Input/output error
Unexpected ptrace(2) exception: Failed to PTRACE_PEEKDATA (pid 1482, addr 0x9f9b1d70): Input/output error
Unexpected ptrace(2) exception: Failed to PTRACE_PEEKDATA (pid 1482, addr 0x9f9b1d70): Input/output error
Unexpected ptrace(2) exception: Failed to PTRACE_PEEKDATA (pid 1482, addr 0x9f9b1d70): Input/output error
...
Add support for reading a prelinked base p_vaddr out of the ELF and
adjust the PyAddresses values accordingly.
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
---
src/symbol.cc | 15 +++++++++++++++
src/symbol.h | 29 ++++++++++++++++++++++++++++-
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/src/symbol.cc b/src/symbol.cc
index 125174efeeb5..39c3e8132dd1 100644
--- a/src/symbol.cc
+++ b/src/symbol.cc
@@ -166,6 +166,17 @@ PyABI ELF::WalkTable(int sym, int str, PyAddresses *addrs) {
return abi;
}
+addr_t ELF::GetBaseAddress() {
+ int32_t phnum = hdr()->e_phnum;
+ int32_t i;
+ for (i = 0; i < phnum && phdr(i)->p_type != PT_LOAD; i++) {
+ }
+ if (i == phnum) {
+ throw FatalException("Failed to find PT_LOAD entry in program headers");
+ }
+ return phdr(i)->p_vaddr;
+}
+
PyAddresses ELF::GetAddresses(PyABI *abi) {
PyAddresses addrs;
PyABI detected_abi = WalkTable(dynsym_, dynstr_, &addrs);
@@ -176,6 +187,10 @@ PyAddresses ELF::GetAddresses(PyABI *abi) {
if (abi != nullptr) {
*abi = detected_abi;
}
+ // Handle prelinked shared objects
+ if (hdr()->e_type == ET_DYN) {
+ return addrs - GetBaseAddress();
+ }
return addrs;
}
} // namespace pyflame
diff --git a/src/symbol.h b/src/symbol.h
index 124853bcc1c1..bb92b9a2604b 100644
--- a/src/symbol.h
+++ b/src/symbol.h
@@ -28,15 +28,19 @@
#if USE_ELF64
#define ehdr_t Elf64_Ehdr
+#define phdr_t Elf64_Phdr
#define shdr_t Elf64_Shdr
#define dyn_t Elf64_Dyn
#define sym_t Elf64_Sym
+#define addr_t Elf64_Addr
#define ARCH_ELFCLASS ELFCLASS64
#else
#define ehdr_t Elf32_Ehdr
+#define phdr_t Elf32_Phdr
#define shdr_t Elf32_Shdr
#define dyn_t Elf32_Dyn
#define sym_t Elf32_Sym
+#define addr_t Elf32_Addr
#define ARCH_ELFCLASS ELFCLASS32
#endif
@@ -67,8 +71,18 @@ struct PyAddresses {
interp_head_hint(0),
pie(false) {}
+ PyAddresses operator-(const unsigned long base) const {
+ PyAddresses res(*this);
+ res.tstate_addr = this->tstate_addr == 0 ? 0 : this->tstate_addr - base;
+ res.interp_head_addr =
+ this->interp_head_addr == 0 ? 0 : this->interp_head_addr - base;
+ res.interp_head_fn_addr =
+ this->interp_head_fn_addr == 0 ? 0 : this->interp_head_fn_addr - base;
+ return res;
+ }
+
PyAddresses operator+(const unsigned long base) const {
- PyAddresses res;
+ PyAddresses res(*this);
res.tstate_addr = this->tstate_addr == 0 ? 0 : this->tstate_addr + base;
res.interp_head_addr =
this->interp_head_addr == 0 ? 0 : this->interp_head_addr + base;
@@ -113,6 +127,9 @@ class ELF {
// ABI.
PyAddresses GetAddresses(PyABI *abi);
+ // Extract the base load address from the Program Header table
+ addr_t GetBaseAddress();
+
private:
void *addr_;
size_t length_;
@@ -122,6 +139,16 @@ class ELF {
return reinterpret_cast<const ehdr_t *>(addr_);
}
+ inline const phdr_t *phdr(int idx) const {
+ if (idx < 0) {
+ std::ostringstream ss;
+ ss << "Illegal phdr index: " << idx;
+ throw FatalException(ss.str());
+ }
+ return reinterpret_cast<const phdr_t *>(p() + hdr()->e_phoff +
+ idx * hdr()->e_phentsize);
+ }
+
inline const shdr_t *shdr(int idx) const {
if (idx < 0) {
std::ostringstream ss;
--
2.14.1

View File

@@ -5,7 +5,7 @@ LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=2ee41112a44fe7014dce33e26468ba93"
DEPENDS = "python"
SRC_URI = "git://github.com/uber/pyflame.git;protocol=https"
SRC_URI = "git://github.com/uber/pyflame.git;protocol=https;nobranch=1"
S = "${WORKDIR}/git"
inherit pkgconfig autotools
@@ -13,3 +13,4 @@ inherit pkgconfig autotools
COMPATIBLE_HOST_libc-musl_class-target = "null"
COMPATIBLE_HOST_mipsarch_class-target = "null"
COMPATIBLE_HOST_aarch64_class-target = "null"
COMPATIBLE_HOST_powerpc_class-target = "null"

View File

@@ -1,6 +0,0 @@
require python-pyflame.inc
# v1.6.6
SRCREV = "8a9d8c2acc3b3bb027475b738134f1e6fff14e6c"
SRC_URI += "file://0001-ptrace-Abstract-over-user_regs_struct-name-which-dif.patch"
SRC_URI += "file://0001-symbol-Account-for-prelinked-shared-objects.patch"

View File

@@ -0,0 +1,4 @@
require python-pyflame.inc
# v1.6.7
SRCREV = "c151d2f34737f28a1f5266a003b2b0720bbd9f96"