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

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