[ltrace] Fix bias handling and cloning of unresolved breakpoints on ppc

Petr Machata pmachata at fedoraproject.org
Tue Dec 9 18:05:36 UTC 2014


commit 5f8efb0257eaa772639d5a4912a6b5e3a709ceab
Author: Petr Machata <pmachata at redhat.com>
Date:   Tue Dec 9 19:04:59 2014 +0100

    Fix bias handling and cloning of unresolved breakpoints on ppc

 ltrace-0.7.91-ppc-bias.patch |   91 ++++++++++++++++++++++++++++++++++++++++++
 ltrace.spec                  |   21 +++++++++-
 2 files changed, 110 insertions(+), 2 deletions(-)
---
diff --git a/ltrace-0.7.91-ppc-bias.patch b/ltrace-0.7.91-ppc-bias.patch
new file mode 100644
index 0000000..c0c0abd
--- /dev/null
+++ b/ltrace-0.7.91-ppc-bias.patch
@@ -0,0 +1,91 @@
+diff --git a/sysdeps/linux-gnu/ppc/plt.c b/sysdeps/linux-gnu/ppc/plt.c
+index 45ed7fb..5f81889 100644
+--- a/sysdeps/linux-gnu/ppc/plt.c
++++ b/sysdeps/linux-gnu/ppc/plt.c
+@@ -274,14 +274,15 @@ arch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela *rela)
+ 
+ 		assert(rela->r_addend != 0);
+ 		/* XXX double cast */
+-		arch_addr_t res_addr = (arch_addr_t) (uintptr_t) rela->r_addend;
++		arch_addr_t res_addr
++		  = (arch_addr_t) (uintptr_t) (rela->r_addend + lte->bias);
+ 		if (arch_translate_address(lte, res_addr, &res_addr) < 0) {
+ 			fprintf(stderr, "Couldn't OPD-translate IRELATIVE "
+ 				"resolver address.\n");
+ 			return 0;
+ 		}
+ 		/* XXX double cast */
+-		return (GElf_Addr) (uintptr_t) res_addr;
++		return (GElf_Addr) (uintptr_t) (res_addr - lte->bias);
+ 
+ 	} else {
+ 		/* We put brakpoints to PLT entries the same as the
+@@ -453,7 +454,7 @@ arch_elf_init(struct ltelf *lte, struct library *lib)
+ #ifndef EF_PPC64_ABI
+ 	assert (! (lte->ehdr.e_flags & 3 ) == 2)
+ #else
+-	lte->arch.elfv2_abi=((lte->ehdr.e_flags & EF_PPC64_ABI) == 2) ;
++	lte->arch.elfv2_abi = ((lte->ehdr.e_flags & EF_PPC64_ABI) == 2);
+ #endif
+ 
+ 	if (lte->ehdr.e_machine == EM_PPC64
+@@ -827,15 +828,15 @@ arch_elf_add_plt_entry(struct process *proc, struct ltelf *lte,
+ 	assert(plt_slot_addr >= lte->plt_addr
+ 	       || plt_slot_addr < lte->plt_addr + lte->plt_size);
+ 
++	plt_entry_addr += lte->bias;
++	plt_slot_addr += lte->bias;
++
+ 	/* Should avoid to do read if dynamic linker hasn't run yet
+ 	 * or allow -1 a valid return code.  */
+ 	GElf_Addr plt_slot_value;
+-	if (read_plt_slot_value(proc, plt_slot_addr, &plt_slot_value) < 0) {
+-		if (!lte->arch.elfv2_abi)
+-			goto fail;
+-		else
+-			return PPC_PLT_UNRESOLVED;
+-	}
++	int rc = read_plt_slot_value(proc, plt_slot_addr, &plt_slot_value);
++	if (rc < 0 && !lte->arch.elfv2_abi)
++		goto fail;
+ 
+ 	struct library_symbol *libsym = malloc(sizeof(*libsym));
+ 	if (libsym == NULL) {
+@@ -854,8 +855,9 @@ arch_elf_add_plt_entry(struct process *proc, struct ltelf *lte,
+ 		goto fail2;
+ 	libsym->arch.plt_slot_addr = plt_slot_addr;
+ 
+-	if (! is_irelative
+-	    && (plt_slot_value == plt_entry_addr || plt_slot_value == 0)) {
++	if (rc < 0 || (! is_irelative
++		       && (plt_slot_value == plt_entry_addr
++			   || plt_slot_value == 0))) {
+ 		libsym->arch.type = PPC_PLT_UNRESOLVED;
+ 		libsym->arch.resolved_value = plt_entry_addr;
+ 	} else {
+@@ -1166,8 +1168,8 @@ ppc_plt_bp_install(struct breakpoint *bp, struct process *proc)
+ 				libsym->arch.resolved_value = plt_entry_addr;
+ 			}
+ 		} else {
+-			fprintf(stderr, "Couldn't unresolve %s@%p.  Not tracing"
+-				" this symbol.\n",
++			fprintf(stderr, "Couldn't unresolve %s@%p.  Will not"
++				" trace this symbol.\n",
+ 				breakpoint_name(bp), bp->addr);
+ 			proc_remove_breakpoint(proc, bp);
+ 		}
+@@ -1222,6 +1224,14 @@ arch_library_symbol_clone(struct library_symbol *retp,
+ 			  struct library_symbol *libsym)
+ {
+ 	retp->arch = libsym->arch;
++	if (libsym->arch.type == PPC_PLT_NEED_UNRESOLVE) {
++		assert(libsym->arch.data->self == libsym->arch.data);
++		retp->arch.data = malloc(sizeof *retp->arch.data);
++		if (retp->arch.data == NULL)
++			return -1;
++		*retp->arch.data = *libsym->arch.data;
++		retp->arch.data->self = retp->arch.data;
++	}
+ 	return 0;
+ }
+ 
diff --git a/ltrace.spec b/ltrace.spec
index fbb7c24..5a050d3 100644
--- a/ltrace.spec
+++ b/ltrace.spec
@@ -1,12 +1,12 @@
 Summary: Tracks runtime library calls from dynamically linked executables
 Name: ltrace
 Version: 0.7.91
-Release: 10%{?dist}
+Release: 11%{?dist}
 URL: http://ltrace.alioth.debian.org/
 License: GPLv2+
 Group: Development/Debuggers
 
-BuildRequires: elfutils-libelf-devel dejagnu
+BuildRequires: elfutils-devel dejagnu
 BuildRequires: libselinux-devel
 
 # Note: this URL needs to be updated for each release, as the file
@@ -61,6 +61,16 @@ Patch13: ltrace-0.7.91-ppc64le-support.patch
 # eb3993420734f091cde9a6053ca6b4edcf9ae334
 Patch14: ltrace-0.7.91-ppc64le-fixes.patch
 
+# http://anonscm.debian.org/gitweb/?p=collab-maint/ltrace.git;a=commit;h=2e9f9f1f5d0fb223b109429b9c904504b7f638e2
+# http://anonscm.debian.org/gitweb/?p=collab-maint/ltrace.git;a=commit;h=f96635a03b3868057db5c2d7972d5533e2068345
+Patch15: ltrace-0.7.91-parser-ws_after_id.patch
+
+# https://bugzilla.redhat.com/show_bug.cgi?id=1171165
+# http://anonscm.debian.org/cgit/collab-maint/ltrace.git/commit/?id=d8f1287b85e2c2b2ae0235809e956f4365e53c45
+# http://anonscm.debian.org/cgit/collab-maint/ltrace.git/commit/?id=d80c5371454383e3f9978622e5578cf02af8c44c
+# http://anonscm.debian.org/cgit/collab-maint/ltrace.git/commit/?id=bf82100966deda9c7d26ad085d97c08126a8ae88
+Patch16: ltrace-0.7.91-ppc-bias.patch
+
 %description
 Ltrace is a debugging program which runs a specified command until the
 command exits.  While the command is executing, ltrace intercepts and
@@ -87,6 +97,8 @@ execution of processes.
 %patch11 -p1
 %patch13 -p1
 %patch14 -p1
+%patch15 -p1
+%patch16 -p1
 
 %build
 %configure --docdir=%{?_pkgdocdir}%{!?_pkgdocdir:%{_docdir}/%{name}-%{version}}
@@ -111,6 +123,11 @@ echo ====================TESTING END=====================
 %{_datadir}/ltrace
 
 %changelog
+* Tue Dec  9 2014 Petr Machata <pmachata at redhat.com> - 0.7.91-11
+- Fix bias handling in PPC backend
+- Fix cloning of unresolved breakpoints in PPC backend
+  (ltrace-0.7.91-ppc-bias.patch)
+
 * Wed Aug 20 2014 Petr Machata <pmachata at redhat.com> - 0.7.91-10
 - Backported PowerPC64 ELFv2 support.
   (ltrace-0.7.91-ppc64le-support.patch,


More information about the scm-commits mailing list