diff options
author | Paul Pluzhnikov <ppluzhnikov@google.com> | 2008-12-16 05:06:05 +0000 |
---|---|---|
committer | Paul Pluzhnikov <ppluzhnikov@google.com> | 2008-12-16 05:06:05 +0000 |
commit | 7b1f21e5c448158d2d5f6db508fa2dd4f391de41 (patch) | |
tree | 9eb931b67c4d5603e5f4625842926faac99fa2ca /gdb/dbxread.c | |
parent | *** empty log message *** (diff) | |
download | binutils-gdb-7b1f21e5c448158d2d5f6db508fa2dd4f391de41.tar.gz binutils-gdb-7b1f21e5c448158d2d5f6db508fa2dd4f391de41.tar.bz2 binutils-gdb-7b1f21e5c448158d2d5f6db508fa2dd4f391de41.zip |
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.
Diffstat (limited to 'gdb/dbxread.c')
-rw-r--r-- | gdb/dbxread.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gdb/dbxread.c b/gdb/dbxread.c index dde922a6344..115bdef32cd 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -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); } |