From: Petr Tesarik <ptesarik@suse.cz>
To: gdb-patches@sourceware.org
Cc: Simon Marchi <simon.marchi@polymtl.ca>,
John Baldwin <jhb@freebsd.org>, Petr Tesarik <petr@tesarici.cz>,
Jeff Mahoney <jeffm@suse.com>
Subject: [PATCH 1/4] Add an optional offset option to the "symbol-file" command
Date: Fri, 08 Jun 2018 12:40:00 -0000 [thread overview]
Message-ID: <20180608124000.10668-2-ptesarik@suse.cz> (raw)
In-Reply-To: <20180608124000.10668-1-ptesarik@suse.cz>
From: Petr Tesarik <petr@tesarici.cz>
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-08 Petr Tesarik <ptesarik@suse.com>
* 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-08 Petr Tesarik <ptesarik@suse.com>
* gdb.texinfo (Files): Document "symbol-file -o offset".
gdb/testsuite/ChangeLog:
2018-06-08 Petr Tesarik <ptesarik@suse.com>
* gdb.base/relocate.exp: Add test for "symbol-file -o ".
---
gdb/ChangeLog | 6 ++++++
gdb/doc/ChangeLog | 4 ++++
gdb/doc/gdb.texinfo | 7 ++++++-
gdb/symfile.c | 24 ++++++++++++++++++------
gdb/testsuite/ChangeLog | 4 ++++
gdb/testsuite/gdb.base/relocate.exp | 24 ++++++++++++++++++++++++
6 files changed, 62 insertions(+), 7 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f0b6b95f7e..27c6ed0a7c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2018-06-08 Petr Tesarik <ptesarik@suse.com>
+
+ * 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-07 Pedro Alves <palves@redhat.com>
* target.h (target_ops) <beneath>: Now a method. All references
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 6191e84cc0..319d06a25f 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,7 @@
+2018-06-08 Petr Tesarik <ptesarik@suse.com>
+
+ * gdb.texinfo (Files): Document "symbol-file -o offset".
+
2018-06-05 Tom Tromey <tom@tromey.com>
PR cli/12326:
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 4968b374af..9d1c29612b 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -18822,11 +18822,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{[} -o @var{offset} @r{]} @r{[} @var{filename} @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.
diff --git a/gdb/symfile.c b/gdb/symfile.c
index f8177ea8b1..09344f83d2 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -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);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index eea782f05e..a9e0ec09ff 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-06-08 Petr Tesarik <ptesarik@suse.com>
+
+ * gdb.base/relocate.exp: Add test for "symbol-file -o ".
+
2018-06-05 Tom Tromey <tom@tromey.com>
* gdb.base/default.exp: Update expected "show version" output.
diff --git a/gdb/testsuite/gdb.base/relocate.exp b/gdb/testsuite/gdb.base/relocate.exp
index 89f2fffcd9..77f6a88159 100644
--- a/gdb/testsuite/gdb.base/relocate.exp
+++ b/gdb/testsuite/gdb.base/relocate.exp
@@ -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.
--
2.13.6
next prev parent reply other threads:[~2018-06-08 12:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-08 12:40 [PATCH 0/4] Allow loading symbol files with an offset Petr Tesarik
2018-06-08 12:40 ` [PATCH 4/4] Add an optional offset option to the "add-symbol-file" command Petr Tesarik
2018-06-08 12:40 ` [PATCH 3/4] Make sure that sorting does not change section order Petr Tesarik
2018-06-08 12:40 ` Petr Tesarik [this message]
2018-06-08 12:59 ` [PATCH 1/4] Add an optional offset option to the "symbol-file" command Tom Tromey
2018-06-08 13:09 ` Eli Zaretskii
2018-06-08 12:53 ` [PATCH 2/4] Make add-symbol-file's address argument optional Petr Tesarik
2018-06-08 13:11 ` Eli Zaretskii
2018-06-08 13:34 ` [PATCH 0/4] Allow loading symbol files with an offset Pedro Alves
2018-06-11 9:41 ` Petr Tesarik
2018-06-11 18:41 ` Petr Tesarik
2018-06-11 19:10 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180608124000.10668-2-ptesarik@suse.cz \
--to=ptesarik@suse.cz \
--cc=gdb-patches@sourceware.org \
--cc=jeffm@suse.com \
--cc=jhb@freebsd.org \
--cc=petr@tesarici.cz \
--cc=simon.marchi@polymtl.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).