]> sourceware.org Git - libabigail.git/commitdiff
ctf-reader: add support to looks for debug information to extract kABI
authorGuillermo E. Martinez <guillermo.e.martinez@oracle.com>
Fri, 8 Jul 2022 13:47:25 +0000 (08:47 -0500)
committerDodji Seketeli <dodji@redhat.com>
Mon, 11 Jul 2022 11:49:12 +0000 (13:49 +0200)
With this patch, the abidiff tool is now able to looks for CTF debug
information to extract the kABI, it uses the standard
`--debug-info-dir' option to locate `vmlinux.ctfa`, looking at first
instance in the base directory where the ELF binary (vmlinux/module)
is want to be processed.

* src/abg-ctf-reader.cc (find_ctfa_file): Add new function
meant to locate the Linux Kernel debug information file
`vmlinux.ctfa'.
(ctf_reader::read_corpus): Use `find_ctfa_file' function.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
src/abg-ctf-reader.cc

index 77e77d138a75d9bcb250cbbd3ddc997ab9c368cb..c1ea15aac63105a6f56da292e17fdf574d030cc9 100644 (file)
@@ -43,6 +43,8 @@ namespace abigail
 namespace ctf_reader
 {
 using std::dynamic_pointer_cast;
+using abigail::tools_utils::dir_name;
+using abigail::tools_utils::file_exists;
 
 class read_context
 {
@@ -1515,6 +1517,42 @@ slurp_elf_info(read_context *ctxt,
   status |= elf_reader::STATUS_OK;
 }
 
+/// Looks for vmlinux.ctfa file in default directory or in
+/// directories provided by debug-info-dir command line option,
+/// it stores location path in @ref ctfa_file.
+///
+/// @param ctxt the read context.
+/// @param ctfa_file file name found.
+/// @return true if file is found.
+static bool
+find_ctfa_file(read_context *ctxt, std::string& ctfa_file)
+{
+  std::string ctfa_dirname;
+  dir_name(ctxt->filename, ctfa_dirname, false);
+
+  // In corpus group we assume vmlinux as first file to
+  // be processed, so default location for vmlinux.cfa
+  // is vmlinux dirname.
+  ctfa_file = ctfa_dirname + "/vmlinux.ctfa";
+  if (file_exists(ctfa_file))
+    return true;
+
+  // If it's proccessing a module, then location directory
+  // for vmlinux.ctfa should be provided with --debug-info-dir
+  // option.
+  for (vector<char**>::const_iterator i = ctxt->debug_info_root_paths_.begin();
+       i != ctxt->debug_info_root_paths_.end();
+       ++i)
+    {
+      ctfa_dirname = **i;
+      ctfa_file = ctfa_dirname + "/vmlinux.ctfa";
+      if (file_exists(ctfa_file))
+        return true;
+    }
+
+  return false;
+}
+
 /// Create and return a new read context to process CTF information
 /// from a given ELF file.
 ///
@@ -1577,12 +1615,11 @@ read_corpus(read_context *ctxt, elf_reader::status &status)
   int errp;
   if (corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
     {
-      std::string filename;
-      if (tools_utils::base_name(ctxt->filename, filename)
-          && filename == "vmlinux")
+      if (ctxt->ctfa == NULL)
         {
-          std::string vmlinux_ctfa_path = ctxt->filename + ".ctfa";
-          ctxt->ctfa = ctf_arc_open(vmlinux_ctfa_path.c_str(), &errp);
+          std::string ctfa_filename;
+          if (find_ctfa_file(ctxt, ctfa_filename))
+            ctxt->ctfa = ctf_arc_open(ctfa_filename.c_str(), &errp);
         }
     }
   else
This page took 0.035353 seconds and 5 git commands to generate.