grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v4 07/15] gdb: Remove Perl dependency for GRUB GDB script


From: Glenn Washburn
Subject: [PATCH v4 07/15] gdb: Remove Perl dependency for GRUB GDB script
Date: Thu, 15 Dec 2022 23:29:30 -0600

Remove gmodule.pl and rewrite as a shell function in gdb_helper.sh.

Signed-off-by: Glenn Washburn <development@efficientek.com>
---
 grub-core/Makefile.core.def |  6 ------
 grub-core/gdb_grub.in       |  4 ++--
 grub-core/gdb_helper.sh.in  | 41 +++++++++++++++++++++++++++++++++++++
 grub-core/gmodule.pl.in     | 30 ---------------------------
 4 files changed, 43 insertions(+), 38 deletions(-)
 delete mode 100644 grub-core/gmodule.pl.in

diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index 253b9b1e47..c5feae285c 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -18,12 +18,6 @@ transform_data = {
   common = modinfo.sh.in;
 };
 
-transform_data = {
-  installdir = platform;
-  name = gmodule.pl;
-  common = gmodule.pl.in;
-};
-
 transform_data = {
   installdir = platform;
   name = gdb_helper.sh;
diff --git a/grub-core/gdb_grub.in b/grub-core/gdb_grub.in
index d97dbfdc0d..f901975e15 100644
--- a/grub-core/gdb_grub.in
+++ b/grub-core/gdb_grub.in
@@ -1,6 +1,6 @@
 ###
 ### Load debuging information about GNU GRUB 2 modules into GDB
-### automatically. Needs readelf, Perl and gmodule.pl script
+### automatically. Needs readelf, objdump and gdb_helper.sh script
 ###
 ### Has to be launched from the writable and trusted
 ### directory containing *.image and *.module
@@ -63,7 +63,7 @@ end
 # Generate and execute GDB commands and delete temporary files
 # afterwards
 define match_and_load_symbols
-       shell perl gmodule.pl <.segments.tmp >.loadsym.gdb
+       shell sh gdb_helper.sh gen_module_loadsym <.segments.tmp >.loadsym.gdb
        source .loadsym.gdb
        shell rm -f .segments.tmp .loadsym.gdb
 end
diff --git a/grub-core/gdb_helper.sh.in b/grub-core/gdb_helper.sh.in
index b37d5adfc2..1eaa976fb7 100644
--- a/grub-core/gdb_helper.sh.in
+++ b/grub-core/gdb_helper.sh.in
@@ -21,6 +21,21 @@ exp() {
   echo $RES
 }
 
+get_section_names() {
+  readelf -SW "$1" | tail -n +5 | \
+    while read LINE; do
+      LINE=${LINE#*\[??*\] }
+      NAME=${LINE%% *}
+      echo -n "${NAME:-<NULL>} "
+    done
+}
+
+get_word() {
+  i=$2
+  ( set -- $1; eval echo "\${$i}"; )
+}
+
+
 # Loading symbols is complicated by the fact that kernel.exec is an ELF
 # ELF binary, but the UEFI runtime is PE32+. All the data sections of
 # the ELF binary are concatenated (accounting for ELF section alignment)
@@ -50,6 +65,32 @@ gen_kernel_exec_loadsym() {
     done
 }
 
+# Generate GDB commands, that load symbols for specified modules from stdin,
+# with proper section relocations.
+gen_module_loadsym() {
+  while read NAME SECTIONMAP; do
+    echo -n "add-symbol-file $NAME.module"
+    (
+      SECNAMES=$(get_section_names "$NAME.mod")
+
+      set -- $SECTIONMAP
+      while [ "$#" -gt 0 ]; do
+       SECIDX=$1
+       SECADDR=$2
+       SECNAME=$(get_word "$SECNAMES" $((${SECIDX}+1)))
+       shift; shift
+
+       if [ "$SECNAME" = ".text" ]; then
+         echo -n " ${SECADDR}"
+       else
+         echo -n " -s ${SECNAME} ${SECADDR}"
+       fi
+      done
+    )
+    echo
+  done
+}
+
 if type "$1" 2>/dev/null | grep -q 'is a shell function'; then
   if [ "x${GRUB_GDB_TRACE}" = "xy" ]; then
     exec 2>>gdb_helper.trace
diff --git a/grub-core/gmodule.pl.in b/grub-core/gmodule.pl.in
deleted file mode 100644
index 78aa1e64eb..0000000000
--- a/grub-core/gmodule.pl.in
+++ /dev/null
@@ -1,30 +0,0 @@
-###
-### Generate GDB commands, that load symbols for specified module,
-### with proper section relocations. See .gdbinit
-###
-### $Id: gmodule.pl,v 1.2 2006/05/14 11:38:42 lkundrak Exp lkundrak $
-### Lubomir Kundrak <lkudrak@skosi.org>
-###
-
-use strict;
-
-while (<>) {
-       my ($name, %sections) = split;
-
-       print "add-symbol-file $name.module";
-
-       open (READELF, "readelf -S $name.mod |") or die;
-       while (<READELF>) {
-               /\[\s*(\d+)\]\s+(\.\S+)/ or next;
-
-               if ($2 eq '.text') {
-                       print " $sections{$1}";
-                       next;
-               }
-
-               print " -s $2 $sections{$1}"
-                       if ($sections{$1} ne '0x0' and $sections{$1} ne '');
-       };
-       close (READELF);
-       print "\n";
-}
-- 
2.34.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]