diff options
Diffstat (limited to 'meta-openembedded/meta-python/recipes-devtools/python/python-pyflame-1.6.6')
2 files changed, 203 insertions, 0 deletions
diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python-pyflame-1.6.6/0001-ptrace-Abstract-over-user_regs_struct-name-which-dif.patch b/meta-openembedded/meta-python/recipes-devtools/python/python-pyflame-1.6.6/0001-ptrace-Abstract-over-user_regs_struct-name-which-dif.patch new file mode 100644 index 000000000..09c4394c2 --- /dev/null +++ b/meta-openembedded/meta-python/recipes-devtools/python/python-pyflame-1.6.6/0001-ptrace-Abstract-over-user_regs_struct-name-which-dif.patch @@ -0,0 +1,69 @@ +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, ®s)) { + 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, ®s)) { + 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 + diff --git a/meta-openembedded/meta-python/recipes-devtools/python/python-pyflame-1.6.6/0001-symbol-Account-for-prelinked-shared-objects.patch b/meta-openembedded/meta-python/recipes-devtools/python/python-pyflame-1.6.6/0001-symbol-Account-for-prelinked-shared-objects.patch new file mode 100644 index 000000000..3eefc9cb9 --- /dev/null +++ b/meta-openembedded/meta-python/recipes-devtools/python/python-pyflame-1.6.6/0001-symbol-Account-for-prelinked-shared-objects.patch @@ -0,0 +1,134 @@ +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 + |