Fix an issue where the command load_module is being run multiple times. This happens because grub_dl_add can get called multiple times by GRUB (eg. a user runs "insmod <module>" multple times). This causes the symbols to get added multiple times. Instead, first check if the modules has already been loaded, and not run load_module in the automatic runtime module symbols loader command, runtime_load_module, if it has. This is done using the new GDB command get_module which traverses the loaded module list checking if a given string matches the each module name. It returns the address of the module if found in the $ret GDB variable, otherwise NULL.
Also add new GDB command num_modules that sets the variable $ret to the number of modules loaded. Signed-off-by: Glenn Washburn <developm...@efficientek.com> --- grub-core/gdb_grub.in | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/grub-core/gdb_grub.in b/grub-core/gdb_grub.in index 78219ea36..521e3ae6c 100644 --- a/grub-core/gdb_grub.in +++ b/grub-core/gdb_grub.in @@ -82,7 +82,10 @@ define runtime_load_module commands silent fr 1 - load_module mod + get_module mod->name + if ($ret == 0) + load_module mod + end cont end cont @@ -92,6 +95,30 @@ document runtime_load_module Load module symbols at runtime as they are loaded. end +define get_module + set $this = grub_dl_head + while ($this != 0 && grub_strcmp($this->name, $arg0)) + set $this = $this->next + end + set $ret = $this +end +document get_module + Given a module name print its address or NULL if not loaded. +end + +define num_modules + set $this = grub_dl_head + set $i = 0 + while ($this != 0) + set $i = $i + 1 + set $this = $this->next + end + set $ret = $this +end +document num_modules + Given a module name print its address or NULL if not loaded. +end + ### set confirm off -- 2.34.1 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel