Add an optional offset option to the "symbol-file" command

If the main file is relocated at runtime, all symbols are offset by
a fixed amount.  Let the user specify this offset when loading a
symbol file.

gdb/ChangeLog:
2018-06-28  Petr Tesarik  <ptesarik@suse.cz>

	* symfile.c (symbol_file_command, symbol_file_add_main_1)
	(_initialize_symfile): Add option "-o" to symbol-file to add an
	offset to each section of the symbol file.

gdb/doc/ChangeLog:
2018-06-28  Petr Tesarik  <ptesarik@suse.cz>

	* gdb.texinfo (Files): Document "symbol-file -o offset".

gdb/testsuite/ChangeLog:
2018-06-28  Petr Tesarik  <ptesarik@suse.cz>

	* gdb.base/relocate.exp: Add test for "symbol-file -o ".
This commit is contained in:
Petr Tesarik 2018-06-28 08:01:33 +02:00
parent 39b27ab6ae
commit d4d429d589
7 changed files with 65 additions and 7 deletions

View File

@ -1,3 +1,9 @@
2018-06-28 Petr Tesarik <ptesarik@suse.cz>
* symfile.c (symbol_file_command, symbol_file_add_main_1)
(_initialize_symfile): Add option "-o" to symbol-file to add an
offset to each section of the symbol file.
2018-06-28 Petr Tesarik <ptesarik@suse.cz>
* MAINTAINERS (Write After Approval): Add Petr Tesarik.

View File

@ -3,6 +3,9 @@
*** Changes since GDB 8.1
* The 'symbol-file' command now accepts an '-o' option to add a relative
offset to all sections.
* The endianness used with the 'set endian auto' mode in the absence of
an executable selected for debugging is now the last endianness chosen
either by one of the 'set endian big' and 'set endian little' commands

View File

@ -1,3 +1,7 @@
2018-06-28 Petr Tesarik <ptesarik@suse.cz>
* gdb.texinfo (Files): Document "symbol-file -o offset".
2018-06-14 Tom de Vries <tdevries@suse.de>
* gdb.texinfo (Background Execution): Add @cindex for '&'.

View File

@ -18823,11 +18823,16 @@ if necessary to locate your program. Omitting @var{filename} means to
discard information on the executable file.
@kindex symbol-file
@item symbol-file @r{[} @var{filename} @r{]}
@item symbol-file @r{[} @var{filename} @r{[} -o @var{offset} @r{]]}
Read symbol table information from file @var{filename}. @code{PATH} is
searched when necessary. Use the @code{file} command to get both symbol
table and program to run from the same file.
If an optional @var{offset} is specified, it is added to the start
address of each section in the symbol file. This is useful if the
program is relocated at runtime, such as the Linux kernel with kASLR
enabled.
@code{symbol-file} with no argument clears out @value{GDBN} information on your
program's symbol table.

View File

@ -87,7 +87,7 @@ int readnever_symbol_files; /* Never read full symbols. */
/* Functions this file defines. */
static void symbol_file_add_main_1 (const char *args, symfile_add_flags add_flags,
objfile_flags flags);
objfile_flags flags, CORE_ADDR reloff);
static const struct sym_fns *find_sym_fns (bfd *);
@ -1225,16 +1225,18 @@ symbol_file_add (const char *name, symfile_add_flags add_flags,
void
symbol_file_add_main (const char *args, symfile_add_flags add_flags)
{
symbol_file_add_main_1 (args, add_flags, 0);
symbol_file_add_main_1 (args, add_flags, 0, 0);
}
static void
symbol_file_add_main_1 (const char *args, symfile_add_flags add_flags,
objfile_flags flags)
objfile_flags flags, CORE_ADDR reloff)
{
add_flags |= current_inferior ()->symfile_flags | SYMFILE_MAINLINE;
symbol_file_add (args, add_flags, NULL, flags);
struct objfile *objfile = symbol_file_add (args, add_flags, NULL, flags);
if (reloff != 0)
objfile_rebase (objfile, reloff);
/* Getting new symbols may change our opinion about
what is frameless. */
@ -1551,6 +1553,7 @@ symbol_file_command (const char *args, int from_tty)
symfile_add_flags add_flags = 0;
char *name = NULL;
bool stop_processing_options = false;
CORE_ADDR offset = 0;
int idx;
char *arg;
@ -1571,6 +1574,14 @@ symbol_file_command (const char *args, int from_tty)
flags |= OBJF_READNOW;
else if (strcmp (arg, "-readnever") == 0)
flags |= OBJF_READNEVER;
else if (strcmp (arg, "-o") == 0)
{
arg = built_argv[++idx];
if (arg == NULL)
error (_("Missing argument to -o"));
offset = parse_and_eval_address (arg);
}
else if (strcmp (arg, "--") == 0)
stop_processing_options = true;
else
@ -1582,7 +1593,7 @@ symbol_file_command (const char *args, int from_tty)
validate_readnow_readnever (flags);
symbol_file_add_main_1 (name, add_flags, flags);
symbol_file_add_main_1 (name, add_flags, flags, offset);
}
}
@ -3774,7 +3785,8 @@ symbolic debug information."
c = add_cmd ("symbol-file", class_files, symbol_file_command, _("\
Load symbol table from executable file FILE.\n\
Usage: symbol-file [-readnow | -readnever] FILE\n\
Usage: symbol-file [-readnow | -readnever] [-o OFF] FILE\n\
OFF is an optional offset which is added to each section address.\n\
The `file' command can also load symbol tables, as well as setting the file\n\
to execute.\n" READNOW_READNEVER_HELP), &cmdlist);
set_cmd_completer (c, filename_completer);

View File

@ -1,3 +1,7 @@
2018-06-28 Petr Tesarik <ptesarik@suse.cz>
* gdb.base/relocate.exp: Add test for "symbol-file -o ".
2018-06-27 Omair Javaid <omair.javaid@linaro.org>
PR gdb/21695

View File

@ -196,6 +196,30 @@ if { "${function_foo_addr}" == "${new_function_foo_addr}" } {
pass "function foo has a different address"
}
# Load the object using symbol-file with an offset and check that
# all addresses are moved by that offset.
set offset 0x10000
clean_restart
gdb_test "symbol-file -o $offset $binfile" \
"Reading symbols from ${binfile}\.\.\.done\." \
"symbol-file with offset"
# Make sure the address of a static variable is moved by offset.
set new_static_foo_addr [get_var_address static_foo]
gdb_assert {${new_static_foo_addr} == ${static_foo_addr} + $offset} \
"static variable foo is moved by offset"
# Make sure the address of a global variable is moved by offset.
set new_global_foo_addr [get_var_address global_foo]
gdb_assert {${new_global_foo_addr} == ${global_foo_addr} + $offset} \
"global variable foo is moved by offset"
# Make sure the address of a function is moved by offset.
set new_function_foo_addr [get_var_address function_foo]
gdb_assert {${new_function_foo_addr} == ${function_foo_addr} + $offset} \
"function foo is moved by offset"
# Now try loading the object as an exec-file; we should be able to print
# the values of variables after we do this.