gdb: use std::string instead of a fixed size buffer
The 'section' command uses a fixed size buffer into which a section name is copied. This commit replaces this with a use of std::string so we can now display very long section names. The expected results of one test need to be updated. gdb/ChangeLog: * exec.c (set_section_command): Move variable declarations into the function body, and use std::string instead of a fixed size buffer. gdb/testsuite/ChangeLog: * gdb.base/sect-cmd.exp: Update expected results.
This commit is contained in:
parent
336aa7b740
commit
dd80d75040
@ -1,3 +1,9 @@
|
||||
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* exec.c (set_section_command): Move variable declarations into
|
||||
the function body, and use std::string instead of a fixed size
|
||||
buffer.
|
||||
|
||||
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* exec.c (exec_target::get_section_table): Delete member function.
|
||||
|
18
gdb/exec.c
18
gdb/exec.c
@ -989,27 +989,23 @@ static void
|
||||
set_section_command (const char *args, int from_tty)
|
||||
{
|
||||
const char *secname;
|
||||
unsigned seclen;
|
||||
unsigned long secaddr;
|
||||
char secprint[100];
|
||||
long offset;
|
||||
|
||||
if (args == 0)
|
||||
error (_("Must specify section name and its virtual address"));
|
||||
|
||||
/* Parse out section name. */
|
||||
for (secname = args; !isspace (*args); args++);
|
||||
seclen = args - secname;
|
||||
unsigned seclen = args - secname;
|
||||
|
||||
/* Parse out new virtual address. */
|
||||
secaddr = parse_and_eval_address (args);
|
||||
CORE_ADDR secaddr = parse_and_eval_address (args);
|
||||
|
||||
for (target_section &p : current_program_space->target_sections ())
|
||||
{
|
||||
if (!strncmp (secname, bfd_section_name (p.the_bfd_section), seclen)
|
||||
&& bfd_section_name (p.the_bfd_section)[seclen] == '\0')
|
||||
{
|
||||
offset = secaddr - p.addr;
|
||||
long offset = secaddr - p.addr;
|
||||
p.addr += offset;
|
||||
p.endaddr += offset;
|
||||
if (from_tty)
|
||||
@ -1017,11 +1013,9 @@ set_section_command (const char *args, int from_tty)
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (seclen >= sizeof (secprint))
|
||||
seclen = sizeof (secprint) - 1;
|
||||
strncpy (secprint, secname, seclen);
|
||||
secprint[seclen] = '\0';
|
||||
error (_("Section %s not found"), secprint);
|
||||
|
||||
std::string secprint (secname, seclen);
|
||||
error (_("Section %s not found"), secprint.c_str ());
|
||||
}
|
||||
|
||||
/* If we can find a section in FILENAME with BFD index INDEX, adjust
|
||||
|
@ -1,3 +1,7 @@
|
||||
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* gdb.base/sect-cmd.exp: Update expected results.
|
||||
|
||||
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* gdb.base/sect-cmd.exp: Rewrite using modern testsuite
|
||||
|
@ -79,14 +79,16 @@ gdb_test_multiple "section FOOBARBAZ 0x1234" "" {
|
||||
}
|
||||
}
|
||||
|
||||
# We "happen to know" that GDB uses a fixed size character buffer to
|
||||
# parse the section name into, and the buffer is declared to be 100
|
||||
# characters in length. Verify that GDB gracefully handles section
|
||||
# names longer than that. (The section is also non-existent.)
|
||||
# Check that GDB can still print the error message when the section
|
||||
# name is very long. It used to be the case that GDB could only print
|
||||
# (up to) 100 character section names in this error message, but that
|
||||
# is no longer the case.
|
||||
#
|
||||
gdb_test_multiple "section A234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 0x1234" \
|
||||
set long_sect_name \
|
||||
"A234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123"
|
||||
gdb_test_multiple "section $long_sect_name 0x1234" \
|
||||
"non-existent too-long section disallowed" {
|
||||
-re -wrap "Section A23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 not found" {
|
||||
-re -wrap "Section $long_sect_name not found" {
|
||||
pass $gdb_test_name
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user