Add is_executable to Dwfl_Module.
authorJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 9 Sep 2014 20:58:26 +0000 (22:58 +0200)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 18 Sep 2014 16:20:36 +0000 (18:20 +0200)
Next patch will find module names from NT_FILE note so that main executable
will no longer necessarily have the name "[exe]" or "[pie]".
-e|--executable still should be able to override such module.

libdwfl/
2014-09-18  Jan Kratochvil  <jan.kratochvil@redhat.com>

* dwfl_build_id_find_elf.c (dwfl_build_id_find_elf): Use IS_EXECUTABLE.
* dwfl_segment_report_module.c (dwfl_segment_report_module): Set
IS_EXECUTABLE.
* libdwflP.h (struct Dwfl_Module): New field is_executable.

Signed-off-by: Jan Kratochvil <jan.kratochvil@redhat.com>
libdwfl/ChangeLog
libdwfl/dwfl_build_id_find_elf.c
libdwfl/dwfl_segment_report_module.c
libdwfl/libdwflP.h

index 3de772e..bfbc1f7 100644 (file)
@@ -1,3 +1,10 @@
+2014-09-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_build_id_find_elf.c (dwfl_build_id_find_elf): Use IS_EXECUTABLE.
+       * dwfl_segment_report_module.c (dwfl_segment_report_module): Set
+       IS_EXECUTABLE.
+       * libdwflP.h (struct Dwfl_Module): New field is_executable.
+
 2014-08-28  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * dwfl_module_getdwarf.c (find_offsets): Add parameter main_bias, use
index 1555008..062aad1 100644 (file)
@@ -124,13 +124,12 @@ dwfl_build_id_find_elf (Dwfl_Module *mod,
                        char **file_name, Elf **elfp)
 {
   *elfp = NULL;
-  if (modname != NULL && mod->dwfl->executable_for_core != NULL
-      && (strcmp (modname, "[exe]") == 0 || strcmp (modname, "[pie]") == 0))
+  if (mod->is_executable && mod->dwfl->executable_for_core != NULL)
     {
       /* When dwfl_core_file_report was called with a non-NULL executable file
         name this callback will replace the Dwfl_Module main.name with the
-        recorded executable file when the modname is [exe] or [pie] (which
-        then triggers opening and reporting of the executable).  */
+        recorded executable file when MOD was identified as main executable
+        (which then triggers opening and reporting of the executable).  */
       int fd = open64 (mod->dwfl->executable_for_core, O_RDONLY);
       if (fd >= 0)
        {
index dfecb51..3393b08 100644 (file)
@@ -646,6 +646,12 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
 
   Dwfl_Module *mod = INTUSE(dwfl_report_module) (dwfl, name,
                                                 module_start, module_end);
+
+  // !execlike && ET_EXEC is PIE.
+  // execlike && !ET_EXEC is a static executable.
+  if (mod != NULL && (execlike || ehdr.e32.e_type == ET_EXEC))
+    mod->is_executable = true;
+
   if (likely (mod != NULL) && build_id != NULL
       && unlikely (INTUSE(dwfl_module_report_build_id) (mod,
                                                        build_id,
index 30c0f8a..735b920 100644 (file)
@@ -211,6 +211,7 @@ struct Dwfl_Module
 
   int segment;                 /* Index of first segment table entry.  */
   bool gc;                     /* Mark/sweep flag.  */
+  bool is_executable;          /* Use Dwfl::executable_for_core?  */
 };
 
 /* This holds information common for all the threads/tasks/TIDs of one process