[Cell/B.E.] Fix wrong relocation for TLS variable offset
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Thu, 27 Aug 2015 17:31:04 +0000 (19:31 +0200)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Thu, 27 Aug 2015 17:31:04 +0000 (19:31 +0200)
When debugging Cell/B.E. code, the cross-architecture frame unwinding
works by accessing data structures refered to by a thread-local variable
in the inferior.  While accessing this variable via minimal symbol,
code would use BMSYMBOL_VALUE_ADDRESS to determine the offset of the
variable in the thread-local storage block.

This is incorrect, since it adds any relocation offset of the shared
library defining the TLS variable.  That offset would be OK when
accessing the initial copy present in the .tbss section, but it must
not be applied to the offset of the variable in the TLS block at
runtime.  Depending on whether or not the libspe2.so library was
prelinked, access to the variable would fail due to the incorrectly
relocated offset.

ChangeLog:

* ppc-linux-tdep.c (ppc_linux_spe_context_lookup): Do not
attempt to relocate a TLS variable offset.

gdb/ChangeLog
gdb/ppc-linux-tdep.c

index 46fb2d1683a0f98ccfabba06ee4922a5e96fc9f7..399cdaa0bd9bb4e67f6514e2a427094b492df0d9 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-08  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * ppc-linux-tdep.c (ppc_linux_spe_context_lookup): Do not
+       attempt to relocate a TLS variable offset.
+
 2015-08-08  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * spu-multiarch.c (parse_spufs_run): Bail out if inferior is not
index 69c791e39ffe799257ab2ae4153286f474515d36..56d9994476b3d0aa49fbdbb3ec42a9e7c35755c0 100644 (file)
@@ -1140,7 +1140,7 @@ ppc_linux_spe_context_lookup (struct objfile *objfile)
     {
       spe_context_objfile = objfile;
       spe_context_lm_addr = svr4_fetch_objfile_link_map (objfile);
-      spe_context_offset = BMSYMBOL_VALUE_ADDRESS (sym);
+      spe_context_offset = MSYMBOL_VALUE_RAW_ADDRESS (sym.minsym);
       spe_context_cache_ptid = minus_one_ptid;
       spe_context_cache_address = 0;
       return;