grub/grub-core/gdb_grub.in
Glenn Washburn 99ccf5b245 gdb: Conditionally run GDB script logic for dynamically or statically positioned GRUB
There are broadly two classes of targets to consider when loading symbols
for GRUB, targets that determine where to load GRUB at runtime
(dynamically positioned) and those that do not (statically positioned).
For statically positioned targets, symbol loading is determined at link
time, so nothing more needs to be known to load the symbols. For
dynamically positioned targets, such as EFI targets, at runtime symbols
should be offset by an amount that depends on where the runtime chose to
load GRUB.

It is important to not load symbols statically for dynamic targets
because then when subsequently loading the symbols correctly one must
take care to remove the existing static symbols, otherwise there will be
two sets of symbols and GDB seems to prefer the ones loaded first (i.e.
the static ones).

Use autoconf variables to generate a gdb_grub for a particular target,
which conditionally run startup code depending on if the target uses
static or dynamic loading.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2023-03-14 15:35:23 +01:00

106 lines
2.4 KiB
Plaintext

###
### Load debuging information about GNU GRUB 2 modules into GDB
### automatically. Needs readelf, Perl and gmodule.pl script
###
### Has to be launched from the writable and trusted
### directory containing *.image and *.module
###
### $Id: .gdbinit,v 1.1 2006/05/14 11:38:08 lkundrak Exp $
### Lubomir Kundrak <lkudrak@skosi.org>
###
# Add section numbers and addresses to .segments.tmp
define dump_module_sections_helper
set $mod = $arg0
printf "%s", $mod->name
set $segment = $mod->segment
while ($segment)
printf " %i 0x%lx", $segment->section, $segment->addr
set $segment = $segment->next
end
printf "\n"
end
define dump_module_sections
# Set unlimited width so that lines don't get wrapped writing
# to .segments.tmp
with width 0 -- \
with trace-commands off -- \
pipe dump_module_sections_helper $arg0 | sh -c 'cat >>.segments.tmp'
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
shell rm -f .segments.tmp .loadsym.gdb
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
dump_module_sections $arg0
match_and_load_symbols
end
document load_module
Load debugging information for module given as argument.
end
define load_all_modules
shell rm -f .segments.tmp
set $this = grub_dl_head
while ($this != 0)
dump_module_sections $this
set $this = $this->next
end
if (grub_dl_head != 0)
match_and_load_symbols
end
end
document load_all_modules
Load debugging information for all loaded modules.
end
define runtime_load_module
break grub_dl_add
commands
silent
load_module mod
cont
end
end
document runtime_load_module
Load module symbols at runtime as they are loaded.
end
###
set confirm off
# Note: On EFI and other platforms that load GRUB to an address that is
# determined at runtime, the symbols in kernel.exec will be wrong.
# However, we must start by loading some executable file or GDB will
# fail.
set $platform_efi = $_streq("@platform@", "efi")
if $platform_efi
# Only load the executable file, not the symbols
exec-file kernel.exec
else
file kernel.exec
runtime_load_module
end
target remote :1234