2008-05-06: Lubomir Rintel * .gdbinit: New file. * grub.gdb: New file. * gmodule.pl: New file. --- /dev/null 2008-05-02 09:18:25.380014078 +0200 +++ .gdbinit 2008-05-06 12:51:12.000000000 +0200 @@ -0,0 +1,2 @@ +# Put your GDB initialization commands here +source grub.gdb --- /dev/null 2008-05-02 09:18:25.380014078 +0200 +++ grub.gdb 2008-05-06 12:51:33.000000000 +0200 @@ -0,0 +1,109 @@ +# grub.gdb - Macros to ease debugging of GRUB and its modules with GDB + +# GRUB -- GRand Unified Bootloader +# Copyright (C) 2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc. +# +# GRUB is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GRUB is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GRUB. If not, see . + +# +# Load debuging information about GNU GRUB 2 modules into GDB +# automatically. Needs readelf, Perl and gmodule.pl script +# +# Note: break_load command won't work with GDB up to 6.6 due to +# bug in processing breakpoint command hooks. GDB 6.8 works fine. +# + +define _cleanup + shell rm -f .segments.tmp .loadsym.gdb +end + +# Add section numbers and addresses to .segments.tmp +define _dump_module_sections + set $mod = $arg0 + + # FIXME: save logging status + set logging file .segments.tmp + set logging redirect on + set logging overwrite off + set logging on + + printf "%s.elf", $mod->name + set $segment = $mod->segment + while ($segment) + printf " %i 0x%x", $segment->section, $segment->addr + set $segment = $segment->next + end + printf "\n" + + set logging off + # FIXME: restore logging status +end +document _dump_module_sections + Gather information about module whose mod structure was + given for use with match_and_load_symbols +end + +# Generate and execute GDB commands and delete temporary files +# afterwards +define _match_and_load_symbols + shell perl gmodule.pl <.segments.tmp >.loadsym.gdb + source .loadsym.gdb + _cleanup +end +document _match_and_load_symbols + Launch script, that matches section names with information + generated by dump_module_sections and load debugging info + apropriately +end + +define load_module + _cleanup + _dump_module_sections $arg0 + _match_and_load_symbols +end +document load_module + Load debugging information for module given as argument. +end + +define load_modules + _cleanup + set $this = grub_dl_head + while ($this != 0) + _dump_module_sections $this->mod + set $this = $this->next + end + _match_and_load_symbols +end +document load_modules + Load debugging information for all loaded modules. +end + +define load_kernel + file kernel.exec +end +document load_kernel + Load debugging information for kernel. +end + +define break_load + # Load debugging symbols for module when it's loaded + break grub_dl_ref + commands + load_module mod + cont + end +end +document break_load + Make modules load automatically. +end --- /dev/null 2008-05-02 09:18:25.380014078 +0200 +++ gmodule.pl 2008-05-06 12:52:02.000000000 +0200 @@ -0,0 +1,52 @@ +# gmodule.pl - Generate GDB commands to load symbols to right addresses + +# GRUB -- GRand Unified Bootloader +# Copyright (C) 2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc. +# +# GRUB is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GRUB is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GRUB. If not, see . + +use strict; +use warnings; + +while (<>) { + # Line we get contains section number - load address pairs + # prepended by module name + my ($file, %load_addr) = split; + + my $text = ''; # This one needs not be prepended by -s + my $sections = ''; # All but .text + + print "add-symbol-file $file"; + + open (READELF, "readelf -S $file |") + or die $!; + + while () { + + /\[\s*(\d+)\]\s+(\.\S+)/ or next; + my $sec_num = $1; + my $sec_name = $2; + + # .text section doesn't have to be prepended by -s .text + if ($sec_name eq '.text') { + $text = $load_addr{$sec_num}; + next; + } + + $sections .= " -s $sec_name $load_addr{$sec_num}" + if ($load_addr{$sec_num} and $load_addr{$sec_num} ne '0x0'); + }; + close (READELF); + print " $text $sections\n"; +}