From 7b1f21e5c448158d2d5f6db508fa2dd4f391de41 Mon Sep 17 00:00:00 2001 From: Paul Pluzhnikov Date: Tue, 16 Dec 2008 05:06:05 +0000 Subject: [PATCH] 2008-12-15 Paul Pluzhnikov * dbxread.c (read_ofile_symtab): Sign-extend 32-bit N_LSYM and N_PSYM STABS values for 64-bit GDB. --- gdb/ChangeLog | 5 +++++ gdb/dbxread.c | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4a4f5dfc1e4..0a20c1d3827 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-12-15 Paul Pluzhnikov + + * 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 * dwarf2expr.c (execute_stack_op): Handle DW_OP_swap. 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); } -- 2.30.2