2008-12-15 Paul Pluzhnikov <ppluzhnikov@google.com>
authorPaul Pluzhnikov <ppluzhnikov@google.com>
Tue, 16 Dec 2008 05:06:05 +0000 (05:06 +0000)
committerPaul Pluzhnikov <ppluzhnikov@google.com>
Tue, 16 Dec 2008 05:06:05 +0000 (05:06 +0000)
* dbxread.c (read_ofile_symtab): Sign-extend 32-bit N_LSYM and
N_PSYM STABS values for 64-bit GDB.

gdb/ChangeLog
gdb/dbxread.c

index 4a4f5dfc1e44113ee285236c972660a75d97a284..0a20c1d3827f107b8eab64a9b8e0b29493872b34 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-15  Paul Pluzhnikov  <ppluzhnikov@google.com>
+
+       * dbxread.c (read_ofile_symtab): Sign-extend 32-bit N_LSYM and
+       N_PSYM STABS values for 64-bit GDB.
+
 2008-12-15  Tristan Gingold  <gingold@adacore.com>
 
        * dwarf2expr.c (execute_stack_op): Handle DW_OP_swap.
index dde922a6344bfd1ef256d42123c624e543645d14..115bdef32cd061c2433fb490c98e86bb3ded717d 100644 (file)
@@ -2597,6 +2597,19 @@ read_ofile_symtab (struct partial_symtab *pst)
 
       if (type & N_STAB)
        {
+         if (sizeof (nlist.n_value) > 4
+             /* We are a 64-bit debugger debugging a 32-bit program.  */
+             && (type == N_LSYM || type == N_PSYM))
+             /* We have to be careful with the n_value in the case of N_LSYM
+                and N_PSYM entries, because they are signed offsets from frame
+                pointer, but we actually read them as unsigned 32-bit values.
+                This is not a problem for 32-bit debuggers, for which negative
+                values end up being interpreted correctly (as negative
+                offsets) due to integer overflow.
+                But we need to sign-extend the value for 64-bit debuggers,
+                or we'll end up interpreting negative values as very large
+                positive offsets.  */
+           nlist.n_value = (nlist.n_value ^ 0x80000000) - 0x80000000;
          process_one_symbol (type, nlist.n_desc, nlist.n_value,
                              namestring, section_offsets, objfile);
        }