Blame SOURCES/ltrace-0.7.91-ppc64-fork.patch

fe0466
From 35742523e3daa0e59de0c1c3fdd8e5ff52891967 Mon Sep 17 00:00:00 2001
fe0466
From: Petr Machata <pmachata@redhat.com>
fe0466
Date: Thu, 9 Jan 2014 23:41:50 +0100
fe0466
Subject: [PATCH] Fix a problem in tracing across fork on PPC64
fe0466
fe0466
In order to avoid single-stepping through large portions of the
fe0466
dynamic linker, ltrace remembers at which address the instruction that
fe0466
resolved a PLT slot is.  It then puts a breakpoint to this address so
fe0466
that it can fast-forward to that address next time it needs to catch a
fe0466
PLT slot being resolved.
fe0466
fe0466
When a process is cloned, the pointer to this breakpoint is simply
fe0466
copied over to the new process, instead of being looked up in the new
fe0466
process structures.  This patches fixes this.
fe0466
---
fe0466
 sysdeps/linux-gnu/ppc/plt.c |   14 +++++++++++++-
fe0466
 1 files changed, 13 insertions(+), 1 deletions(-)
fe0466
fe0466
diff --git a/sysdeps/linux-gnu/ppc/plt.c b/sysdeps/linux-gnu/ppc/plt.c
fe0466
index 3ec1397..8715da6 100644
fe0466
--- a/sysdeps/linux-gnu/ppc/plt.c
fe0466
+++ b/sysdeps/linux-gnu/ppc/plt.c
fe0466
@@ -1,6 +1,6 @@
fe0466
 /*
fe0466
  * This file is part of ltrace.
fe0466
- * Copyright (C) 2012,2013 Petr Machata, Red Hat Inc.
fe0466
+ * Copyright (C) 2012,2013,2014 Petr Machata, Red Hat Inc.
fe0466
  * Copyright (C) 2004,2008,2009 Juan Cespedes
fe0466
  * Copyright (C) 2006 Paul Gilliam
fe0466
  *
fe0466
@@ -1157,6 +1157,18 @@ int
fe0466
 arch_process_clone(struct process *retp, struct process *proc)
fe0466
 {
fe0466
 	retp->arch = proc->arch;
fe0466
+
fe0466
+	if (retp->arch.dl_plt_update_bp != NULL) {
fe0466
+		/* Point it to the corresponding breakpoint in RETP.
fe0466
+		 * It must be there, this part of PROC has already
fe0466
+		 * been cloned to RETP.  */
fe0466
+		retp->arch.dl_plt_update_bp
fe0466
+			= address2bpstruct(retp,
fe0466
+					   retp->arch.dl_plt_update_bp->addr);
fe0466
+
fe0466
+		assert(retp->arch.dl_plt_update_bp != NULL);
fe0466
+	}
fe0466
+
fe0466
 	return 0;
fe0466
 }
fe0466
 
fe0466
-- 
fe0466
1.7.6.5
fe0466