From mboxrd@z Thu Jan 1 00:00:00 1970 From: "H . J . Lu" To: gdb@sources.redhat.com Subject: Re: The problem with stabs and sign extension Date: Wed, 08 Aug 2001 17:03:00 -0000 Message-id: <20010808170326.A4132@lucon.org> References: <20010808141207.A31287@nevyn.them.org> <20010808161421.A3360@lucon.org> <20010808165359.A3964@lucon.org> X-SW-Source: 2001-08/msg00081.html On Wed, Aug 08, 2001 at 04:53:59PM -0700, H . J . Lu wrote: > With this patch, I can do > > # gdb vmlinux > ... > (gdb) print printk > $1 = {int (char *)} 0x8011c5b0 > (gdb) list printk > 250 printk.c: No such file or directory. > in printk.c > > Here is an update. H.J. --- 2001-08-08 H.J. Lu (hjl@gnu.org) * dbxread.c (COERCE32): New. (SWAP_SYMBOL): Removed. (INTERNALIZE_SYMBOL): Check sign extended vma. (read_ofile_symtab): Set text_offset with COERCE32 if necessary. --- gdb/dbxread.c.vma Fri Jul 13 12:12:34 2001 +++ gdb/dbxread.c Wed Aug 8 17:00:26 2001 @@ -109,6 +109,10 @@ struct symloc #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset) #define STRING_OFFSET(p) (SYMLOC(p)->string_offset) #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset) + +/* Sign extension to bfd_signed_vma. */ +#define COERCE32(x) \ + ((bfd_signed_vma) (long) (((unsigned long) (x) ^ 0x80000000) - 0x80000000)) /* Remember what we deduced to be the source language of this psymtab. */ @@ -946,22 +950,15 @@ fill_symbuf (bfd *sym_bfd) symbuf_read += nbytes; } -#define SWAP_SYMBOL(symp, abfd) \ - { \ - (symp)->n_strx = bfd_h_get_32(abfd, \ - (unsigned char *)&(symp)->n_strx); \ - (symp)->n_desc = bfd_h_get_16 (abfd, \ - (unsigned char *)&(symp)->n_desc); \ - (symp)->n_value = bfd_h_get_32 (abfd, \ - (unsigned char *)&(symp)->n_value); \ - } - #define INTERNALIZE_SYMBOL(intern, extern, abfd) \ { \ (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type); \ (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx); \ (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc); \ - (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value); \ + if (bfd_get_sign_extend_vma (abfd)) \ + (intern).n_value = bfd_h_get_signed_32 (abfd, (extern)->e_value); \ + else \ + (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value); \ } /* Invariant: The symbol pointed to by symbuf_idx is the first one @@ -1685,9 +1682,13 @@ read_ofile_symtab (struct partial_symtab struct section_offsets *section_offsets; objfile = pst->objfile; + abfd = objfile->obfd; sym_offset = LDSYMOFF (pst); sym_size = LDSYMLEN (pst); - text_offset = pst->textlow; + if (bfd_get_sign_extend_vma (abfd)) + text_offset = COERCE32 (pst->textlow); + else + text_offset = pst->textlow; text_size = pst->texthigh - pst->textlow; /* This cannot be simply objfile->section_offsets because of elfstab_offset_sections() which initializes the psymtab section @@ -1701,7 +1702,6 @@ read_ofile_symtab (struct partial_symtab stringtab_global = DBX_STRINGTAB (objfile); last_source_file = NULL; - abfd = objfile->obfd; symfile_bfd = objfile->obfd; /* Implicit param to next_text_symbol */ symbuf_end = symbuf_idx = 0;