[RFC] Improve stabs debugging for mingw64 executables loaded at high addresses

Pierre Muller
2010-09-14T15:04:22Z

On 64-bit targets, stabs suffers from the fact that addresses
are only stored as 32-bit values.

For mingw64, I was able to debug executables loaded
at address 0x100000000 (the default location for executables
compiled by Free Pascal Compiler) by using the simple
patch below.

The idea of the patch is quite basic:
add the 32 high bits of text_addr as
to the offsets of all sections in read_dbx_symtab.

I don't know if this is mingw64 (possibly 64-bit PE) specific or not...

All those offsets seemed to be at zero at the time I added
the high 32-bit part of text_addr, but maybe other
targets do something else... If this should not be applied
for other 64-bit targets, we could of course modify
the tests before changing the offsets, restricting it to
targets for which it is relevant.

I just tried to use gcc to compile an executable
with -Wl,--image-base,0x300000000, to force high load address,
but this lead to lots of messages:
relocation truncated to fit R_X86_64_32 against .text
Free Pascal compiler doesn't seem to generate any of those
time of relocations...

Comments welcome,

Pierre Muller
Pascal language support maintainer for GDB

2010-09-14 Pierre Muller <muller@ics.u-strasbg.fr>

* dbxread.c (read_dbx_symtab): Add high part of text_addr value
to all section offsets.

Index: src/gdb/dbxread.c
===================================================================
RCS file: /cvs/src/src/gdb/dbxread.c,v
retrieving revision 1.116
diff -u -p -r1.116 dbxread.c
--- src/gdb/dbxread.c 14 May 2010 17:53:15 -0000 1.116
+++ src/gdb/dbxread.c 1 Sep 2010 08:01:01 -0000
@@ -1216,6 +1216,22 @@ read_dbx_symtab (struct objfile *objfile
text_addr = DBX_TEXT_ADDR (objfile);
text_size = DBX_TEXT_SIZE (objfile);

+#ifdef BFD64
+ {
+ /* stabs internal format only has 4 bytes for address.
+ Use high dword of text address to fix global addresses.
+ FIXME: this only works if the whole executable has the same
+ high part address. */
+ CORE_ADDR stabs_fixup = text_addr & ~((CORE_ADDR) 0xffffffff);
+ if (stabs_fixup)
+ {
+ objfile->section_offsets->offsets[SECT_OFF_TEXT (objfile)] += stabs_fixup;
+ objfile->section_offsets->offsets[SECT_OFF_DATA (objfile)] += stabs_fixup;
+ objfile->section_offsets->offsets[SECT_OFF_BSS (objfile)] += stabs_fixup;
+ }
+ }
+#endif /* BFD64 */
+
/* FIXME. We probably want to change stringtab_global rather than add this
while processing every symbol entry. FIXME. */
file_string_table_offset = 0;