]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Fix executable_for_core for non-dwfl_standard_argp
authorJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 30 Oct 2013 09:48:20 +0000 (10:48 +0100)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 30 Oct 2013 09:48:20 +0000 (10:48 +0100)
./
2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>

* NEWS (Version 0.158): New.

libdw/
2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>

* libdw.map (ELFUTILS_0.158): New.

libdwfl/
2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>

* argp-std.c (parse_opt): Use executable parameter of
dwfl_core_file_report.
* core-file.c (dwfl_core_file_report): Add parameter executable.  Set
it to DWFL.  Add NEW_VERSION for it.
(_compat_without_executable_dwfl_core_file_report): New.  Twice.
* libdwfl.h (dwfl_core_file_report): Add parameter executable, update
the function comment.

Signed-off-by: Jan Kratochvil <jan.kratochvil@redhat.com>
ChangeLog
NEWS
libdw/ChangeLog
libdw/libdw.map
libdwfl/ChangeLog
libdwfl/argp-std.c
libdwfl/core-file.c
libdwfl/libdwfl.h

index 0b626eea72b56cabbe59df87126f4c98c3ecbfa3..433450d3ca08afb7c1bd4f3f642046a73e1b85a8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * NEWS (Version 0.158): New.
+
 2013-09-30  Mark Wielaard  <mjw@redhat.com>
 
        * NEWS: Update for readelf NT_SIGINFO and NT_FILE core notes.
diff --git a/NEWS b/NEWS
index 7236f66193e16ef789fbaf24e4f322634f0d91bb..9d73f0968fcbf07b29a379f5dc47015d9a054a49 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+Version 0.158
+
+libdwfl: dwfl_core_file_report has new parameter executable.
+
 Version 0.157
 
 libdw: Add new functions dwarf_getlocations, dwarf_getlocation_attr
index 1bf1de90bced6a1dc96bc6ebc1fd32b876643f51..3fa6c0eff55c8432e4c9341de22566a6f281e1de 100644 (file)
@@ -1,3 +1,7 @@
+2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * libdw.map (ELFUTILS_0.158): New.
+
 2013-10-10  Mark Wielaard  <mjw@redhat.com>
 
        * dwarf_getfuncs.c (struct visitor_info): Rename start_offset to
index 09eae6a7bea8f6cd9a933082b82fab23c7211f4a..5fb6660ee25d5c14ca7cf72b1c812212aa6da4f2 100644 (file)
@@ -267,3 +267,9 @@ ELFUTILS_0.157 {
     dwarf_getlocation_die;
     dwarf_getlocation_attr;
 } ELFUTILS_0.156;
+
+ELFUTILS_0.158 {
+  global:
+    # Replaced ELFUTILS_0.146 version, which has a wrapper without executable.
+    dwfl_core_file_report;
+} ELFUTILS_0.157;
index b6729c77df98e410d01843943f519d997c80a494..9581909e7de05e0d09e57be130236f1390a6bdca 100644 (file)
@@ -1,3 +1,13 @@
+2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * argp-std.c (parse_opt): Use executable parameter of
+       dwfl_core_file_report.
+       * core-file.c (dwfl_core_file_report): Add parameter executable.  Set
+       it to DWFL.  Add NEW_VERSION for it.
+       (_compat_without_executable_dwfl_core_file_report): New.  Twice.
+       * libdwfl.h (dwfl_core_file_report): Add parameter executable, update
+       the function comment.
+
 2013-10-15  Mark Wielaard  <mjw@redhat.com>
 
        * linux-proc-maps.c (proc_maps_report): Ignore non-absolute file
index c8843909a3788d9604f5296ed2da48036eb07ba9..322cdf491f1c4ef4bdd2d73705babee74cd61913 100644 (file)
@@ -295,9 +295,6 @@ parse_opt (int key, char *arg, struct argp_state *state)
 
        if (opt->core)
          {
-           if (opt->e)
-             dwfl->executable_for_core = strdup (opt->e);
-
            int fd = open64 (opt->core, O_RDONLY);
            if (fd < 0)
              {
@@ -317,7 +314,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
                return error == DWFL_E_ERRNO ? errno : EIO;
              }
 
-           int result = INTUSE(dwfl_core_file_report) (dwfl, core);
+           int result = INTUSE(dwfl_core_file_report) (dwfl, core, opt->e);
            if (result < 0)
              {
                elf_end (core);
index 72075913ce475571c57e4067998e5b91b0ab6e89..37613b838ca2fc22edad3cd06860a8f7b93033bb 100644 (file)
@@ -398,7 +398,7 @@ clear_r_debug_info (struct r_debug_info *r_debug_info)
 }
 
 int
-dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
+dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable)
 {
   size_t phnum;
   if (unlikely (elf_getphdrnum (elf, &phnum) != 0))
@@ -407,6 +407,19 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
       return -1;
     }
 
+  free (dwfl->executable_for_core);
+  if (executable == NULL)
+    dwfl->executable_for_core = NULL;
+  else
+    {
+      dwfl->executable_for_core = strdup (executable);
+      if (dwfl->executable_for_core == NULL)
+       {
+         __libdwfl_seterrno (DWFL_E_NOMEM);
+         return -1;
+       }
+    }
+
   /* First report each PT_LOAD segment.  */
   GElf_Phdr notes_phdr;
   int ndx = dwfl_report_core_segments (dwfl, elf, phnum, &notes_phdr);
@@ -524,3 +537,16 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
   return sniffed || listed >= 0 ? listed + sniffed : listed;
 }
 INTDEF (dwfl_core_file_report)
+NEW_VERSION (dwfl_core_file_report, ELFUTILS_0.158)
+
+#ifdef SHARED
+int _compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf);
+COMPAT_VERSION_NEWPROTO (dwfl_core_file_report, ELFUTILS_0.146,
+                        without_executable)
+
+int
+_compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
+{
+  return dwfl_core_file_report (dwfl, elf, NULL);
+}
+#endif
index 2b70e2845a6071f5773387f4832bf33a4596b88e..2ba823434c6d523075d7ac63fc43e2953d7562ed 100644 (file)
@@ -349,11 +349,13 @@ extern int dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
    This can follow a dwfl_report_offline call to bootstrap the
    DT_DEBUG method of following the dynamic linker link_map chain, in
    case the core file does not contain enough of the executable's text
-   segment to locate its PT_DYNAMIC in the dump.  This might call
-   dwfl_report_elf on file names found in the dump if reading some
-   link_map files is the only way to ascertain those modules' addresses.
+   segment to locate its PT_DYNAMIC in the dump.  In such case you need to
+   supply non-NULL EXECUTABLE, otherwise dynamic libraries will not be loaded
+   into the DWFL map.  This might call dwfl_report_elf on file names found in
+   the dump if reading some link_map files is the only way to ascertain those
+   modules' addresses.
    Returns the number of modules reported, or -1 for errors.  */
-extern int dwfl_core_file_report (Dwfl *dwfl, Elf *elf);
+extern int dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable);
 
 /* Call dwfl_report_module for each file mapped into the address space of PID.
    Returns zero on success, -1 if dwfl_report_module failed,