diff options
author | Jameson Nash <vtjnash@gmail.com> | 2020-12-18 14:08:53 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2020-12-18 14:09:05 -0500 |
commit | a9e48095a8e595f04042f9455a50ce6acbd5232c (patch) | |
tree | e565f51351b5e51b3b3a234c1066146965768777 /gdb/coffread.c | |
parent | 86ef42bd7333091725991ba568807fcec0a2c1d1 (diff) | |
download | gdb-a9e48095a8e595f04042f9455a50ce6acbd5232c.zip gdb-a9e48095a8e595f04042f9455a50ce6acbd5232c.tar.gz gdb-a9e48095a8e595f04042f9455a50ce6acbd5232c.tar.bz2 |
gdb: define COFF file offsets with file_ptr
The arguments to these functions are file_ptr, so these declarations
were accidentally implicitly down-casting them to signed int. This
allows for reading files between 2 and 4 GB in size in my testing (I
don't have a larger dll currently to test). These may not be natively
supported by Windows, but can appear when using split-dwarf information.
This solves a "can't get string table" error resulting from attempting
to pass a negative offset to bfd_seek. I encountered this occuring while
trying to use a debug file for libLLVM.dll, but searching online reveals
at least one other person may have run into a similar problem with
Firefox?
https://sourceforge.net/p/mingw-w64/mailman/mingw-w64-public/thread/CA+cU71k2bU0azQxjy4-77ynQj1O+TKmgtaTKe59n7Bjub1y7Tg@mail.gmail.com/
With this patch, the debug file appears to load successfully and I can
see debug information in gdb for the library.
gdb/ChangeLog:
* coffread.c (linetab_offset): Change type to file_ptr.
(linetab_size): Likewise.
(enter_linenos): Change parameter type to file_ptr.
(init_lineno): Likewise.
(init_stringtab): Likewise.
(coff_symtab_read): Likewise.
(coff_symfile_read): Change variable types to file_ptr.
Change-Id: I6ae3bf31efc51c826734ade6731ea6b1c32129f3
Diffstat (limited to 'gdb/coffread.c')
-rw-r--r-- | gdb/coffread.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/gdb/coffread.c b/gdb/coffread.c index c61c9a7..78cd247 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -155,8 +155,8 @@ static int type_vector_length; #define INITIAL_TYPE_VECTOR_LENGTH 160 static char *linetab = NULL; -static long linetab_offset; -static unsigned long linetab_size; +static file_ptr linetab_offset; +static file_ptr linetab_size; static char *stringtab = NULL; @@ -188,23 +188,23 @@ static struct symbol *process_coff_symbol (struct coff_symbol *, static void patch_opaque_types (struct symtab *); -static void enter_linenos (long, int, int, struct objfile *); +static void enter_linenos (file_ptr, int, int, struct objfile *); -static int init_lineno (bfd *, long, int, gdb::unique_xmalloc_ptr<char> *); +static int init_lineno (bfd *, file_ptr, file_ptr, gdb::unique_xmalloc_ptr<char> *); static char *getsymname (struct internal_syment *); static const char *coff_getfilename (union internal_auxent *); -static int init_stringtab (bfd *, long, gdb::unique_xmalloc_ptr<char> *); +static int init_stringtab (bfd *, file_ptr, gdb::unique_xmalloc_ptr<char> *); static void read_one_sym (struct coff_symbol *, struct internal_syment *, union internal_auxent *); static void coff_symtab_read (minimal_symbol_reader &, - long, unsigned int, struct objfile *); - + file_ptr, unsigned int, struct objfile *); + /* We are called once per section from coff_symfile_read. We need to examine each section we are passed, check to see if it is something we are interested in processing, and @@ -540,9 +540,9 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) const char *filename = bfd_get_filename (abfd); int val; unsigned int num_symbols; - int symtab_offset; - int stringtab_offset; - int stabstrsize; + file_ptr symtab_offset; + file_ptr stringtab_offset; + unsigned int stabstrsize; info = coff_objfile_data_key.get (objfile); symfile_bfd = abfd; /* Kludge for swap routines. */ @@ -750,7 +750,7 @@ coff_symfile_finish (struct objfile *objfile) static void coff_symtab_read (minimal_symbol_reader &reader, - long symtab_offset, unsigned int nsyms, + file_ptr symtab_offset, unsigned int nsyms, struct objfile *objfile) { struct gdbarch *gdbarch = objfile->arch (); @@ -796,7 +796,7 @@ coff_symtab_read (minimal_symbol_reader &reader, bfd_seek (objfile->obfd, 0, 0); /* Position to read the symbol table. */ - val = bfd_seek (objfile->obfd, (long) symtab_offset, 0); + val = bfd_seek (objfile->obfd, symtab_offset, 0); if (val < 0) perror_with_name (objfile_name (objfile)); @@ -1270,7 +1270,7 @@ read_one_sym (struct coff_symbol *cs, /* Support for string table handling. */ static int -init_stringtab (bfd *abfd, long offset, gdb::unique_xmalloc_ptr<char> *storage) +init_stringtab (bfd *abfd, file_ptr offset, gdb::unique_xmalloc_ptr<char> *storage) { long length; int val; @@ -1366,7 +1366,7 @@ coff_getfilename (union internal_auxent *aux_entry) them into GDB's data structures. */ static int -init_lineno (bfd *abfd, long offset, int size, +init_lineno (bfd *abfd, file_ptr offset, file_ptr size, gdb::unique_xmalloc_ptr<char> *storage) { int val; @@ -1399,7 +1399,7 @@ init_lineno (bfd *abfd, long offset, int size, #endif static void -enter_linenos (long file_offset, int first_line, +enter_linenos (file_ptr file_offset, int first_line, int last_line, struct objfile *objfile) { struct gdbarch *gdbarch = objfile->arch (); |