* solib.c (solib_find): Replace extension if

solib_symbols_extension is set in the target gdbarch.
	* arm-symbian-tdep.c (arm_symbian_init_abi): Set
	solib_symbols_extension to "sym".
	* gdbarch.sh (solib_symbols_extension): New variable.
	(pstring): New function.
	* gdbarch.h, gdbarch.c: Regenerate.
This commit is contained in:
Pedro Alves 2010-03-08 19:28:27 +00:00
parent 7c95393435
commit 081058572d
6 changed files with 99 additions and 0 deletions

View File

@ -1,3 +1,14 @@
2010-03-08 Daniel Jacobowitz <dan@codesourcery.com>
Pedro Alves <pedro@codesourcery.com>
* solib.c (solib_find): Replace extension if
solib_symbols_extension is set in the target gdbarch.
* arm-symbian-tdep.c (arm_symbian_init_abi): Set
solib_symbols_extension to "sym".
* gdbarch.sh (solib_symbols_extension): New variable.
(pstring): New function.
* gdbarch.h, gdbarch.c: Regenerate.
2010-03-08 Tom Tromey <tromey@redhat.com>
PR cli/9591:

View File

@ -69,6 +69,15 @@ arm_symbian_init_abi (struct gdbarch_info info,
/* Shared library handling. */
set_gdbarch_skip_trampoline_code (gdbarch, arm_symbian_skip_trampoline_code);
/* On this target, the toolchain outputs ELF files, with `sym' for
filename extension (e.g., `FOO.sym'); these are post-linker
processed into PE-ish DLLs (e.g., `FOO.dll'), and it's these that
are actually copied to and run on the target. Naturally, when
listing shared libraries, Symbian stubs report the DLL filenames.
Setting this makes it so that GDB automatically looks for the
corresponding ELF files on the host's filesystem. */
set_gdbarch_solib_symbols_extension (gdbarch, "sym");
set_solib_ops (gdbarch, &solib_target_so_ops);
}

View File

@ -77,6 +77,14 @@ pformat (const struct floatformat **format)
return format[0]->name;
}
static const char *
pstring (const char *string)
{
if (string == NULL)
return "(null)";
return string;
}
/* Maintain the struct gdbarch object */
@ -255,6 +263,7 @@ struct gdbarch
const char * qsupported;
gdbarch_auto_charset_ftype *auto_charset;
gdbarch_auto_wide_charset_ftype *auto_wide_charset;
const char * solib_symbols_extension;
};
@ -401,6 +410,7 @@ struct gdbarch startup_gdbarch =
0, /* qsupported */
default_auto_charset, /* auto_charset */
default_auto_wide_charset, /* auto_wide_charset */
0, /* solib_symbols_extension */
/* startup_gdbarch() */
};
@ -1147,6 +1157,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
fprintf_unfiltered (file,
"gdbarch_dump: sofun_address_maybe_missing = %s\n",
plongest (gdbarch->sofun_address_maybe_missing));
fprintf_unfiltered (file,
"gdbarch_dump: solib_symbols_extension = %s\n",
pstring (gdbarch->solib_symbols_extension));
fprintf_unfiltered (file,
"gdbarch_dump: sp_regnum = %s\n",
plongest (gdbarch->sp_regnum));
@ -3647,6 +3660,22 @@ set_gdbarch_auto_wide_charset (struct gdbarch *gdbarch,
gdbarch->auto_wide_charset = auto_wide_charset;
}
const char *
gdbarch_solib_symbols_extension (struct gdbarch *gdbarch)
{
gdb_assert (gdbarch != NULL);
if (gdbarch_debug >= 2)
fprintf_unfiltered (gdb_stdlog, "gdbarch_solib_symbols_extension called\n");
return gdbarch->solib_symbols_extension;
}
void
set_gdbarch_solib_symbols_extension (struct gdbarch *gdbarch,
const char * solib_symbols_extension)
{
gdbarch->solib_symbols_extension = solib_symbols_extension;
}
/* Keep a registry of per-architecture data-pointers required by GDB
modules. */

View File

@ -940,6 +940,16 @@ typedef const char * (gdbarch_auto_wide_charset_ftype) (void);
extern const char * gdbarch_auto_wide_charset (struct gdbarch *gdbarch);
extern void set_gdbarch_auto_wide_charset (struct gdbarch *gdbarch, gdbarch_auto_wide_charset_ftype *auto_wide_charset);
/* If non-empty, this is a file extension that will be opened in place
of the file extension reported by the shared library list.
This is most useful for toolchains that use a post-linker tool,
where the names of the files run on the target differ in extension
compared to the names of the files GDB should load for debug info. */
extern const char * gdbarch_solib_symbols_extension (struct gdbarch *gdbarch);
extern void set_gdbarch_solib_symbols_extension (struct gdbarch *gdbarch, const char * solib_symbols_extension);
/* Definition for an unknown syscall, used basically in error-cases. */
#define UNKNOWN_SYSCALL (-1)

View File

@ -774,6 +774,14 @@ v:const char *:qsupported:::0:0::0:gdbarch->qsupported
f:const char *:auto_charset:void::default_auto_charset:default_auto_charset::0
# Return the "auto" target wide charset.
f:const char *:auto_wide_charset:void::default_auto_wide_charset:default_auto_wide_charset::0
# If non-empty, this is a file extension that will be opened in place
# of the file extension reported by the shared library list.
#
# This is most useful for toolchains that use a post-linker tool,
# where the names of the files run on the target differ in extension
# compared to the names of the files GDB should load for debug info.
v:const char *:solib_symbols_extension:::::::pstring (gdbarch->solib_symbols_extension)
EOF
}
@ -1245,6 +1253,14 @@ pformat (const struct floatformat **format)
return format[0]->name;
}
static const char *
pstring (const char *string)
{
if (string == NULL)
return "(null)";
return string;
}
EOF
# gdbarch open the gdbarch object

View File

@ -150,6 +150,30 @@ solib_find (char *in_pathname, int *fd)
int found_file = -1;
char *temp_pathname = NULL;
int gdb_sysroot_is_empty;
const char *solib_symbols_extension
= gdbarch_solib_symbols_extension (target_gdbarch);
/* If solib_symbols_extension is set, replace the file's
extension. */
if (solib_symbols_extension)
{
char *p = in_pathname + strlen (in_pathname);
while (p > in_pathname && *p != '.')
p--;
if (*p == '.')
{
char *new_pathname;
new_pathname = alloca (p - in_pathname + 1
+ strlen (solib_symbols_extension) + 1);
memcpy (new_pathname, in_pathname, p - in_pathname + 1);
strcpy (new_pathname + (p - in_pathname) + 1,
solib_symbols_extension);
in_pathname = new_pathname;
}
}
gdb_sysroot_is_empty = (gdb_sysroot == NULL || *gdb_sysroot == 0);