]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libdwfl: Find and handle compressed vmlinuz image.
authorMark Wielaard <mark@klomp.org>
Thu, 5 Dec 2019 14:03:54 +0000 (15:03 +0100)
committerMark Wielaard <mark@klomp.org>
Mon, 9 Dec 2019 19:20:01 +0000 (20:20 +0100)
Both the dwfl_linux_kernel_find_elf callback and the
dwfl_linux_kernel_report_offline reporting function only handled
vmlinix images possibly compressed with .gz, .bz2 or .xz extension.
They did not find or handle the much more common vmlinuz compressed
images.

It is not completely clear why we didn't up to now. Support for
compressed ELF files was added in 2009 and the code was updated to
to try to find the .gz, .bz2 or .xz extension variants in 2011.
But not the vmlinuz named variant.

Reported-by: Aaron Merey <amerey@redhat.com>
Tested-by: Frank Ch. Eigler <fche@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
libdwfl/ChangeLog
libdwfl/linux-kernel-modules.c

index b822218943aed9f85df84a6be7dea395b41b7112..b6b427d4aea6fbaa3eddda8c7fa1735221f35b2e 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-05  Mark Wielaard  <mark@klomp.org>
+
+       * linux-kernel-modules.c (find_kernel_elf): Also try to find
+       vmlinux image.
+
 2019-10-28  Aaron Merey  <amerey@redhat.com>
 
        * dwfl_build_id_find_elf.c (dwfl_build_id_find_elf): Call debuginfod
index d46ab5aa1674fcace198adebe9bc77b1205c5340..48fb1ff0a32db5fe733b712e9aa29f4f92e34bc9 100644 (file)
@@ -174,6 +174,8 @@ kernel_release (void)
 static int
 find_kernel_elf (Dwfl *dwfl, const char *release, char **fname)
 {
+  /* First try to find an uncompressed vmlinux image.  Possibly
+     including debuginfo.  */
   if ((release[0] == '/'
        ? asprintf (fname, "%s/vmlinux", release)
        : asprintf (fname, "/boot/vmlinux-%s", release)) < 0)
@@ -188,6 +190,27 @@ find_kernel_elf (Dwfl *dwfl, const char *release, char **fname)
       fd = try_kernel_name (dwfl, fname, true);
     }
 
+  /* There might be a compressed vmlinuz image.  Probably without
+     debuginfo, but try to find it under the debug path also, just in
+     case.  */
+  if (fd < 0)
+    {
+      free (*fname);
+      if ((release[0] == '/'
+           ? asprintf (fname, "%s/vmlinuz", release)
+           : asprintf (fname, "/boot/vmlinuz-%s", release)) < 0)
+        return -1;
+
+      fd = try_kernel_name (dwfl, fname, true);
+      if (fd < 0 && release[0] != '/')
+       {
+         free (*fname);
+         if (asprintf (fname, MODULEDIRFMT "/vmlinuz", release) < 0)
+           return -1;
+         fd = try_kernel_name (dwfl, fname, true);
+       }
+    }
+
   return fd;
 }