[PATCH] gdb: change type of `general_symbol_info::m_section` to int
Tom de Vries
tdevries@suse.de
Thu Sep 12 13:28:34 GMT 2024
On 9/12/24 14:27, Simon Marchi wrote:
> The binary provided with bug 32165 [1] has 36139 ELF sections. GDB
> crashes on it with (note that my GDB is build with -D_GLIBCXX_DEBUG=1:
>
> $ ./gdb -nx -q --data-directory=data-directory ./vmlinux
> Reading symbols from ./vmlinux...
> (No debugging symbols found in ./vmlinux)
> (gdb) info func
> /usr/include/c++/14.2.1/debug/vector:508:
> In function:
> std::debug::vector<_Tp, _Allocator>::reference std::debug::vector<_Tp,
> _Allocator>::operator[](size_type) [with _Tp = long unsigned int;
> _Allocator = std::allocator<long unsigned int>; reference = long
> unsigned int&; size_type = long unsigned int]
>
> Error: attempt to subscript container with out-of-bounds index -29445, but
> container only holds 36110 elements.
>
> Objects involved in the operation:
> sequence "this" @ 0x514000007340 {
> type = std::debug::vector<unsigned long, std::allocator<unsigned long> >;
> }
>
> The crash occurs here:
>
> #3 0x00007ffff5e334c3 in __GI_abort () at abort.c:79
> #4 0x00007ffff689afc4 in __gnu_debug::_Error_formatter::_M_error (this=<optimized out>) at /usr/src/debug/gcc/gcc/libstdc++-v3/src/c++11/debug.cc:1320
> #5 0x0000555561119a16 in std::__debug::vector<unsigned long, std::allocator<unsigned long> >::operator[] (this=0x514000007340, __n=18446744073709522171)
> at /usr/include/c++/14.2.1/debug/vector:508
> #6 0x0000555562e288e8 in minimal_symbol::value_address (this=0x5190000bb698, objfile=0x514000007240) at /home/smarchi/src/binutils-gdb/gdb/symtab.c:517
> #7 0x0000555562e5a131 in global_symbol_searcher::expand_symtabs (this=0x7ffff0f5c340, objfile=0x514000007240, preg=std::optional [no contained value])
> at /home/smarchi/src/binutils-gdb/gdb/symtab.c:4983
> #8 0x0000555562e5d2ed in global_symbol_searcher::search (this=0x7ffff0f5c340) at /home/smarchi/src/binutils-gdb/gdb/symtab.c:5189
> #9 0x0000555562e5ffa4 in symtab_symbol_info (quiet=false, exclude_minsyms=false, regexp=0x0, kind=FUNCTION_DOMAIN, t_regexp=0x0, from_tty=1)
> at /home/smarchi/src/binutils-gdb/gdb/symtab.c:5361
> #10 0x0000555562e6131b in info_functions_command (args=0x0, from_tty=1) at /home/smarchi/src/binutils-gdb/gdb/symtab.c:5525
>
> That is, at this line of `minimal_symbol::value_address`, where
> `objfile->section_offsets` is an `std::vector`:
>
> return (CORE_ADDR (this->unrelocated_address ())
> + objfile->section_offsets[this->section_index ()]);
>
> A section index of -29445 is suspicious. The minimal_symbol at play
> here is:
>
> (top-gdb) p m_name
> $1 = 0x521001de10af "_sinittext"
>
> So I restarted debugging, breaking on:
>
> (top-gdb) b general_symbol_info::set_section_index if $_streq("_sinittext", m_name)
>
> And I see that weird -29445 value:
>
> (top-gdb) frame
> #0 general_symbol_info::set_section_index (this=0x525000082390, idx=-29445) at /home/smarchi/src/binutils-gdb/gdb/symtab.h:611
> 611 { m_section = idx; }
>
> But going up one frame, the section index is 36091:
>
> (top-gdb) frame
> #1 0x0000555562426526 in minimal_symbol_reader::record_full (this=0x7ffff0ead560, name="_sinittext", copy_name=false,
> address=-2111475712, ms_type=mst_text, section=36091) at /home/smarchi/src/binutils-gdb/gdb/minsyms.c:1228
> 1228 msymbol->set_section_index (section);
>
> It seems like the problem is just that the type used for the section
> index (short) is not big enough. Change from short to int. If somebody
> insists, we could even go long long / int64_t, but I doubt it's
> necessary.
>
> With that fixed, I get:
>
> (gdb) info func
> All defined functions:
>
> Non-debugging symbols:
> 0xffffffff81000000 _stext
> 0xffffffff82257000 _sinittext
> 0xffffffff822b4ebb _einittext
>
Hi Simon,
LGTM.
I wonder if using auto instead of int in set_section_index and
section_index would be cleaner.
Reviewed-By: Tom de Vries <tdevries@suse.de>
Thanks,
- Tom
> [1] https://sourceware.org/bugzilla/show_bug.cgi?id=32165
>
> Change-Id: Icb1c3de9474ff5adef7e0bbbf5e0b67b279dee04
> ---
> gdb/symtab.h | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/gdb/symtab.h b/gdb/symtab.h
> index d615fdf1e52b..a273f32ddd0d 100644
> --- a/gdb/symtab.h
> +++ b/gdb/symtab.h
> @@ -601,20 +601,20 @@ struct general_symbol_info
> section_offsets for this objfile. Negative means that the symbol
> does not get relocated relative to a section. */
>
> - short m_section;
> + int m_section;
>
> /* Set the index into the obj_section list (within the containing
> objfile) for the section that contains this symbol. See M_SECTION
> for more details. */
>
> - void set_section_index (short idx)
> + void set_section_index (int idx)
> { m_section = idx; }
>
> /* Return the index into the obj_section list (within the containing
> objfile) for the section that contains this symbol. See M_SECTION
> for more details. */
>
> - short section_index () const
> + int section_index () const
> { return m_section; }
>
> /* Return the obj_section from OBJFILE for this symbol. The symbol
>
> base-commit: 4290b2c07e2d9bc1e1661a4ad5e343e3eb307770
More information about the Gdb-patches
mailing list